Abap 字段符号之间的无损分配

Abap 字段符号之间的无损分配,abap,Abap,我目前正在尝试在ABAP 7.0v SP26环境中执行动态无损分配 背景: 我想读取csv文件并将其移动到内部结构中,而不会丢失任何数据。因此,我声明字段符号: 键入表示结构构件的任何 键入保存csv值的字符串 方法: MOVE EXACT <lfs_field> TO <lfs_element>. 我当前的“解决方案”是(lou字段是的元素描述): 那么,我如何用字段符号完成一个完美有效的无损赋值呢?没有一个简单的方法可以解决这个问题。我猜这就是为什么他们首先引入

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

背景:

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

  • 键入表示结构构件的任何
  • 键入保存csv值的字符串
方法:

MOVE EXACT <lfs_field> TO <lfs_element>.
我当前的“解决方案”是(
lou字段
的元素描述):


那么,我如何用字段符号完成一个完美有效的无损赋值呢?

没有一个简单的方法可以解决这个问题。我猜这就是为什么他们首先引入了
MOVE-EXACT

请注意,
output\u length
不是干净的解决方案。例如,
string
的输出长度始终为0,但当然能够保存输出长度为3的CHAR3

三个你如何回答问题的想法:

  • 解析和比较类型。解析源字段以检测格式和长度,例如“类似字符”、“60个位置”。然后获取目标字段的元素描述符,并检查源是否适合目标。在这里开始收集可能很大的
    案例是没有意义的。如果您有权访问较新的ABAP,您可以尝试在那里生成一个大型测试数据集,并使用它从
    MOVE-EXACT
    反向工程兼容性规则

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

  • 到更长的转换时间。将字段从源移动到目标。然后构造一个稍微长一点的目标版本,并将源代码也移到那里。如果两个目标相同,则字段是兼容的。如果无法构建稍长的版本(例如,因为已达到
    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.
    
    数据目标类型char3。
    数据源类型字符串值`123.5`。
    数据(lo_target)=按数据(target)进行转换(cl_abap_elemdescr=>Description_)。
    数据(lo_longer)=cl_abap_elemdescr=>get_by_kind(
    p_类型_种类=低_目标->类型_种类
    p_长度=低目标->长度+1
    小数点=低目标->小数点+1)。
    数据lv_更长类型参考数据。
    创建数据lv_longer类型句柄lo_longer。
    将lv_longer->*分配给字段-SYMBOL()。
    =来源。
    目标=源。
    如果=目标。
    写“适合”。
    其他的
    WRITE`不适合,`&&target&&`与`&&&`不同。
    恩迪夫。
    

  • 没什么好办法。我猜这就是为什么他们首先引入了
    MOVE-EXACT

    请注意,
    output\u length
    不是干净的解决方案。例如,
    string
    的输出长度始终为0,但当然能够保存输出长度为3的CHAR3

    三个你如何回答问题的想法:

  • 解析和比较类型。解析源字段以检测格式和长度,例如“类似字符”、“60个位置”。然后获取目标字段的元素描述符,并检查源是否适合目标。在这里开始收集可能很大的
    案例是没有意义的。如果您有权访问较新的ABAP,您可以尝试在那里生成一个大型测试数据集,并使用它从
    MOVE-EXACT
    反向工程兼容性规则

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

  • 到更长的转换时间。将字段从源移动到目标。然后构造一个稍微长一点的目标版本,并将源代码也移到那里。如果两个目标相同,则字段是兼容的。如果无法构建稍长的版本(例如,因为已达到
    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.
    
    数据目标类型char3。
    数据源类型字符串值`123.5`。
    数据(lo_target)=按数据(target)进行转换(cl_abap_elemdescr=>Description_)。
    数据(lo_longer)=cl_abap_elemdescr=>get_by_kind(
    p_类型_种类=低_目标->类型_种类
    p_长度=低目标->长度+1
    小数点=低目标->小数点+1)。
    数据lv_更长类型参考数据。
    创建数据lv_longer类型句柄lo_longer。
    将lv_longer->*分配给字段-SYMBOL()。
    =来源。
    目标=源。
    如果=目标。
    写“适合”。
    其他的
    WRITE`不适合,`&&target&&`与`&&&`不同。
    恩迪夫。
    

  • 完全不相关:将不必要的冗余水平提升到最大。已经尖叫“这是一个字段符号”,并且字段符号始终是本地的…除此之外,确切的错误情况是什么?什么样的任务不能产生期望的结果?@vwegert谢谢,我会转达给你,但是做这种过时的
    表单
    -在我的公司里仍然是一种常见的做法,然后你可以在全球范围内声明它们。然而,您是对的,例如,如果目标字段是
    类型p DECIMALS 2
    ,并且我在
    中有
    101212212.1256
    。会有一个我无法真正察觉的隐式舍入。我想也许有一种方法可以弥补一般的损失,所以我不必去
    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
    
    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.