[英]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。
如何解决您的问题的三个想法:
解析和比较类型。 解析源字段以检测格式和长度,例如“字符式”,“60个位置”。 然后获取目标字段的元素描述符,并检查源是否适合目标。 不要认为在这里开始收集可能很大的CASE
是有意义的。 如果您可以访问较新的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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.