CASTING TYPE
構成をこのタスクに使用できます。ここでRTTSに基づいて試料溶液である:
FIELD-SYMBOLS <table> TYPE any.
DATA: fieldtab LIKE TABLE OF dfies,
r_type_struct TYPE REF TO cl_abap_structdescr,
handle TYPE REF TO data.
DATA: lref_struct TYPE REF TO cl_abap_structdescr,
lref_table TYPE REF TO cl_abap_tabledescr.
DATA: lit_component_table TYPE cl_abap_structdescr=>component_table,
lwa_component_table LIKE LINE OF lit_component_table.
SELECT DISTINCT *
FROM cdpos
INTO TABLE @DATA(t_cdpos)
UP TO 100 ROWS.
* looping original table
LOOP AT t_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
* get key fields of table
CALL FUNCTION 'GET_KEY_FIELDS_OF_TABLE'
EXPORTING
tabname = <fs_cdpos>-tabname
mandt_needed = 'X'
TABLES
key_fieldtab = fieldtab.
* get table structure
lref_struct ?= cl_abap_structdescr=>describe_by_name(<fs_cdpos>-tabname).
lit_component_table = lref_struct->get_components().
* remove non-key fields
LOOP AT lit_component_table ASSIGNING FIELD-SYMBOL(<fs_struct>).
READ TABLE fieldtab WITH KEY fieldname = <fs_struct>-name TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
DELETE lit_component_table.
ENDIF.
ENDLOOP.
* create key fields type handle
TRY.
r_type_struct = cl_abap_structdescr=>create(lit_component_table).
CATCH cx_sy_struct_creation .
ENDTRY.
* create key type
CREATE DATA handle TYPE HANDLE r_type_struct.
ASSIGN handle->* TO <table>.
* assigning final key structure
ASSIGN <fs_cdpos>-tabkey TO <table> CASTING TYPE HANDLE r_type_struct.
ENDLOOP.
UPD: 1は、事前にそのタイプを知ることができないように、結果の構造に対処についてのOPの質問に関するどのような、1は、(WERKSのような)名前でそのコンポーネントを扱うことができません、それは動的に変化する。あなたは、キーフィールドを移動したい
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.
:
別の、より堅牢なバリアントは型ハンドルのすべてのフィールドに
components[]
テーブルが含まれているr_type_struct
を使用する:あなたは、どちらかのアクセス構造のコンポーネントと同様にすべき? –@lausekはい、キーフィールドを構造体の形式に分解する必要があります.tabnameは動的に変更されるため、オフセットはお勧めしません。 –