Search code examples
abapinternal-tablesrtts

Clearing rows of dynamic internal table with empty value in one column


I am trying to remove rows that have empty values in one column segment. The table is declared dynamically so it does not have a standard type that I can use in DATA declaration like I used to do (DATA table_x TYPE BSEG). I tried to create structure based of the imported table but I receive an error:

The data object "LS_DYN_TABLE" does not have a structure and therefore does not have a component called "SEGMENT"

Is there any way to declare dynamically a structure so I can loop through a table, remove rows and pass filtered table further?

    DATA:
      dy_table          TYPE REF TO data.


    FIELD-SYMBOLS:

      <dyn_table>  TYPE STANDARD TABLE,
      <fs_segment> TYPE any.

    IF ID  = '1234'.


      me->method_that_import_desired_table( IMPORTING et_table = dy_table ).
      ASSIGN dy_table->* TO <dyn_table>.
      DATA(ls_dyn_table) = dy_table.
      LOOP AT <dyn_table> ASSIGNING FIELD-SYMBOL(<fs_row>).
        
        IF ls_dyn_table-segment IS INITIAL.
          CONTINUE.
        ENDIF.
      ENDLOOP.
    ENDIF.

Solution

  • When you loop the internal table, you have to assign the field segment dynamically and check if it has a value:

    LOOP AT <dyn_table>
         ASSIGNING FIELD-SYMBOL(<fs_row>).
      DATA(tabix) = sy-tabix. "note row index in internal table
      ASSIGN COMPONENT 'SEGMENT'
             OF STRUCTURE <fs_row>
             TO FIELD-SYMBOL(<segment>). 
      IF sy-subrc EQ 0 AND
         <segment> IS INITIAL.
        DELETE <dyn_table> INDEX tabix. "delete by row index
      ENDIF.
    ENDLOOP.