2017-06-12 12 views
1

我需要從cdpos-tabkey動態獲取相應的字段。比如說,我需要從tabkey獲取工廠,材料等。如何將CDBOS表中的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

您想要移動的重點領域? –

+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:什麼內容是關於處理結果的結構OP的問題,由名人們不能滿足其組件(如WERKS),作爲一個不能預先其類型知道,因爲它動態變化。您應該訪問的結構組件,如:

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

另一個更強大的變種將使用板式把手r_type_struct其中包含的所有字段components[]表:

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

謝謝你的例子,如何獲得

結構的價值,例如我想從結構,當我寫-werks我得到程序喜歡數據對象「
」沒有結構,因此沒有組件調用「WERKS」。稱爲「WERKS」。 –

+0

@ArchanaPalani,請參閱解答您的問題的更新。 – Suncatcher

+0

非常感謝你這麼聰明的回答:-)它解決了我的問題,學到了新的東西:-) –

1

您可以在功能模塊CHANGEDOCU_KEY_ANY2CHAR中找到組裝密鑰的代碼。功能模塊CHANGEDOCU_KEY_CHAR2ANY執行相反的操作。功能組SCD8的其他功能模塊也可能相關 - 請檢查內聯文檔。

+0

我已經通過了功能模塊,爲了更清楚我需要顯示更改文件的工廠明智,我已經得到所有數據的唯一瓶頸是從tabkey中分離工廠和其他細節,而不使用偏移方法。 –

相關問題