繁体   English   中英

Field-Symbols之间的无损分配

[英]Lossless assignment between Field-Symbols

我目前正在尝试在ABAP 7.0v SP26环境中执行动态无损分配。

背景:

我想在csv文件中读取并将其移动到内部结构中而不会丢失任何数据。 因此,我宣布了字段符号:

  • <lfs_field> TYPE any表示结构组件
  • <lfs_element> TYPE string包含csv值的<lfs_element> TYPE string

做法:

我当前的“解决方案”就是这个( lo_field<lfs_field>的元素描述):

IF STRLEN( <lfs_element> ) > lo_field->output_length.
    RAISE EXCEPTION TYPE cx_sy_conversion_data_loss.
ENDIF.

我不知道它是如何工作的,但似乎抓住了最明显的案例。


尝试:

MOVE EXACT <lfs_field> TO <lfs_element>.

...给我...

无法解释“确切”。 可能的原因:拼写错误或逗号错误

...而...

COMPUTE EXACT <lfs_field> = <lfs_element>.

...结果是...

不正确的陈述:“=”缺失。

由于ABAP版本太旧我也不能使用EXACT #( ... )


例:

在这种情况下,我使用的是常规变量。 让我们假装他们是字段符号:

DATA: lw_element TYPE string VALUE '10121212212.1256',
      lw_field   TYPE p DECIMALS 2.
lw_field = lw_element.

* lw_field now contains 10121212212.13 without any notice about the precision loss

那么,我如何使用字段符号进行完美有效的无损分配?

看不到一个简单的方法。 猜猜这就是为什么他们首先介绍了MOVE EXACT

请注意, output_length不是一个干净的解决方案。 例如, string总是有output_length 0,但当然能够保存带有output_length 3的CHAR3。

如何解决您的问题的三个想法:

  1. 解析和比较类型。 解析源字段以检测格式和长度,例如“字符式”,“60个位置”。 然后获取目标字段的元素描述符,并检查源是否适合目标。 不要认为在这里开始收集可能很大的CASE是有意义的。 如果您可以访问较新的ABAP,则可以尝试在其中生成大型测试数据集,并使用它来对MOVE EXACT的兼容性规则进行反向工程。

  2. 来回转换。 将值从源移动到目标并返回,然后查看它是否更改。 如果更改,则字段不兼容。 这是不确定的,因为一些格式会改变,尽管价值保持不变; 例如, -42可以更改为42- ,尽管这在ABAP中是相同的。

  3. 转换时间更长。 将字段从源移动到目标。 然后构建一个稍长的目标版本,并在那里移动源代码。 如果两个目标相同,则字段是兼容的。 这在边界处失败,即,如果不可能构造稍长的版本,例如因为达到了P字段的最大小数位数。

     DATA target TYPE char3. DATA source TYPE string VALUE `123.5`. DATA(lo_target) = CAST cl_abap_elemdescr( cl_abap_elemdescr=>describe_by_data( target ) ). DATA(lo_longer) = cl_abap_elemdescr=>get_by_kind( p_type_kind = lo_target->type_kind p_length = lo_target->length + 1 p_decimals = lo_target->decimals + 1 ). DATA lv_longer TYPE REF TO data. CREATE DATA lv_longer TYPE HANDLE lo_longer. ASSIGN lv_longer->* TO FIELD-SYMBOL(<longer>). <longer> = source. target = source. IF <longer> = target. WRITE `Fits`. ELSE. WRITE `Doesn't fit, ` && target && ` is different from ` && <longer>. ENDIF. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM