ABAP动态生成内表的三种方法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                ABAP动态生成内表的三种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            動態內表的創建和使用主要有以下幾點:
 
其中方法三最簡單。
 
1、方法一
 
   TYPE-POOLS:ABAP.
   PARAMETERS p_name TYPE tabname.
   DATA lt_table TYPE TABLE OF dfies. "字段結構表
   DATA ls_table TYPE dfies.
   DATA lr_struc TYPE REF TO cl_abap_structdescr.
   DATA lr_table TYPE REF TO cl_abap_tabledescr.
   DATA lr_type TYPE REF TO cl_abap_typedescr.
   DATA lr_data TYPE REF TO cl_abap_datadescr.
   DATA lt_comp TYPE abap_component_tab.
   DATA ls_comp LIKE LINE OF lt_comp.
   DATA dyn_wa TYPE REF TO data.
   DATA dyn_table TYPE REF TO data.
   DATA l_string TYPE string.
   FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
   <dyn_wa> TYPE ANY.
   *1.獲取表中的字段結構
   CALL FUNCTION 'DDIF_NAMETAB_GET'
   EXPORTING
   tabname = p_name
   TABLES
   dfies_tab = lt_table
   EXCEPTIONS
   not_found = 1
   OTHERS = 2.
   IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.
   
   LOOP AT lt_table INTO ls_table.
   CONCATENATE ls_table-tabname '-' ls_table-fieldname INTO l_string.
   ls_comp-name = ls_table-fieldname.
   *讀取字段類型
   CALL METHOD cl_abap_datadescr=>describe_by_name
   EXPORTING
   p_name = l_string
   RECEIVING
   p_descr_ref = lr_type
   EXCEPTIONS
   type_not_found = 1
   OTHERS = 2.
   IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.
   ls_comp-type ?= lr_type.
   APPEND ls_comp TO lt_comp.
   CLEAR ls_comp.
   ENDLOOP.
   *根據字段目錄創建動態結構類型
   CALL METHOD cl_abap_structdescr=>create
   EXPORTING
   p_components = lt_comp
   RECEIVING
   p_result = lr_struc.
   *根據動態結構創建動態內表類型
   CALL METHOD cl_abap_tabledescr=>create
   EXPORTING
   p_line_type = lr_struc
   RECEIVING
   p_result = lr_table.
   *參照動態結構類型和動態內表類型創建內表與工作區
   CREATE DATA dyn_wa TYPE HANDLE lr_struc.
   CREATE DATA dyn_table TYPE HANDLE lr_table.
   *指定內表與工作區到字段符號
   ASSIGN dyn_wa->* TO <dyn_wa>.
   ASSIGN dyn_table->* TO <dyn_table>.
   
   *從動態表中取數到動態內表中
   SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100
   ROWS FROM (p_name).
   *顯示內表中的數據
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
   i_structure_name = p_name
   TABLES
   t_outtab = <dyn_table>
   EXCEPTIONS
   program_error = 1
   OTHERS = 2.
   IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.   復制代碼
 
2、方法二
 
   TYPE-POOLS:abap.
   PARAMETERS p_name TYPE tabname.
   DATA: d_ref TYPE REF TO data,
   lt_alv_cat TYPE TABLE OF lvc_s_fcat,
   ls_alv_cat LIKE LINE OF lt_alv_cat.
   
   DATA: lt_table LIKE TABLE OF dntab.
   DATA: ls_table TYPE dntab.
   
   FIELD-SYMBOLS : <dyn_table> TYPE table,
   <dyn_wa> TYPE ANY,
   <dyn_field> TYPE ANY.
   *取出表結構的字段目錄
   CALL FUNCTION 'NAMETAB_GET'
   EXPORTING
   langu = sy-langu
   tabname = p_name
   TABLES
   nametab = lt_table
   EXCEPTIONS
   no_texts_found = 1.
   *根據取出的字段目錄生成參考字段目錄
   LOOP AT lt_table INTO ls_table.
   ls_alv_cat-fieldname = ls_table-fieldname.
   ls_alv_cat-ref_table = p_name.
   ls_alv_cat-ref_field = ls_table-fieldname.
   APPEND ls_alv_cat TO lt_alv_cat.
   CLEAR ls_alv_cat.
   ENDLOOP.
   *內表創建
   CALL METHOD cl_alv_table_create=>create_dynamic_table
   EXPORTING
   it_fieldcatalog = lt_alv_cat
   IMPORTING
   ep_table = d_ref.
   *指定生成的內表到字段符號
   ASSIGN d_ref->* TO <dyn_table>.
   *從動態表中取數到動態內表中
   SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100
   ROWS FROM (p_name).
   *顯示內表中的數據
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
   i_structure_name = p_name
   TABLES
   t_outtab = <dyn_table>
   EXCEPTIONS
   program_error = 1
   OTHERS = 2.
   IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.   復制代碼
 
3、方法三
 
   PARAMETERS p_name TYPE tabname.
   
   DATA: dyn_table TYPE REF TO data.
   DATA: dyn_wa TYPE REF TO data.
   
   FIELD-SYMBOLS: <dyn_table> TYPE table,
   <dyn_wa> TYPE ANY.
   
   *創建動態表結構
   CREATE DATA dyn_table TYPE TABLE OF (p_name).
   *創建動態內表
   ASSIGN dyn_table->* TO <dyn_table>.
   *創建動態工作區結構
   CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
   *創建動態工作區
   ASSIGN dyn_wa->* TO <dyn_wa>.
   
   *從動態表中取數到動態內表中
   SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100
   ROWS FROM (p_name).
   *對取出數據進行處理
   LOOP AT <dyn_table> assigning <dyn_wa>.
   "內表數據處理
   ENDLOOP.
   *顯示內表中的數據
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
   i_structure_name = p_name
   TABLES
   t_outtab = <dyn_table>
   EXCEPTIONS
   program_error = 1
   OTHERS = 2.
   IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.   復制代碼
與50位技術專家面對面20年技術見證,附贈技術全景圖
                            
                        
                        
                        - 動態內表的創建,首先要定義動態結構,然后再根據定義的動態結構利用系統一個標準的method:”cl_ALV_table_create=>create_dynamic_table“生成動態內表。
 - 動態內表的賦值,遍歷動態結構,獲取指定的字段,然后給指定的字段賦值。
 -  動態內表的讀取顯示,與賦值相似,遍歷動態結構,獲取指定的字段,然后讀取對應字段的值。
 
其中方法三最簡單。
1、方法一
2、方法二
3、方法三
總結
以上是生活随笔為你收集整理的ABAP动态生成内表的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 如何将结婚当作项目来管理
 - 下一篇: SM50强制终结后台JOB进程