问题描述
ASSIGN COMPONENT lv_field_name OF STRUCTURE ls_structure TO <lv_data>.
IF sy-subrc = 0.
WRITE <lv_data> TO lv_field_value.
ENDIF.
问题:如果 <lv_data>
的类型为 CURR
,则 WRITE...
的结果可能是错误的。
<lv_data>
对包含货币符号(如“EUR”)的字段的引用。
在我的例子中,我们可以假设引用的货币字段具有相同的结构。
是否有一种抽象的方法来获取 <lv_data>
的引用货币值,以便我可以编写类似的内容
WRITE <lv_data> TO lv_field_value CURRENCY <lv_currency>.
我查看了类 cl_abap_typedescr
和子类,但没有发现可用于分配 <lv_currency>
的内容。
解决方法
类 cl_abap_structdescr
有一个方法 get_ddic_field_list
,它返回一个结构表 DFIES
。字段 REFTABLE
和 REFFIELD
包含相应字段的货币或单位的参考字段名称。
DATA(lo_structdescr) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( ls_structure ) ).
DATA(lt_ddic_fields) = lo_structdescr->get_ddic_field_list( ).
DATA(ls_ddic_info) = lt_ddic_fields[ fieldname = lv_field_name ].
ASSIGN COMPONENT lv_field_name OF STRUCTURE ls_structure TO FIELD-SYMBOL(<lv_data>).
ASSIGN COMPONENT ls_ddic_info-reffield OF STRUCTURE ls_structure TO FIELD-SYMBOL(<lv_currency>).
WRITE <lv_data> CURRENCY <lv_currency>.
警告:此代码假定货币字段与值字段的结构相同。这并非总是如此! ls_ddic_info-reftable
可能提到了不同的结构。在这种情况下,它会变得更加复杂。您需要找到与您的结构对应的表的条目(可能来自数据库)并从那里检索货币字段。