Saturday, July 14, 2018

Dynamic ALV

Dynamic ALV Report.

Say you have a requirement where you want to show a report to indicate one Material is Present in how many purchase order. Say your purchase order number is 'P1' is present in three Material 'M1', 'M2' and 'M3', then your ALV Report show only one row with three column like P1, M1, M2 and M3 and in Material we need to display Material Description.
















Here we can show one Purchase Number having Three Material so now i want to display in single Row three Material with there Description.

*&---------------------------------------------------------------------*
*& Report  ZDYNAMIC_ALV
*&
*&---------------------------------------------------------------------*
*& Project     : Dynamic ALV
*& Authore     : Rohit Subhash
*& Description : Display Dynamic Material and Material Description
*&---------------------------------------------------------------------*

REPORT ZDYNAMIC_ALV.
*&---------------------------------------------------------------------*
*& Structure for Purchasing Document Header Table
*&---------------------------------------------------------------------*
TYPES BEGIN OF TY_EKPO,
                  EBELN  TYPE EBELN,
                  EBELP  TYPE EBELP,
                  TXZ01  TYPE TXZ01,
                  MATNR  TYPE MATNR,
                  WERKS  TYPE EWERK,
                  MENGE  TYPE BSTMG,
                  NETPR  TYPE BPREI,
              END OF TY_EKPO.

*& Internal Table Declaration
DATA GT_EKPO  TYPE TABLE OF TY_EKPO,
              LT_EKPO  TYPE TABLE OF TY_EKPO,
              GT_FCAT TYPE LVC_T_FCAT.

*& Workarea Declaration
DATA GS_EKPO  TYPE TY_EKPO,
              GS_FCAT TYPE LVC_S_FCAT,
              GS_LAY  TYPE LVC_S_LAYO.

*& Constant Declaration
DATA LV_EBELN TYPE EKPO-EBELN,
              LV_LINES TYPE INT4,
              LV_INDEX TYPE INT4,
              LV_MENGE TYPE MENGE_D,
              LV_NETPR TYPE NETPR.

*& Declare Local Object for Global Class.
DATA LO_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,
              LO_GUI     TYPE REF TO CL_GUI_ALV_GRID.

*& Dynamic Internal Table and Dynamic workarea Declaration
FIELD-SYMBOLS <FT_DYN_TAB> TYPE STANDARD TABLE,
                                <FS_DYN>           TYPE ANY,
                                <FS_EKPO>          TYPE TY_EKPO,
                                <FS_FINAL>         TYPE ANY.

DATA T_NEWTAB  TYPE REF TO DATA,
              T_NEWLINE TYPE REF TO DATA.

*& Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS S_EBELN FOR LV_EBELN.

SELECTION-SCREEN END OF BLOCK A1.

*&---------------------------------------------------------------------*
*& INITIALIZATION Event
*&---------------------------------------------------------------------*
INITIALIZATION.
  REFRESH GT_EKPO[],
                      LT_EKPO[],
                      GT_FCAT[].

  CLEAR GS_EKPO,
                  GS_FCAT,
                  GS_LAY.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION Event
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*& This Routine is used to Get the Data from EKPO Table
  PERFORM GET_EKPO.
*& Populate Dynamic Column and Create Dynamic Internal Table.
  PERFORM POP_DYN_COLUMN.
*& Populate Data into Dynamic Internal Table
  PERFORM POP_DYN_DATA.
*& Call Screen and Display Data
  PERFORM CALL_SCREEN.

*&---------------------------------------------------------------------*
*&      Form  GET_EKPO
*&---------------------------------------------------------------------*
*    This routine is used to get the data from Purchasing Document Item Table
*----------------------------------------------------------------------*
FORM GET_EKPO .

  SELECT EBELN
                EBELP
                TXZ01
                MATNR
                WERKS
                MENGE
               NETPR
     FROM EKPO INTO TABLE GT_EKPO WHERE EBELN IN S_EBELN.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  POP_DYN_COLUMN
