Thursday, October 14, 2010

Creating dynamic tables in R/3 4.6C

Creating dynamic tables in R/3 4.6C



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.


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 :   &lttbl_output> TYPE STANDARD TABLE,
                    &ltwa_output>  TYPE ANY.

  DATA: new_line  TYPE REF TO data,  " dereference &ltfs>
        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 &ltwa_output>.

* create table-> fill catalog
  ref_descr ?= cl_abap_typedescr=>describe_by_data( &ltwa_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 &lttbl_output>.

* Return
  ctbl_alv_fieldcat[] = ct_fieldcat[].   " ALV use
  ctbl_dyn_catalog[]  = it_fieldcat[].   " create_dynamic_table reuse
* dyn_table[] = &lttbl_output>.  " generates a dump, &ltfs> not assigned
* dyn_wa = &ltwa_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 : &lttbl> TYPE STANDARD TABLE,
                &ltwa>  TYPE ANY.

*--------------
* D A T A
*--------------
DATA: new_line  TYPE REF TO data,  " dereference &ltfs>
      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 &lttb>.
  ASSIGN new_line->* TO &ltwa>.
 

Article source: 
http://searchsap.techtarget.com/tip/Creating-dynamic-tables-in-R-3-46C

No comments:

Post a Comment