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_NETPR, LV_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