一、字段长度的设定
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/n/195456.html
微信扫一扫
支付宝扫一扫