简体   繁体   English

循环遍历动态内部表

[英]Looping through a dynamic internal table

I am trying to split internal table to smaller chunks.我正在尝试将内部表拆分为更小的块。

In below example the internal table big_table is split into small tables.在下面的示例中,内部表big_table被拆分为小表。

My question is how do we get the actual data from lt_small_tables for further processing.我的问题是我们如何从 lt_small_tables 获取实际数据以进行进一步处理。

TYPES: BEGIN OF lty_line,
         column1 TYPE i,
         column2 TYPE c LENGTH 4,
       END OF lty_line.
CONSTANTS: lc_test_data_amount TYPE i VALUE 44,
           lc_split_at_amount  TYPE i VALUE 7, 
DATA: lt_big_table    TYPE STANDARD TABLE OF lty_line,
      lv_string       TYPE string,
      lt_small_tables TYPE STANDARD TABLE OF REF TO data,
      lr_small_table  TYPE REF TO data.
FIELD-SYMBOLS: <lg_target> TYPE STANDARD TABLE.

" Generate test data
DO lc_test_data_amount TIMES. 
  CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
    EXPORTING number_chars  = 4    " Specifies the number of generated chars
    IMPORTING random_string = lv_string.    " Generated string
  APPEND VALUE #( column1 = sy-index
                  column2 = CONV #( lv_string ) ) TO lt_big_table.
ENDDO.

" Split
DATA(lo_descr) = CAST cl_abap_tabledescr(
               cl_abap_typedescr=>describe_by_data( lt_big_table ) ).
LOOP AT lt_big_table ASSIGNING FIELD-SYMBOL(<ls_line>).
  IF ( sy-tabix - 1 ) MOD lc_split_at_amount = 0.
    CREATE DATA lr_small_table TYPE HANDLE lo_descr.
    ASSERT lr_small_table IS BOUND.
    APPEND lr_small_table TO lt_small_tables.
    ASSIGN lr_small_table->* TO <lg_target>.
    ASSERT <lg_target> IS ASSIGNED.
  ENDIF.
  APPEND <ls_line> TO <lg_target>.
ENDLOOP.

Thanks, Kris谢谢,克里斯

There are at least a couple of ways至少有两种方法

Solution 1: cast internal table reference into a known type, so that you can directly access its fields.解决方案1:将内部表引用转换为已知类型,以便您可以直接访问其字段。

FIELD-SYMBOLS: <fs_table> like lt_big_table.

LOOP AT lt_small_tables into lr_small_table.

  ASSIGN lr_small_table->* TO <fs_table>.
  ASSERT <fs_table> IS ASSIGNED.

  LOOP AT <fs_table> into data(ls_line).
    " do something with line
    write: / ls_line-column1, ls_line-column2.
  ENDLOOP.

ENDLOOP.

Solution 2: dynamic access to the tables fields解决方案 2:动态访问表字段

FIELD-SYMBOLS: <generic_fs_table> TYPE ANY TABLE.

LOOP AT lt_small_tables into lr_small_table.

  ASSIGN lr_small_table->* TO <generic_fs_table>.
  ASSERT sy-subrc = 0.

  LOOP AT <generic_fs_table> ASSIGNING FIELD-SYMBOL(<generic_fs_line>).

    " dinamically access to line fields
    ASSIGN COMPONENT 'COLUMN1' of STRUCTURE <generic_fs_line> to FIELD-SYMBOL(<generic_fs_field1>).
    ASSERT sy-subrc = 0.

    ASSIGN COMPONENT 'COLUMN2' of STRUCTURE <generic_fs_line> to FIELD-SYMBOL(<generic_fs_field2>).
    ASSERT sy-subrc = 0.

    " do something with component2
    write: / <generic_fs_field1>, <generic_fs_field2>.

  ENDLOOP.

ENDLOOP.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM