您的位置:

ABAP动态内表的多方面阐述

一、字段长度的设定

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 条件选取等等。这些技巧能够帮助开发人员更加灵活地应对不同的需求,提高开发效率。