如何从 CDPOS table 字段 TABKEY 中提取动态 table 密钥到结构中?
How to extract dynamic table key from CDPOS table field TABKEY into structure?
我需要从 cdpos-tabkey
动态获取相应的字段。比方说,我需要从 tabkey 中获取植物、material 等。
到目前为止,我尝试使用以下代码,但在使用 MOVE
语句时出现类型冲突错误。当我使用 ASSIGN
语句时,值的分配就像变量一样,而不是结构格式,我无法从结构中获取准确的字段。
FIELD-SYMBOLS <table> TYPE any.
DATA ls_data TYPE REF TO data.
CREATE DATA ls_data TYPE (t_cdpos-tabname).
ASSIGN ls_data->* TO <table>.
*MOVE-CORRESPONDING t_cdpos-tabkey TO <table>.
*<table> = t_cdpos-tabkey.
ASSIGN t_cdpos-tabkey to <table>.
哪位大神帮我解决一下
您可以在功能模块CHANGEDOCU_KEY_ANY2CHAR
中找到组装密钥的代码。函数模块CHANGEDOCU_KEY_CHAR2ANY
实现了相反的操作。功能组 SCD8
的其他功能模块也可能相关 - 检查内联文档。
您可以使用 CASTING TYPE
构造来完成此任务。这是基于 RTTS 的示例解决方案:
DATA: handle TYPE REF TO data,
lref_struct TYPE REF TO cl_abap_structdescr.
SELECT DISTINCT * UP TO 100 ROWS
FROM cdpos
INTO TABLE @DATA(t_cdpos)
WHERE tabname NOT LIKE '/%'.
LOOP AT t_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
lref_struct ?= cl_abap_structdescr=>describe_by_name( <fs_cdpos>-tabname ).
* get key fields
DATA(key_fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) WHERE ( keyflag NE space ) ( line ) ).
* filling key field components
DATA(key_table) = VALUE abap_component_tab( FOR ls_key IN key_fields
( name = ls_key-fieldname
type = CAST #( cl_abap_datadescr=>describe_by_name( ls_key-domname ) )
)
).
* create key fields type handle
TRY.
DATA(r_type_struct) = cl_abap_structdescr=>create( key_table ).
CATCH cx_sy_struct_creation .
ENDTRY.
* create key type
CHECK r_type_struct IS NOT INITIAL.
CREATE DATA handle TYPE HANDLE r_type_struct.
ASSIGN handle->* TO FIELD-SYMBOL(<structure>).
* assigning final key structure
ASSIGN <fs_cdpos>-tabkey TO <structure> CASTING TYPE HANDLE r_type_struct.
ENDLOOP.
UPD: 关于 OP 关于解决结果结构的问题,人们不能通过名称解决其组件(如 WERKS),因为人们无法提前知道它的类型,因为它会改变动态地。您应该访问结构组件,例如:
ASSIGN COMPONENT 1 OF STRUCTURE <table> TO <component>.
另一个更强大的变体将使用类型 handle r_type_struct
,它包含所有字段 components[]
table:
LOOP AT r_type_struct->components[] ASSIGNING FIELD-SYMBOL(<fs_comp>).
ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <table> TO <component>.
IF <COMPONENT> IS ASSIGNED.
"do smth
ENDIF.
ENDLOOP.
我需要从 cdpos-tabkey
动态获取相应的字段。比方说,我需要从 tabkey 中获取植物、material 等。
到目前为止,我尝试使用以下代码,但在使用 MOVE
语句时出现类型冲突错误。当我使用 ASSIGN
语句时,值的分配就像变量一样,而不是结构格式,我无法从结构中获取准确的字段。
FIELD-SYMBOLS <table> TYPE any.
DATA ls_data TYPE REF TO data.
CREATE DATA ls_data TYPE (t_cdpos-tabname).
ASSIGN ls_data->* TO <table>.
*MOVE-CORRESPONDING t_cdpos-tabkey TO <table>.
*<table> = t_cdpos-tabkey.
ASSIGN t_cdpos-tabkey to <table>.
哪位大神帮我解决一下
您可以在功能模块CHANGEDOCU_KEY_ANY2CHAR
中找到组装密钥的代码。函数模块CHANGEDOCU_KEY_CHAR2ANY
实现了相反的操作。功能组 SCD8
的其他功能模块也可能相关 - 检查内联文档。
您可以使用 CASTING TYPE
构造来完成此任务。这是基于 RTTS 的示例解决方案:
DATA: handle TYPE REF TO data,
lref_struct TYPE REF TO cl_abap_structdescr.
SELECT DISTINCT * UP TO 100 ROWS
FROM cdpos
INTO TABLE @DATA(t_cdpos)
WHERE tabname NOT LIKE '/%'.
LOOP AT t_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
lref_struct ?= cl_abap_structdescr=>describe_by_name( <fs_cdpos>-tabname ).
* get key fields
DATA(key_fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) WHERE ( keyflag NE space ) ( line ) ).
* filling key field components
DATA(key_table) = VALUE abap_component_tab( FOR ls_key IN key_fields
( name = ls_key-fieldname
type = CAST #( cl_abap_datadescr=>describe_by_name( ls_key-domname ) )
)
).
* create key fields type handle
TRY.
DATA(r_type_struct) = cl_abap_structdescr=>create( key_table ).
CATCH cx_sy_struct_creation .
ENDTRY.
* create key type
CHECK r_type_struct IS NOT INITIAL.
CREATE DATA handle TYPE HANDLE r_type_struct.
ASSIGN handle->* TO FIELD-SYMBOL(<structure>).
* assigning final key structure
ASSIGN <fs_cdpos>-tabkey TO <structure> CASTING TYPE HANDLE r_type_struct.
ENDLOOP.
UPD: 关于 OP 关于解决结果结构的问题,人们不能通过名称解决其组件(如 WERKS),因为人们无法提前知道它的类型,因为它会改变动态地。您应该访问结构组件,例如:
ASSIGN COMPONENT 1 OF STRUCTURE <table> TO <component>.
另一个更强大的变体将使用类型 handle r_type_struct
,它包含所有字段 components[]
table:
LOOP AT r_type_struct->components[] ASSIGNING FIELD-SYMBOL(<fs_comp>).
ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <table> TO <component>.
IF <COMPONENT> IS ASSIGNED.
"do smth
ENDIF.
ENDLOOP.