*&---------------------------------------------------------------------*
*     Populate Dynamic Column and Create Dynamic Internal Table
*----------------------------------------------------------------------*
FORM POP_DYN_COLUMN .

  GS_FCAT-FIELDNAME 'EBELN'.
  GS_FCAT-SCRTEXT_M 'Pur. Order No'.
  GS_FCAT-OUTPUTLEN '10'.
  APPEND GS_FCAT TO GT_FCAT.
  CLEAR GS_FCAT.

  GS_FCAT-FIELDNAME 'MENGE'.
  GS_FCAT-SCRTEXT_M 'Quantity'.
  GS_FCAT-OUTPUTLEN '13'.
  APPEND GS_FCAT TO GT_FCAT.
  CLEAR GS_FCAT.

  GS_FCAT-FIELDNAME 'NETPR'.
  GS_FCAT-SCRTEXT_M 'Price Per Unit'.
  GS_FCAT-OUTPUTLEN '15'.
  APPEND GS_FCAT TO GT_FCAT.
  CLEAR GS_FCAT.

*& Find Total Number of MATNR(Materia)
  LT_EKPO[] GT_EKPO[].
  DELETE LT_EKPO WHERE MATNR IS INITIAL.
  SORT LT_EKPO BY MATNR.
  DELETE ADJACENT DUPLICATES FROM LT_EKPO COMPARING MATNR.

*& Find total Number of Record.
  DESCRIBE TABLE LT_EKPO LINES LV_LINES.

  CLEAR LV_INDEX.
  DO LV_LINES TIMES.

    LV_INDEX LV_INDEX + 1.

    CLEAR GS_EKPO.
    " Read Record Based on Index
    READ TABLE LT_EKPO INTO GS_EKPO INDEX LV_INDEX.
    "Remove Material Leading ZERO
    SHIFT GS_EKPO-MATNR LEFT DELETING LEADING '0'.
    GS_FCAT-FIELDNAME GS_EKPO-MATNR.
    GS_FCAT-SCRTEXT_L GS_EKPO-MATNR.
    GS_FCAT-OUTPUTLEN '40'.
    APPEND GS_FCAT TO GT_FCAT.
    CLEAR GS_FCAT.

  ENDDO.

*& Create Dynamic Internal Table.
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
*     I_STYLE_TABLE             =
      IT_FIELDCATALOG           GT_FCAT
*     I_LENGTH_IN_BYTE          =
    IMPORTING
      EP_TABLE                  T_NEWTAB
*     E_STYLE_FNAME             =
    EXCEPTIONS
      GENERATE_SUBPOOL_DIR_FULL 1
      OTHERS                    2.
  IF SY-SUBRC NE 0.

  ENDIF.

*& Assign the Field Symbol with dynmic Internal Table
  ASSIGN T_NEWTAB->TO <FT_DYN_TAB>.

*& Create Dynamic Workare
  CREATE DATA T_NEWLINE LIKE LINE OF <FT_DYN_TAB>.
  ASSIGN T_NEWLINE->TO <FS_DYN>.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  POP_DYN_DATA
*&---------------------------------------------------------------------*
*       Populate Data into Dynamic Internal Table
*----------------------------------------------------------------------*
FORM POP_DYN_DATA .

  LOOP AT GT_EKPO ASSIGNING <FS_EKPO> .

    ASSIGN COMPONENT 'EBELN' OF STRUCTURE <FS_DYN> TO <FS_FINAL>.
    IF <FS_FINAL> IS ASSIGNED.
      <FS_FINAL> <FS_EKPO>-EBELN.
    ENDIF.

    ASSIGN COMPONENT 'MENGE' OF STRUCTURE <FS_DYN> TO <FS_FINAL>.
    IF <FS_FINAL> IS ASSIGNED.
      LV_MENGE LV_MENGE + <FS_EKPO>-MENGE.
      <FS_FINAL> LV_MENGE.
    ENDIF.

    ASSIGN COMPONENT 'NETPR' OF STRUCTURE <FS_DYN> TO <FS_FINAL>.
    IF <FS_FINAL> IS ASSIGNED.
      LV_NETPR LV_NETPR + <FS_EKPO>-NETPR.
      <FS_FINAL> LV_NETPR.
    ENDIF.

    "Getting Material Description based on Material Number.
    CLEAR GS_EKPO.
    READ TABLE GT_EKPO INTO GS_EKPO WITH KEY EBELN <FS_EKPO>-EBELN EBELP <FS_EKPO>-EBELP.
    IF SY-SUBRC EQ 0.
      IF GS_EKPO-MATNR IS NOT INITIAL.
        SHIFT GS_EKPO-MATNR LEFT DELETING LEADING '0'.
        ASSIGN COMPONENT GS_EKPO-MATNR OF STRUCTURE <FS_DYN> TO <FS_FINAL>.
        IF <FS_FINAL> IS ASSIGNED.
          <FS_FINAL> <FS_EKPO>-TXZ01.
        ENDIF.
      ENDIF.
    ENDIF.

    AT END OF EBELN.

      APPEND <FS_DYN> TO <FT_DYN_TAB>.
      CLEAR LV_NETPRLV_MENGE<FS_DYN>.

    ENDAT.

  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  CALL_SCREEN
