如何从CDPOS表字段TABKEY中提取动态表键到结构?

时间:2017-06-12 05:42:10

标签: sap abap

我需要动态地从cdpos-tabkey获取相应的字段。比方说,我需要从tabkey获取植物,材料等。

到目前为止,我尝试使用以下代码,但在使用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>.

任何人都可以帮我解决。

2 个答案:

答案 0 :(得分:2)

您可以使用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>.

另一个更健壮的变体将使用类型句柄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.

答案 1 :(得分:1)

您可以在功能模块CHANGEDOCU_KEY_ANY2CHAR中找到组装密钥的代码。功能模块CHANGEDOCU_KEY_CHAR2ANY实现相反的操作。功能组SCD8的其他功能模块也可能相关 - 请查看内联文档。