edit
REPORT zzedit NO STANDARD PAGE HEADING MESSAGE-ID 00.
TYPES: BEGIN OF itype,
line(255),
END OF itype.
DATA:g_answer,
g_prg VALUE 'Z'.
DATA itab TYPE itype OCCURS 0 WITH HEADER LINE.
PARAMETERS program LIKE trdir-name OBLIGATORY.
IF program(1) NE g_prg AND program(1) NE 'Y' AND
program(2) NE 'MZ' AND program(2) NE 'MY' AND program(2) NE 'LZ'.
MESSAGE i001(00) WITH 'CBO만 사용가능!!'.
EXIT.
ENDIF.
READ REPORT program INTO itab.
EDITOR-CALL FOR itab.
IF sy-ucomm = 'WB_SAVE' OR sy-ucomm = 'YES'.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = 'N'
textline1 = 'Do you want to save now ?'
titel = 'Save'
IMPORTING
answer = g_answer.
CHECK g_answer = 'J'.
INSERT REPORT program FROM itab.
MESSAGE s001(00) WITH 'Save OK!'.
ENDIF.
Dynamic Structure
출처 : https://archive.sap.com/discussions/thread/426726
*&---------------------------------------------------------------------* *& Report ZUS_SDN_RTTI_CREATE_STRUCTURES *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zus_sdn_rtti_create_structures. TYPE-POOLS: abap. DATA: celltab TYPE lvc_t_styl. DATA: go_table TYPE REF TO cl_salv_table, go_sdescr TYPE REF TO cl_abap_structdescr, go_tdescr TYPE REF TO cl_abap_tabledescr, gdo_data TYPE REF TO data, gdo_handle TYPE REF TO data, gs_comp TYPE abap_componentdescr, gt_components TYPE abap_component_tab. * * name TYPE string, * type TYPE REF TO cl_abap_datadescr, * as_include TYPE abap_bool, * suffix TYPE string, FIELD-SYMBOLS: <gd_fld> TYPE ANY, <gs_struc> TYPE ANY, <gt_itab> TYPE table. PARAMETER: p_tabnam TYPE tabname DEFAULT 'KNB1'. START-OF-SELECTION. * Create dynamically structure CREATE DATA gdo_data TYPE (p_tabnam). ASSIGN gdo_data->* TO <gs_struc>. CHECK ( <gs_struc$gt; IS ASSIGNED ). * Simulate dynamic addition of columns to ALV list DO 10 TIMES. ASSIGN COMPONENT syst-index OF STRUCTURE <gs_struc> TO <gd_fld>. CLEAR: gs_comp. gs_comp-type ?= cl_abap_datadescr=>describe_by_data( <gd_fld> ). gs_comp-name = gs_comp-type->get_relative_name( ). APPEND gs_comp TO gt_components. go_sdescr = cl_abap_structdescr=>create( gt_components ). go_tdescr = cl_abap_tabledescr=>create( go_sdescr ). " Create data refence followed by table creation CREATE DATA gdo_handle TYPE HANDLE go_tdescr. ASSIGN gdo_handle->* TO <gt_itab>. * Dynamic select SELECT * FROM (p_tabnam) INTO CORRESPONDING FIELDS OF TABLE <gt_itab> WHERE bukrs = '2000'. TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_table CHANGING t_table = <gt_itab>. go_table->display( ). CATCH cx_salv_msg . ENDTRY. ENDDO. " Add table type as field to structure CLEAR: gs_comp. gs_comp-type ?= cl_abap_typedescr=>describe_by_data( celltab ). gs_comp-name = 'CELLTAB'. APPEND gs_comp TO gt_components. go_sdescr = cl_abap_structdescr=>create( gt_components ). go_tdescr = cl_abap_tabledescr=>create( go_sdescr ). CREATE DATA gdo_handle TYPE HANDLE go_tdescr. ASSIGN gdo_handle->* TO <gt_itab>. * Dynamic select SELECT * FROM (p_tabnam) INTO CORRESPONDING FIELDS OF TABLE <gt_itab> WHERE bukrs = '2000'. " Simplified version of table creation: CLEAR: gdo_data. UNASSIGN <gt_itab>. CREATE DATA gdo_data TYPE (p_tabnam). ASSIGN gdo_data->* TO <gt_itab>. END-OF-SELECTION.
Creating Flat and Complex Internal Tables Dynamically using RTTI
*&---------------------------------------------------------------------* *& Report Z_RTTI_CREATE_COMPLEX_ITAB *& *&---------------------------------------------------------------------* *& NOTE: revised version of ZUS_SDN_RTTI_CREATE_STRUCTURES *& *&---------------------------------------------------------------------* REPORT Z_RTTI_CREATE_COMPLEX_ITAB. TYPE-POOLS: abap. DATA: celltab TYPE lvc_t_styl. " becomes field of complex itab DATA: gd_tabnam TYPE string, gd_tabfield TYPE string, go_table TYPE REF TO cl_salv_table, go_sdescr TYPE REF TO cl_abap_structdescr, go_sdescr_new TYPE REF TO cl_abap_structdescr, go_tdescr TYPE REF TO cl_abap_tabledescr, gdo_data TYPE REF TO data, gdo_handle TYPE REF TO data, gs_component TYPE abap_compdescr, gs_comp TYPE abap_componentdescr, gt_components TYPE abap_component_tab. FIELD-SYMBOLS: <gt_itab> TYPE STANDARD TABLE. PARAMETER: p_tabnam TYPE tabname DEFAULT 'KNB1'. START-OF-SELECTION. " Describe structure go_sdescr ?= cl_abap_structdescr=>describe_by_name( p_tabnam ). gd_tabnam = go_sdescr->get_relative_name( ). " Simulate dynamic addition of columns to ALV list DO 5 TIMES. READ TABLE go_sdescr->components INTO gs_component INDEX syst-index. " Build fieldname CONCATENATE gd_tabnam gs_component-name INTO gd_tabfield SEPARATED BY '-'. CLEAR: gs_comp. gs_comp-type ?= cl_abap_datadescr=>describe_by_name( gd_tabfield ). gs_comp-name = gs_component-name. APPEND gs_comp TO gt_components. " Create instances of dynamic structure and dynamic internal table go_sdescr_new = cl_abap_structdescr=>create( gt_components ). go_tdescr = cl_abap_tabledescr=>create( go_sdescr_new ). " Create data refence followed by table creation CREATE DATA gdo_handle TYPE HANDLE go_tdescr. " !!! ASSIGN gdo_handle->* TO <GT_ITAB>. * Dynamic select SELECT * FROM (p_tabnam) INTO CORRESPONDING FIELDS OF TABLE <GT_ITAB> WHERE bukrs = '2000'. TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_table CHANGING t_table = <GT_ITAB>. go_table->display( ). CATCH cx_salv_msg . ENDTRY. ENDDO. " Display component list in order to prove that indeed the field names " are used (instead of the data element names) TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_table CHANGING t_table = gt_components. go_table->display( ). CATCH cx_salv_msg . ENDTRY. " Add table type (LVC_T_STYL) as field to structure ==> complex structure CLEAR: gs_comp. gs_comp-type ?= cl_abap_typedescr=>describe_by_data( celltab ). gs_comp-name = 'CELLTAB'. APPEND gs_comp TO gt_components. go_sdescr = cl_abap_structdescr=>create( gt_components ). go_tdescr = cl_abap_tabledescr=>create( go_sdescr ). CREATE DATA gdo_handle TYPE HANDLE go_tdescr. ASSIGN gdo_handle->* TO <gt_itab>. * Dynamic select SELECT * FROM (p_tabnam) INTO CORRESPONDING FIELDS OF TABLE <gt_itab> WHERE bukrs = '2000'. " Show how to fill the complex itab PERFORM fill_celltab. END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FILL_CELLTAB *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM fill_celltab . * define local data DATA: ls_cell TYPE lvc_s_styl, lt_celltab TYPE lvc_t_styl. FIELD-SYMBOLS: <gs_struc> TYPE ANY, <lt_celltab> TYPE lvc_t_styl. " Create dummy entry for local CELLTAB ls_cell-fieldname = 'BUKRS'. ls_cell-style = cl_gui_alv_grid=>mc_style_enabled. INSERT ls_cell INTO TABLE lt_celltab. LOOP AT <gt_itab> ASSIGNING <gs_struc>. ASSIGN COMPONENT 'CELLTAB' OF STRUCTURE <gs_struc> TO <lt_celltab>. <lt_celltab> = lt_celltab. " No MODIFY required because we are working with the field symbol ENDLOOP. ENDFORM. " FILL_CELLTAB