*&---------------------------------------------------------------------*
*      Call Screen 9001
*----------------------------------------------------------------------*
FORM CALL_SCREEN .

  CALL SCREEN 9001.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Module  STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_9001 OUTPUT.

  SET PF-STATUS 'ZSTATUS'.
  SET TITLEBAR 'ZTITLE'.

ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  DISPLAY  OUTPUT
*&---------------------------------------------------------------------*
*       Display Data
*----------------------------------------------------------------------*
MODULE DISPLAY OUTPUT.

  GS_LAY-CWIDTH_OPT 'X'.
  GS_LAY-ZEBRA 'X'.

*& Check Docking Container is Initial or Not
  CHECK LO_DOCKING IS INITIAL.

*& Creat Object for Docking Container.
  CREATE OBJECT LO_DOCKING
    EXPORTING
      PARENT                      CL_GUI_DOCKING_CONTAINER=>DEFAULT_SCREEN
      REPID                       SY-REPID
      DYNNR                       SY-DYNNR
*     SIDE                        = DOCK_AT_LEFT
      EXTENSION                   2000
*     STYLE                       =
*     LIFETIME                    = lifetime_default
*     CAPTION                     =
*     METRIC                      = 0
*     RATIO                       =
*     NO_AUTODEF_PROGID_DYNNR     =
*     NAME                        =
    EXCEPTIONS
      CNTL_ERROR                  1
      CNTL_SYSTEM_ERROR           2
      CREATE_ERROR                3
      LIFETIME_ERROR              4
      LIFETIME_DYNPRO_DYNPRO_LINK 5
      OTHERS                      6.

*& Create Object for CL_GUI_ALV_GRID Class.
  CREATE OBJECT LO_GUI
    EXPORTING
*     I_SHELLSTYLE      = 0
*     I_LIFETIME        =
      I_PARENT          LO_DOCKING
*     I_APPL_EVENTS     = space
*     I_PARENTDBG       =
*     I_APPLOGPARENT    =
*     I_GRAPHICSPARENT  =
*     I_NAME            =
*     I_FCAT_COMPLETE   = SPACE
    EXCEPTIONS
      ERROR_CNTL_CREATE 1
      ERROR_CNTL_INIT   2
      ERROR_CNTL_LINK   3
      ERROR_DP_CREATE   4
      OTHERS            5.

*& Display Data
  CALL METHOD LO_GUI->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
*     I_BUFFER_ACTIVE               =
*     I_BYPASSING_BUFFER            =
*     I_CONSISTENCY_CHECK           =
*     I_STRUCTURE_NAME              =
*     IS_VARIANT                    =
      I_SAVE                        'A'
      I_DEFAULT                     'X'
      IS_LAYOUT                     GS_LAY
*     IS_PRINT                      =
*     IT_SPECIAL_GROUPS             =
*     IT_TOOLBAR_EXCLUDING          =
*     IT_HYPERLINK                  =
*     IT_ALV_GRAPHICS               =
*     IT_EXCEPT_QINFO               =
*     IR_SALV_ADAPTER               =
    CHANGING
      IT_OUTTAB                     <FT_DYN_TAB>
      IT_FIELDCATALOG               GT_FCAT
*     IT_SORT                       =
*     IT_FILTER                     =
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION 1
      PROGRAM_ERROR                 2
      TOO_MANY_LINES                3
      OTHERS                        4.
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9001 INPUT.

  IF SY-UCOMM 'BACK' OR SY-UCOMM 'EXIT' OR SY-UCOMM 'CANCEL'.
    LEAVE TO SCREEN 0.
  ENDIF.

ENDMODULE.


Output:














Download Sour Code: Code

2 comments:

  1. What is the name given for the container? Because I am getting a blank screen

    ReplyDelete
    Replies
    1. In the screen flow logic make sure following lines are there.
      PROCESS BEFORE OUTPUT.
      MODULE STATUS_9001.
      MODULE DISPLAY.
      *
      PROCESS AFTER INPUT.
      MODULE USER_COMMAND_9001.

      Delete