메뉴 건너뛰기

SAP 한국 커뮤니티



가변 itab 관련

정군 2009.04.23 21:18 조회 수 : 62554

=====================================================


Looking for a way to create a dynamic internal table? In release WAS 620, you can, by using :
CREATE DATA new_line TYPE table of (p_tab).


This syntax was not allowed in earlier releases. The FM Y_CREATE_DYNAMIC_TABLE can help you to achieve this goal.


Code


 


FUNCTION y_create_dynamic_table.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(I_STRUCT_NAME) TYPE  DD02L-TABNAME
*"     REFERENCE(I_ALV_CLEAR_KEY) TYPE  FLAG OPTIONAL
*"  EXPORTING
*"     REFERENCE(E_TOTAL_LENGTH) TYPE  I
*"  TABLES
*"      CTBL_ALV_FIELDCAT TYPE  SLIS_T_FIELDCAT_ALV OPTIONAL
*"      CTBL_DYN_CATALOG STRUCTURE  LVC_S_FCAT OPTIONAL
*"  CHANGING
*"     REFERENCE(DYN_WA) TYPE REF TO  DATA
*"     REFERENCE(DYN_TABLE) TYPE REF TO  DATA
*"----------------------------------------------------------------------



  FIELD-SYMBOLS :   <tbl_output> TYPE STANDARD TABLE,
                    <wa_output>  TYPE ANY.


  DATA: new_line  TYPE REF TO data,  " dereference <fs>
        new_table TYPE REF TO data.


* Dynamic field description of a structure
  DATA: ref_descr TYPE REF TO cl_abap_structdescr,
        wa_comp TYPE abap_compdescr.


* cl_alv_table_create=>create_dynamic_table METHOD
  DATA: it_fieldcat TYPE lvc_t_fcat,
        is_fieldcat LIKE LINE OF it_fieldcat.
* REUSE_ALV FM
  DATA: ct_fieldcat TYPE  slis_t_fieldcat_alv,
        wa_fc LIKE LINE OF ct_fieldcat.



** create working area according to selection
  CREATE DATA new_line TYPE (i_struct_name).
  ASSIGN new_line->* TO <wa_output>.


* create table-> fill catalog
  ref_descr ?= cl_abap_typedescr=>describe_by_data( <wa_output> ).


  LOOP AT ref_descr->components INTO wa_comp.


    MOVE:
       wa_comp-name  TO is_fieldcat-fieldname,
       wa_comp-name  TO is_fieldcat-ref_field,
       i_struct_name TO is_fieldcat-ref_table.
    APPEND is_fieldcat TO it_fieldcat.
    ADD wa_comp-length TO e_total_length.
*     Catalog for REUSE_ALV_GRID_DISPLAY
    MOVE-CORRESPONDING is_fieldcat TO wa_fc.


    wa_fc-fieldname   = is_fieldcat-fieldname.
    wa_fc-fieldname   = is_fieldcat-ref_field.
    wa_fc-ref_tabname = is_fieldcat-ref_table.
*   If the key is cleared, the order of columns are not changed
    IF NOT i_alv_clear_key IS INITIAL.
      CLEAR wa_fc-key.
    ENDIF.
    APPEND wa_fc TO ct_fieldcat.
  ENDLOOP.



  CALL METHOD cl_alv_table_create=>create_dynamic_table
   EXPORTING
     it_fieldcatalog = it_fieldcat
   IMPORTING
     ep_table        = new_table.


  ASSIGN new_table->* TO <tbl_output>.


* Return
  ctbl_alv_fieldcat[] = ct_fieldcat[].   " ALV use
  ctbl_dyn_catalog[]  = it_fieldcat[].   " create_dynamic_table reuse
* dyn_table[] = <tbl_output>.  " generates a dump, <fs> not assigned
* dyn_wa = <wa_output>.        " when calling the FM
  dyn_table = new_table.
  dyn_wa = new_line.



ENDFUNCTION.


 


In the calling program:


*------------
* F I E L D ? S Y M B O L S
*------------
FIELD-SYMBOLS : <tbl> TYPE STANDARD TABLE,
                <wa>  TYPE ANY.


*--------------
* D A T A
*--------------
DATA: new_line  TYPE REF TO data,  " dereference <fs>
      new_table TYPE REF TO data.


    CALL FUNCTION 'Y_CREATE_DYNAMIC_TABLE'
         EXPORTING
              i_struct_name     = p_tab
              i_alv_clear_key   = 'X'
         TABLES
              ctbl_alv_fieldcat = ct_fieldcat
         CHANGING
              dyn_wa            = new_line
              dyn_table         = new_table.


 



* Dereference to field symbol


  ASSIGN new_table->* TO <tb>.
  ASSIGN new_line->* TO <wa>.