2017-06-12 20 views
1

対応するフィールドをcdpos-tabkeyから動的に取得する必要があります。たとえば、私はタブーから植物、材料などを取得する必要があると言う。CDPOSテーブルから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>. 

誰でも解決してください。

+0

ASSIGN COMPONENT 1 OF STRUCTURE <table> TO <component>. 

別の、より堅牢なバリアントは型ハンドルのすべてのフィールドにcomponents[]テーブルが含まれているr_type_structを使用する:あなたは、どちらかのアクセス構造のコンポーネントと同様にすべき? –

+0

@lausekはい、キーフィールドを構造体の形式に分解する必要があります.tabnameは動的に変更されるため、オフセットはお勧めしません。 –

答えて

1

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. 
+0

例えば、

構造体の値を取得する方法の例をありがとう、私は
-wwrsのようなプログラムで取得している構造体からの急激な変化を取得したいデータオブジェクト "
"は構造体を持たないため、 "WERKS" WERKSと呼ばれる。 –

+0

@ArchanaPalani、あなたの質問に答えるアップデートを見てください。 – Suncatcher

+0

そんなにスマートな答えをありがとうございました:-)それは私の問題を解決し、何か新しいことを学んだ:-) –

1

キーを組み立てるコードは、汎用モジュールCHANGEDOCU_KEY_ANY2CHARで見つけることができます。汎用モジュールCHANGEDOCU_KEY_CHAR2ANYは、逆の操作を実装します。機能グループSCD8の他の汎用モジュールも関連している可能性があります - インラインドキュメントをチェックしてください。

+0

私は機能モジュールを通過しました、私はすべてのデータの唯一のボトルネックは、オフセット方法を使用せずにタブキーから植物やその他の詳細を分離しています。 –

関連する問題