Create Dynamic
Internal Table & Dynamic FIELD CATALOG
Introduction:
This document explains how to create dynamic internal table based on records and how to create filed catalog in a simple Object Oriented ALV report output.
Input Screen:
Output Screen:
Source Code:
--------------------------------------------------------------*
*& Report ZOODEM1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZOODEM1.
TABLES : BKPF,BSEG.
TYPES: BEGIN OF TS_BKPF,
BELNR TYPE BKPF-BELNR,
BUKRS TYPE BKPF-BUKRS,
GJAHR TYPE BKPF-GJAHR,
BLART TYPE BKPF-BLART,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
END OF TS_BKPF.
TYPES: BEGIN OF TS_BSEG,
BELNR TYPE BSEG-BELNR,
BUKRS TYPE BSEG-BUKRS,
GJAHR TYPE BSEG-GJAHR,
BUZEI TYPE BSEG-BUZEI,
DMBTR TYPE BSEG-DMBTR,
END OF TS_BSEG.
DATA:LV_FIELD TYPE CHAR40.
DATA : GT_BKPF TYPE TABLE OF TS_BKPF,
GT_BSEG TYPE TABLE OF TS_BSEG.
FIELD-SYMBOLS : <FT_BKPF> TYPE STANDARD TABLE,
<FS_BKPF> TYPE TS_BKPF,
<FT_BSEG> LIKE BSEG,
<FS_BSEG> TYPE TS_BSEG,
<FT_FINAL> TYPE STANDARD TABLE,
<FS_FINAL> .
DATA : ITAB_FCAT TYPE LVC_T_FCAT.
DATA : FCAT LIKE LINE OF ITAB_FCAT.
DATA : O_GRID TYPE REF TO CL_GUI_ALV_GRID,
C_ALV1 TYPE REF TO CL_GUI_ALV_GRID,
C_CONT1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: FS_DATA TYPE REF TO DATA,
DYN_LINE TYPE REF TO DATA,
DYN_LINE1 TYPE REF TO DATA.
FIELD-SYMBOLS: <FS_TAB> TYPE STANDARD TABLE,
<FS_TAB1> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY,
<FS_WA1> TYPE ANY.
DATA : GJAHR1 TYPE GJAHR,
GJAHR TYPE GJAHR,
MONT TYPE VTBBEWE-ATAGE,
MONT1 TYPE MONTH,
MONT2 TYPE MONTH,
DATE1 TYPE SY-DATUM,
DATE2 TYPE SY-DATUM,
DATE3 TYPE SY-DATUM,
LV_NAME TYPE T247-KTX.
SELECTION-SCREEN BEGIN OF BLOCK B WITH FRAME TITLE TEXT-001.
PARAMETERS : P_BUKRS TYPE BKPF-BUKRS.
SELECT-OPTIONS : S_BLDAT FOR BKPF-BLDAT.
SELECTION-SCREEN END OF BLOCK B.
DATA: GJAHR-LOW TYPE GJAHR,
GJAHR-HIGH TYPE GJAHR.
GJAHR-LOW = S_BLDAT-LOW+0(4).
GJAHR-HIGH = S_BLDAT-HIGH+0(4).
CONCATENATE GJAHR-LOW'0101' INTO DATE1.
CONCATENATE GJAHR-HIGH'1201' INTO DATE2.
PERFORM FETCH.
PERFORM DATA.
CALL SCREEN 100.
**&---------------------------------------------------------------------*
**& Module STATUS_0100 OUTPUT
**&---------------------------------------------------------------------*
**&
**&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'ZSTAT'.
CREATE OBJECT C_CONT1
EXPORTING
CONTAINER_NAME = 'CC'
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC <> 0.
ENDIF.
CREATE OBJECT C_ALV1
EXPORTING
I_PARENT = C_CONT1
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
CALL METHOD C_ALV1->SET_TABLE_FOR_FIRST_DISPLAY
CHANGING
IT_OUTTAB = <FS_TAB>
IT_FIELDCATALOG = ITAB_FCAT
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FETCH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FETCH .
SELECT BELNR
BUKRS
GJAHR
BLART
BLDAT
BUDAT FROM BKPF INTO TABLE GT_BKPF WHERE BUKRS = P_BUKRS AND BLDAT IN S_BLDAT.
SORT GT_BKPF BY BUKRS BELNR GJAHR.
IF GT_BKPF IS NOT INITIAL.
SELECT BELNR
BUKRS
GJAHR
BUZEI
DMBTR FROM BSEG INTO TABLE GT_BSEG
FOR ALL ENTRIES IN GT_BKPF WHERE BUKRS = GT_BKPF-BUKRS
AND BELNR = GT_BKPF-BELNR
AND GJAHR = GT_BKPF-GJAHR.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM DATA .
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'BUKRS'.
FCAT-SCRTEXT_L = 'Company Code'.
APPEND FCAT TO ITAB_FCAT.
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'BELNR'.
FCAT-SCRTEXT_L = 'Document Number'.
APPEND FCAT TO ITAB_FCAT.
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'GJAHR'.
FCAT-SCRTEXT_L = 'Year'.
APPEND FCAT TO ITAB_FCAT.
SORT GT_BKPF BY BLDAT.
LOOP AT GT_BKPF ASSIGNING <FS_BKPF>.
MONT2 = <FS_BKPF>-BLDAT+4(2).
GJAHR = <FS_BKPF>-BLDAT+0(4).
SELECT SINGLE KTX FROM T247 INTO LV_NAME WHERE MNR = MONT2 AND SPRAS = 'EN'.
CONCATENATE LV_NAME GJAHR INTO FCAT-FIELDNAME.
CONCATENATE LV_NAME GJAHR INTO FCAT-SCRTEXT_L.
FCAT-COL_POS = FCAT-COL_POS + 1.
APPEND FCAT TO ITAB_FCAT.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM ITAB_FCAT.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = ITAB_FCAT
IMPORTING
EP_TABLE = FS_DATA.
ASSIGN FS_DATA->* TO <FS_TAB>.
CREATE DATA DYN_LINE LIKE LINE OF <FS_TAB>.
ASSIGN DYN_LINE->* TO <FS_WA>.
SORT GT_BSEG BY BUKRS BELNR GJAHR.
SORT GT_BKPF BY BUKRS BELNR GJAHR.
LOOP AT GT_BSEG ASSIGNING <FS_BSEG>.
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-BUKRS.
UNASSIGN <FS_FINAL>.
ASSIGN COMPONENT 'BELNR' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-BELNR.
UNASSIGN <FS_FINAL>.
ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-GJAHR.
UNASSIGN <FS_FINAL>.
READ TABLE GT_BKPF ASSIGNING <FS_BKPF> WITH KEY BUKRS = <FS_BSEG>-BUKRS BELNR = <FS_BSEG>-BELNR GJAHR = <FS_BSEG>-GJAHR.
MONT2 = <FS_BKPF>-BLDAT+4(2).
SELECT SINGLE KTX FROM T247 INTO LV_NAME WHERE MNR = MONT2 AND SPRAS = 'EN'.
CONCATENATE LV_NAME <FS_BKPF>-GJAHR INTO LV_FIELD.
READ TABLE ITAB_FCAT INTO FCAT WITH KEY FIELDNAME = LV_FIELD.
ASSIGN COMPONENT FCAT-FIELDNAME OF STRUCTURE <FS_WA> TO <FS_FINAL>.
IF FCAT-FIELDNAME NE 'BUKRS' AND FCAT-FIELDNAME NE 'BELNR' AND FCAT-FIELDNAME NE 'GJAHR'.
<FS_FINAL> = <FS_BSEG>-DMBTR + <FS_FINAL>.
UNASSIGN <FS_FINAL>.
ENDIF.
AT END OF BELNR.
APPEND <FS_WA> TO <FS_TAB>.
CLEAR: <FS_WA>.
ENDAT.
ENDLOOP.
ENDFORM.
*& Report ZOODEM1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZOODEM1.
TABLES : BKPF,BSEG.
TYPES: BEGIN OF TS_BKPF,
BELNR TYPE BKPF-BELNR,
BUKRS TYPE BKPF-BUKRS,
GJAHR TYPE BKPF-GJAHR,
BLART TYPE BKPF-BLART,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
END OF TS_BKPF.
TYPES: BEGIN OF TS_BSEG,
BELNR TYPE BSEG-BELNR,
BUKRS TYPE BSEG-BUKRS,
GJAHR TYPE BSEG-GJAHR,
BUZEI TYPE BSEG-BUZEI,
DMBTR TYPE BSEG-DMBTR,
END OF TS_BSEG.
DATA:LV_FIELD TYPE CHAR40.
DATA : GT_BKPF TYPE TABLE OF TS_BKPF,
GT_BSEG TYPE TABLE OF TS_BSEG.
FIELD-SYMBOLS : <FT_BKPF> TYPE STANDARD TABLE,
<FS_BKPF> TYPE TS_BKPF,
<FT_BSEG> LIKE BSEG,
<FS_BSEG> TYPE TS_BSEG,
<FT_FINAL> TYPE STANDARD TABLE,
<FS_FINAL> .
DATA : ITAB_FCAT TYPE LVC_T_FCAT.
DATA : FCAT LIKE LINE OF ITAB_FCAT.
DATA : O_GRID TYPE REF TO CL_GUI_ALV_GRID,
C_ALV1 TYPE REF TO CL_GUI_ALV_GRID,
C_CONT1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: FS_DATA TYPE REF TO DATA,
DYN_LINE TYPE REF TO DATA,
DYN_LINE1 TYPE REF TO DATA.
FIELD-SYMBOLS: <FS_TAB> TYPE STANDARD TABLE,
<FS_TAB1> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY,
<FS_WA1> TYPE ANY.
DATA : GJAHR1 TYPE GJAHR,
GJAHR TYPE GJAHR,
MONT TYPE VTBBEWE-ATAGE,
MONT1 TYPE MONTH,
MONT2 TYPE MONTH,
DATE1 TYPE SY-DATUM,
DATE2 TYPE SY-DATUM,
DATE3 TYPE SY-DATUM,
LV_NAME TYPE T247-KTX.
SELECTION-SCREEN BEGIN OF BLOCK B WITH FRAME TITLE TEXT-001.
PARAMETERS : P_BUKRS TYPE BKPF-BUKRS.
SELECT-OPTIONS : S_BLDAT FOR BKPF-BLDAT.
SELECTION-SCREEN END OF BLOCK B.
DATA: GJAHR-LOW TYPE GJAHR,
GJAHR-HIGH TYPE GJAHR.
GJAHR-LOW = S_BLDAT-LOW+0(4).
GJAHR-HIGH = S_BLDAT-HIGH+0(4).
CONCATENATE GJAHR-LOW'0101' INTO DATE1.
CONCATENATE GJAHR-HIGH'1201' INTO DATE2.
PERFORM FETCH.
PERFORM DATA.
CALL SCREEN 100.
**&---------------------------------------------------------------------*
**& Module STATUS_0100 OUTPUT
**&---------------------------------------------------------------------*
**&
**&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'ZSTAT'.
CREATE OBJECT C_CONT1
EXPORTING
CONTAINER_NAME = 'CC'
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC <> 0.
ENDIF.
CREATE OBJECT C_ALV1
EXPORTING
I_PARENT = C_CONT1
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
CALL METHOD C_ALV1->SET_TABLE_FOR_FIRST_DISPLAY
CHANGING
IT_OUTTAB = <FS_TAB>
IT_FIELDCATALOG = ITAB_FCAT
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FETCH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FETCH .
SELECT BELNR
BUKRS
GJAHR
BLART
BLDAT
BUDAT FROM BKPF INTO TABLE GT_BKPF WHERE BUKRS = P_BUKRS AND BLDAT IN S_BLDAT.
SORT GT_BKPF BY BUKRS BELNR GJAHR.
IF GT_BKPF IS NOT INITIAL.
SELECT BELNR
BUKRS
GJAHR
BUZEI
DMBTR FROM BSEG INTO TABLE GT_BSEG
FOR ALL ENTRIES IN GT_BKPF WHERE BUKRS = GT_BKPF-BUKRS
AND BELNR = GT_BKPF-BELNR
AND GJAHR = GT_BKPF-GJAHR.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM DATA .
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'BUKRS'.
FCAT-SCRTEXT_L = 'Company Code'.
APPEND FCAT TO ITAB_FCAT.
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'BELNR'.
FCAT-SCRTEXT_L = 'Document Number'.
APPEND FCAT TO ITAB_FCAT.
FCAT-COL_POS = FCAT-COL_POS + 1.
FCAT-FIELDNAME = 'GJAHR'.
FCAT-SCRTEXT_L = 'Year'.
APPEND FCAT TO ITAB_FCAT.
SORT GT_BKPF BY BLDAT.
LOOP AT GT_BKPF ASSIGNING <FS_BKPF>.
MONT2 = <FS_BKPF>-BLDAT+4(2).
GJAHR = <FS_BKPF>-BLDAT+0(4).
SELECT SINGLE KTX FROM T247 INTO LV_NAME WHERE MNR = MONT2 AND SPRAS = 'EN'.
CONCATENATE LV_NAME GJAHR INTO FCAT-FIELDNAME.
CONCATENATE LV_NAME GJAHR INTO FCAT-SCRTEXT_L.
FCAT-COL_POS = FCAT-COL_POS + 1.
APPEND FCAT TO ITAB_FCAT.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM ITAB_FCAT.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = ITAB_FCAT
IMPORTING
EP_TABLE = FS_DATA.
ASSIGN FS_DATA->* TO <FS_TAB>.
CREATE DATA DYN_LINE LIKE LINE OF <FS_TAB>.
ASSIGN DYN_LINE->* TO <FS_WA>.
SORT GT_BSEG BY BUKRS BELNR GJAHR.
SORT GT_BKPF BY BUKRS BELNR GJAHR.
LOOP AT GT_BSEG ASSIGNING <FS_BSEG>.
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-BUKRS.
UNASSIGN <FS_FINAL>.
ASSIGN COMPONENT 'BELNR' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-BELNR.
UNASSIGN <FS_FINAL>.
ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <FS_WA> TO <FS_FINAL>.
<FS_FINAL> = <FS_BSEG>-GJAHR.
UNASSIGN <FS_FINAL>.
READ TABLE GT_BKPF ASSIGNING <FS_BKPF> WITH KEY BUKRS = <FS_BSEG>-BUKRS BELNR = <FS_BSEG>-BELNR GJAHR = <FS_BSEG>-GJAHR.
MONT2 = <FS_BKPF>-BLDAT+4(2).
SELECT SINGLE KTX FROM T247 INTO LV_NAME WHERE MNR = MONT2 AND SPRAS = 'EN'.
CONCATENATE LV_NAME <FS_BKPF>-GJAHR INTO LV_FIELD.
READ TABLE ITAB_FCAT INTO FCAT WITH KEY FIELDNAME = LV_FIELD.
ASSIGN COMPONENT FCAT-FIELDNAME OF STRUCTURE <FS_WA> TO <FS_FINAL>.
IF FCAT-FIELDNAME NE 'BUKRS' AND FCAT-FIELDNAME NE 'BELNR' AND FCAT-FIELDNAME NE 'GJAHR'.
<FS_FINAL> = <FS_BSEG>-DMBTR + <FS_FINAL>.
UNASSIGN <FS_FINAL>.
ENDIF.
AT END OF BELNR.
APPEND <FS_WA> TO <FS_TAB>.
CLEAR: <FS_WA>.
ENDAT.
ENDLOOP.
ENDFORM.
No comments:
Post a Comment