Abap 字段符号之间的无损分配
我目前正在尝试在ABAP 7.0v SP26环境中执行动态无损分配 背景: 我想读取csv文件并将其移动到内部结构中,而不会丢失任何数据。因此,我声明字段符号:Abap 字段符号之间的无损分配,abap,Abap,我目前正在尝试在ABAP 7.0v SP26环境中执行动态无损分配 背景: 我想读取csv文件并将其移动到内部结构中,而不会丢失任何数据。因此,我声明字段符号: 键入表示结构构件的任何 键入保存csv值的字符串 方法: MOVE EXACT <lfs_field> TO <lfs_element>. 我当前的“解决方案”是(lou字段是的元素描述): 那么,我如何用字段符号完成一个完美有效的无损赋值呢?没有一个简单的方法可以解决这个问题。我猜这就是为什么他们首先引入
键入表示结构构件的任何
键入保存csv值的字符串
MOVE EXACT <lfs_field> TO <lfs_element>.
我当前的“解决方案”是(lou字段
是
的元素描述):
那么,我如何用字段符号完成一个完美有效的无损赋值呢?没有一个简单的方法可以解决这个问题。我猜这就是为什么他们首先引入了
MOVE-EXACT
请注意,output\u length
不是干净的解决方案。例如,string
的输出长度始终为0,但当然能够保存输出长度为3的CHAR3
三个你如何回答问题的想法:
案例是没有意义的。如果您有权访问较新的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
三个你如何回答问题的想法:
案例是没有意义的。如果您有权访问较新的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.