一、欄位長度的設定
1、首先,我們需要了解動態內表的特點:內表結構可以在程序運行時動態創建,可以在程序運行時根據需求添加欄位,而且可以在程序運行時決定欄位的長度。
2、以下是動態內表創建和欄位長度設定的代碼實例:
TYPES: BEGIN OF ty_student, name TYPE string, END OF ty_student. DATA: wa_student TYPE ty_student, lt_student TYPE STANDARD TABLE OF ty_student. FIELD-SYMBOLS: <fs_fieldname> TYPE ANY. ASSIGN COMPONENT 'NAME' OF STRUCTURE wa_student TO <fs_fieldname>. IF sy-subrc EQ 0. ASSIGN <fs_fieldname> TO FIELD-SYMBOL(). DESCRIBE FIELD <fs_name> LENGTH DATA(lv_length). IF sy-subrc EQ 0. WRITE:/ 'FieldName:', <fs_name>, 'FieldLength:', lv_length. ENDIF. ENDIF.
二、動態內表的創建
1、動態內表的創建與靜態內表的創建有很大的不同。在運行時創建動態內表需要通過函數 module 函數動態定義結構體。在函數 module return 後,再為 ABAP 動態內表添加行。
2、以下是動態內表創建的代碼實例:
DATA: lr_type TYPE REF TO cl_abap_structdescr, lr_table TYPE REF TO data. lr_type ?= cl_abap_structdescr=>describe_by_name( 'ZDYNAMIC' ). CREATE DATA lr_table TYPE HANDLE lr_type. ASSIGN lr_table->* TO FIELD-SYMBOL().
三、ABAP內錶轉CSV文件
1、將 ABAP 內表數據存儲到 CSV 文件中是一種比較常見的操作。我們可以通過使用 GUI_DOWNLOAD 函數,將 ABAP 動態內表的數據存儲到 CSV 文件中。
2、以下是將 ABAP 動態內錶轉換為 CSV 文件的代碼實例:
DATA: lv_file TYPE string VALUE 'C:\abap.csv'. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = lv_file filetype = 'ASC' TABLES data_tab = lt_student EXCEPTIONS OTHERS = 1.
四、ABAP動態SQL
1、ABAP 動態 SQL 是指在程序運行時生成 SQL 語句,然後通過 EXEC SQL 語句來執行它。 以下是動態 SQL 調用 ABAP 動態內表的代碼實例:
DATA: lv_select TYPE string, lv_where TYPE string, lt_result TYPE STANDARD TABLE OF ty_student. lv_select = 'SELECT NAME FROM ' && 'LT_STUDENT'. lv_where = ' WHERE NAME LIKE ''M%'' '. lv_select = lv_select && lv_where. EXEC SQL. PREPARE stmt FROM :lv_select. ENDEXEC. EXEC SQL. DECLARE c CURSOR FOR stmt. ENDEXEC. EXEC SQL. OPEN c. ENDEXEC. DO. EXEC SQL. FETCH NEXT c INTO :wa_student-name. ENDEXEC. IF sy-subrc 0. EXIT. ENDIF. APPEND wa_student TO lt_result. ENDDO. EXEC SQL. CLOSE c. ENDEXEC.
五、ABAP動態語句
1、ABAP 動態語句允許我們在程序運行時創建 ABAP 語句,並且可以根據需要添加或移除變數和其他條件。以下是動態調用 ABAP 動態內表的代碼實例:
DATA: lv_fieldname TYPE string VALUE 'NAME', lv_value TYPE string VALUE 'Mary'. CONCATENATE 'lt_student-' lv_fieldname ' = ''' lv_value '''' INTO DATA(lv_code). CALL METHOD cl_abap_dyn_prg_create=>create_dyn_program EXPORTING program_name = 'ZDYNAMIC' show_errors_in_browser = abap_true EXCEPTIONS program_generation_error = 1 OTHERS = 2. DATA(lo_dynamic_program) = cl_abap_dyn_prg_create=>get_dynamic_program( program_name = 'ZDYNAMIC' ). CALL METHOD lo_dynamic_program->run EXPORTING program_name = 'ZDYNAMIC' top = '1' dynpro_number = '1000' EXCEPTIONS program_error = 1 OTHERS = 2.
六、ABAP 動態結構
1、ABAP 動態結構允許我們在程序運行時動態創建和修改結構體。以下是動態創建結構體的代碼實例:
DATA: lr_type TYPE REF TO cl_abap_structdescr, lr_field TYPE REF TO cl_abap_typedescr. lr_type = cl_abap_structdescr=>create( ). LR_FIELD = CL_ABAP_DATATYPE_DESCR=>DESCRIBE_BY_NAME( 'STRING' ). CALL METHOD lr_type->ADD_COMPONENT EXPORTING name = 'STUDENT_NAME' type = lr_field. CREATE DATA lr_table TYPE HANDLE lr_type. ASSIGN lr_table->* TO FIELD-SYMBOL().
七、ABAP動態選擇屏幕
1、通過使用 ABAP 動態選擇屏幕,我們可以讓用戶在運行時選擇需要分析的信息。以下是動態選擇屏幕的代碼實例:
DATA: lt_fields TYPE STANDARD TABLE OF dfies, lt_mask TYPE STANDARD TABLE OF dfies. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = sy-repid i_internal_tabname = 'LT_STUDENT' i_inclname = sy-repid i_bypassing_buffer = abap_true CHANGING ct_fieldcat = lt_fields EXCEPTIONS inconsistent_interface = 1 program_error = 2 internal_error = 3 OTHERS = 4. FIELD-SYMBOLS: <ls_fieldcat> TYPE dfies. LOOP AT lt_fields ASSIGNING <ls_fieldcat>. APPEND VALUE #( fieldname = <ls_fieldcat>-fieldname position = <ls_fieldcat>-position outputlen = <ls_fieldcat>-outputlen ) TO lt_mask. ENDLOOP. IF lt_mask IS NOT INITIAL. CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT' EXPORTING i_title = 'Choose Fields' iv_fieldname = 'FIELDNAME' it_mandatory_cols = lt_mask IMPORTING et_fieldname = lt_chosenfields EXCEPTIONS OTHERS = 1. ENDIF.
八、ABAP動態賦值
1、我們可以使用 ABAP 動態賦值將動態內表與其他內表進行結合。以下是動態賦值的代碼實例:
TYPES: BEGIN OF ty_student_2, name TYPE string, age TYPE i, END OF ty_student_2. DATA: lt_student_2 TYPE STANDARD TABLE OF ty_student_2, lt_student_complete TYPE STANDARD TABLE OF ty_student. FIELD-SYMBOLS: <fs_fieldname> TYPE any. LOOP AT lt_student REFERENCE INTO DATA(lr_student). CLEAR lt_student_2. DO. ASSIGN COMPONENT sy-index OF STRUCTURE lr_student->* TO <fs_fieldname>. IF sy-subrc 0. EXIT. ENDIF. APPEND <fs_fieldname> TO lt_student_2. ENDDO. APPEND lt_student_2 TO lt_student_complete. ENDLOOP.
九、ABAP 動態 where 條件選取
1、使用 ABAP 動態 where 語句,我們可以在運行時選擇符合某些條件的記錄,以便進行進一步的操作。以下是 ABAP 動態 where 條件選取的代碼實例:
DATA: lv_where TYPE string, lt_student_filtered TYPE STANDARD TABLE OF ty_student. lv_where = 'WHERE NAME LIKE ''M%'' AND AGE < 25'. REFRESH lt_student_filtered. SELECT * FROM lt_student INTO TABLE lt_student_filtered (lv_where).
總結
本文介紹了多方面的 ABAP 動態內表的特點和用法,包括欄位長度設定、動態內表創建、內錶轉 CSV,動態 SQL,動態語句,動態結構,動態選擇屏幕,動態賦值和動態 where 條件選取等等。這些技巧能夠幫助開發人員更加靈活地應對不同的需求,提高開發效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/195456.html