点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
* Author Jayanta Narayan Choudhuri * Flat 302 * 395 Jodhpur Park * Kolkata 700 068 * Email sss@cal.vsnl.net.in * URL: http://www.geocities.com/ojnc These FORMs are for people accustomed to REUSE_ALV_FIELDCATALOG_MERGE (despite the 72 ch source line limit) but not happy with LVC_FIELDCATALOG_MERGE which has NO Internal table option We do not want to crowd DDIC with too many structures! The routines handle any internal table using field name as title if not a DDIC data element. Create a Include ZJNCINCLUDE with the 2 FORMs There are two FORMs: ZJNC_DUMP_LIST will be very useful as it is simple and needs no screen and can be called any number of times. Should be very useful also for debugging esp. where Excel is not available as you can dump any internal table anytime and inspect contents. I wrote these routine mainly for debugging and the problem created by half-line long comments in internal tables. With RTTI there is no source code dependency. ZJNC_DUMP_GRID is for OO-GRID loving people who can adapt that routine for one off reports. You can call this ONLY ONCE as it is best used using a dummy selection screen - tip from SDN ABAP FAQ. As FORMs use RTTI there is no special case for Structures! ----------------------------------------------------------------------------------- *&---------------------------------------------------------------------* *& Include ZJNCINCLUDE * *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Reincarnations of REUSE_ALV_FIELDCATALOG_MERGE *&---------------------------------------------------------------------* * Author Jayanta Narayan Choudhuri * Flat 302 * 395 Jodhpur Park * Kolkata 700 068 * Email sss@cal.vsnl.net.in * URL: http://www.geocities.com/ojnc *----------------------------------------------------------------------- * These FORMs are for people accustomed to * REUSE_ALV_FIELDCATALOG_MERGE (despite the 72 ch source line limit) * but not happy with LVC_FIELDCATALOG_MERGE * We do not want to crowd DDIC with too many structures! *----------------------------------------------------------------------- *&--------------------------------------------------------------------* *& Form ZJNC_DUMP_LIST Our Good Old ALV list - RECOMMENDED! *&--------------------------------------------------------------------* FORM zjnc_dump_list USING value(p_it_name) TYPE c value(p_wa_name) TYPE c value(p_heading) TYPE c. TYPE-POOLS: slis. DATA: stru_ref TYPE REF TO cl_abap_structdescr, comp_tab TYPE abap_compdescr_tab, one_comp TYPE abap_compdescr, one_name TYPE string, type_ref TYPE REF TO cl_abap_typedescr, is_ddic TYPE abap_bool, lt_ddic TYPE dd_x031l_table, wa_ddic TYPE x031l, lt_fcat TYPE slis_t_fieldcat_alv, wa_fcat TYPE slis_fieldcat_alv, ls_layo TYPE slis_layout_alv, l_alv TYPE REF TO cl_gui_alv_grid. FIELD-SYMBOLS: <fs_type> TYPE ANY, <fs_table> TYPE STANDARD TABLE, <fs_line> TYPE ANY. ASSIGN (p_it_name) TO <fs_table>. ASSIGN (p_wa_name) TO <fs_line>. ls_layo-colwidth_optimize = 'X'. ls_layo-zebra = 'X'. ls_layo-window_titlebar = p_heading. ls_layo-box_tabname = p_it_name. stru_ref ?= cl_abap_structdescr=>describe_by_data( <fs_line> ). comp_tab = stru_ref->components. LOOP AT comp_tab INTO one_comp. CLEAR wa_fcat. wa_fcat-tabname = p_it_name. wa_fcat-fieldname = one_comp-name. CONCATENATE p_wa_name '-' one_comp-name INTO one_name. ASSIGN (one_name) TO <fs_type>. type_ref ?= cl_abap_typedescr=>describe_by_data( <fs_type> ). is_ddic = type_ref->is_ddic_type( ). IF is_ddic = abap_true. lt_ddic = type_ref->get_ddic_object( ). LOOP AT lt_ddic INTO wa_ddic. CLEAR wa_ddic-tabname. SELECT SINGLE dd03l~tabname INTO wa_ddic-tabname FROM dd03l WHERE dd03l~fieldname = wa_ddic-fieldname AND dd03l~tabname NOT LIKE '/%'. " I live in normal namespace wa_fcat-ref_tabname = wa_ddic-tabname. wa_fcat-ref_fieldname = wa_ddic-fieldname. SELECT SINGLE dd04t~scrtext_s dd04t~scrtext_m dd04t~scrtext_l INTO (wa_fcat-seltext_s, wa_fcat-seltext_m, wa_fcat-seltext_l) FROM dd04t WHERE dd04t~rollname = wa_ddic-fieldname AND dd04t~ddlanguage = sy-langu. ENDLOOP. ELSE. MOVE one_comp-name TO: wa_fcat-seltext_s, wa_fcat-seltext_m, wa_fcat-seltext_l. ENDIF. APPEND wa_fcat TO lt_fcat. ENDLOOP. CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING is_layout = ls_layo it_fieldcat = lt_fcat TABLES t_outtab = <fs_table>. ENDFORM. "ZJNC_DUMP_LIST *&--------------------------------------------------------------------* *& Form ZJNC_DUMP_GRID Object Oriented *&--------------------------------------------------------------------* FORM zjnc_dump_grid USING value(p_it_name) TYPE c value(p_wa_name) TYPE c value(p_screen) TYPE n value(p_heading) TYPE c. DATA: stru_ref TYPE REF TO cl_abap_structdescr, comp_tab TYPE abap_compdescr_tab, one_comp TYPE abap_compdescr, one_name TYPE string, type_ref TYPE REF TO cl_abap_typedescr, is_ddic TYPE abap_bool, lt_ddic TYPE dd_x031l_table, wa_ddic TYPE x031l, lt_fcat TYPE lvc_t_fcat, wa_fcat TYPE lvc_s_fcat, ls_layo TYPE lvc_s_layo, l_alv TYPE REF TO cl_gui_alv_grid. FIELD-SYMBOLS: <fs_type> TYPE ANY, <fs_table> TYPE ANY TABLE, <fs_line> TYPE ANY. ASSIGN (p_it_name) TO <fs_table>. ASSIGN (p_wa_name) TO <fs_line>. ls_layo-cwidth_opt = 'X'. ls_layo-zebra = 'X'. ls_layo-grid_title = p_heading. ls_layo-box_fname = p_it_name. stru_ref ?= cl_abap_structdescr=>describe_by_data( <fs_line> ). comp_tab = stru_ref->components. LOOP AT comp_tab INTO one_comp. CLEAR wa_fcat. wa_fcat-tabname = p_it_name. wa_fcat-fieldname = one_comp-name. CONCATENATE p_wa_name '-' one_comp-name INTO one_name. ASSIGN (one_name) TO <fs_type>. type_ref ?= cl_abap_typedescr=>describe_by_data( <fs_type> ). is_ddic = type_ref->is_ddic_type( ). IF is_ddic = abap_true. lt_ddic = type_ref->get_ddic_object( ). LOOP AT lt_ddic INTO wa_ddic. CLEAR wa_ddic-tabname. SELECT SINGLE dd03l~tabname INTO wa_ddic-tabname FROM dd03l WHERE dd03l~fieldname = wa_ddic-fieldname AND dd03l~tabname NOT LIKE '/%'. " I live in normal namespace wa_fcat-ref_table = wa_ddic-tabname. wa_fcat-ref_field = wa_ddic-fieldname. SELECT SINGLE dd04t~scrtext_s dd04t~scrtext_m dd04t~scrtext_l INTO (wa_fcat-scrtext_s, wa_fcat-scrtext_m, wa_fcat-scrtext_l) FROM dd04t WHERE dd04t~rollname = wa_ddic-fieldname AND dd04t~ddlanguage = sy-langu. ENDLOOP. ELSE. MOVE one_comp-name TO: wa_fcat-scrtext_s, wa_fcat-scrtext_m, wa_fcat-scrtext_l. ENDIF. APPEND wa_fcat TO lt_fcat. ENDLOOP. CREATE OBJECT l_alv EXPORTING i_parent = cl_gui_container=>screen0. CALL METHOD l_alv->set_table_for_first_display EXPORTING is_layout = ls_layo CHANGING it_outtab = <fs_table> it_fieldcatalog = lt_fcat. CALL SELECTION-SCREEN p_screen. ENDFORM. "ZJNC_DUMP_GRID ----------------------------------------------------------------------------------- * SAMPLE TEST PROGRAM REPORT yjnc1. INCLUDE zjncinclude. TYPES : BEGIN OF ty_pur, ebeln1 TYPE ekko-ebeln, aedat TYPE ekko-aedat, ebelp TYPE ekpo-ebelp, matnr TYPE ekpo-matnr, txz01 TYPE ekpo-txz01, menge1 TYPE ekpo-menge, belnr1 TYPE ekbe-belnr, budat1 TYPE ekbe-budat, bwart TYPE ekbe-bwart, menge2 TYPE ekbe-menge, belnr2 TYPE ekbz-belnr, budat2 TYPE ekbz-budat, menge3 TYPE ekbz-menge, dmbtr TYPE ekbz-dmbtr, buzei TYPE ekbz-buzei, jnc1 TYPE sy-datum, jnc2 TYPE i, jnc3(4) TYPE c, END OF ty_pur. DATA: it_pur TYPE STANDARD TABLE OF ty_pur, wa_pur TYPE ty_pur, rows TYPE i. * Not Recommended Style but still used! DATA: BEGIN OF it_mat OCCURS 0, jnc1 TYPE sy-datum, matnr LIKE makt-matnr, jnc2 TYPE i, maktx LIKE makt-maktx, mtart TYPE mara-mtart, jnc3(4) TYPE c, END OF it_mat. DATA: BEGIN OF it_str OCCURS 0. INCLUDE STRUCTURE makt. DATA: END OF it_str. SELECTION-SCREEN BEGIN OF SCREEN 1001. SELECTION-SCREEN END OF SCREEN 1001. START-OF-SELECTION. MOVE 100 TO rows. SELECT ekko~ebeln ekko~aedat ekpo~ebelp ekpo~matnr ekpo~txz01 ekpo~menge ekbe~belnr ekbe~budat ekbe~bwart ekbe~menge ekbz~belnr ekbz~budat ekbz~menge ekbz~dmbtr ekbz~buzei INTO TABLE it_pur UP TO rows ROWS FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln AND ekpo~loekz = ' ' INNER JOIN ekbe ON ekpo~ebeln = ekbe~ebeln AND ekpo~ebelp = ekbe~ebelp AND ekbe~bewtp = 'E' LEFT OUTER JOIN ekbz ON ekpo~ebeln = ekbz~ebeln AND ekpo~ebelp = ekbz~ebelp AND ekbz~bewtp = 'M' WHERE ekko~bstyp = 'F' AND ekko~loekz = ' ' ORDER BY ekko~ebeln ekpo~ebelp. LOOP AT it_pur INTO wa_pur. COMPUTE wa_pur-jnc1 = sy-datum - sy-tabix. MOVE sy-tabix TO wa_pur-jnc2. MOVE 'Helo' TO wa_pur-jnc3. MODIFY it_pur FROM wa_pur. ENDLOOP. * PERFORM zjnc_dump_grid USING 'IT_PUR' 'WA_PUR' 1001 'Purchase Report'. * IT_PUR is as per recommended OO style PERFORM zjnc_dump_list USING 'IT_PUR' 'WA_PUR' 'Purchase Dump'. SELECT makt~matnr makt~maktx mara~mtart INTO CORRESPONDING FIELDS OF TABLE it_mat UP TO rows ROWS FROM mara INNER JOIN makt ON makt~matnr = mara~matnr AND makt~spras = sy-langu. LOOP AT it_mat. COMPUTE it_mat-jnc1 = sy-datum - sy-tabix. MOVE sy-tabix TO it_mat-jnc2. MOVE 'Helo' TO it_mat-jnc3. MODIFY it_mat. ENDLOOP. * PERFORM zjnc_dump_grid USING 'IT_MAT[]' 'IT_MAT' 1001 'Material Dump'. * Note that IT_MAT with Header line is 2 in 1 * IT_MAT[] is the table object and IT_MAT is the header work area PERFORM zjnc_dump_list USING 'IT_MAT[]' 'IT_MAT' 'Material Dump'. SELECT * INTO TABLE it_str UP TO rows ROWS FROM makt WHERE makt~spras = sy-langu. * Note that IT_STR with Header line is 2 in 1 * IT_STR[] is the table object and IT_STR is the header work area * As FORM zjnc_dump_list uses RTTI there is no special case for Structures PERFORM zjnc_dump_list USING 'IT_STR[]' 'IT_STR' 'Structure Dump'.