How to Create dynamic column in output of sap abap alv report :
Using field symbol, abap consultant can create the dynamic output column, means based on your conditions the number of columns in the output are created and display.
Code :
REPORT ZDEMO_DYNAMIC_ALV_OUTPUT1.
tables : ekko, ekpo.
data : gt_ekko type STANDARD TABLE OF ekko, "po header
gs_ekko type ekko,
gt_ekpo type STANDARD TABLE OF ekpo, "po item
gs_ekpo type ekpo.
"varaibles
data : gv_ebelp type ekpo-ebelp, "for
gv_max_ebelp type ekpo-ebelp. "to select max number of items in data
"for dynamic table
FIELD-SYMBOLS : <DYN_TABLE> TYPE STANDARD TABLE, "for dynamic table
<DYN_WA>,
<FS1>.
* Create the dynamic internal table
data : NEW_TABLE TYPE REF TO DATA,
NEW_LINE TYPE REF TO DATA.
DATA: FIELDNAME(20) TYPE C,
FIELDVALUE(60) TYPE C.
DATA: IT_FLDCAT TYPE LVC_T_FCAT,
WA_FLDCAT TYPE LVC_S_FCAT,
GS_LAYOUT1 TYPE LVC_S_LAYO. "slis_layout_alv,
SELECTION-SCREEN begin of block b1 WITH FRAME TITLE text-001.
select-OPTIONS : s_ebeln for ekko-ebeln,
s_aedat for ekko-AEDAT,
s_bsart for ekko-bsart.
SELECTION-SCREEN end of BLOCK b1.
START-OF-SELECTION.
perform get_data.
PERFORM BUILD_DYNAMIC_TABLE.
perform build_data.
perform alv_display.
end-of-SELECTION.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_DATA .
"select header data
select * from ekko into CORRESPONDING FIELDS OF TABLE gt_ekko
WHERE ebeln in s_ebeln
and aedat in s_aedat
and bsart in s_bsart.
"select line item
if gt_ekko[] is NOT INITIAL.
select * from ekpo into CORRESPONDING FIELDS OF TABLE gt_ekpo
FOR ALL ENTRIES IN gt_ekko WHERE ebeln = gt_ekko-ebeln.
sort gt_ekpo DESCENDING by ebelp.
clear : gs_ekpo.
read TABLE gt_ekpo into gs_ekpo INDEX 1.
GV_MAX_EBELP = gs_ekpo-ebelp.
sort gt_ekpo by ebeln ebelp.
endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_DYNAMIC_TABLE .
CLEAR WA_FLDCAT.
WA_FLDCAT-FIELDNAME = 'EBELN'.
WA_FLDCAT-COLTEXT = 'PO No.'.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '10'.
WA_FLDCAT-EMPHASIZE = 'C5'.
APPEND WA_FLDCAT TO IT_FLDCAT.
gv_ebelp = 10.
DO.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_MATNR' INTO WA_FLDCAT-FIELDNAME.
CONCATENATE 'Material Code_' gv_ebelp into WA_FLDCAT-COLTEXT.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '18'.
WA_FLDCAT-NO_ZERO = 'X'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_TXZ01' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Description'.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '40'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_MENGE' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Quantity'.
WA_FLDCAT-DATATYPE = 'CURR'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_NETWR' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Amount'.
WA_FLDCAT-DATATYPE = 'CURR'.
APPEND WA_FLDCAT TO IT_FLDCAT.
if gv_ebelp = GV_MAX_EBELP.
exit.
else.
gv_ebelp = gv_ebelp + 10.
endif.
enddo.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
* I_STYLE_TABLE =
IT_FIELDCATALOG = IT_FLDCAT
* I_LENGTH_IN_BYTE =
IMPORTING
EP_TABLE = NEW_TABLE
* E_STYLE_FNAME =
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN NEW_TABLE->* TO <DYN_TABLE>.
* Create dynamic work area and assign to FS
CREATE DATA NEW_LINE LIKE LINE OF <DYN_TABLE>.
ASSIGN NEW_LINE->* TO <DYN_WA>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_DATA .
sort gt_ekko by ebeln.
sort gt_ekpo by ebeln ebelp.
loop at gt_ekko into gs_ekko.
clear : <dyn_wa>.
clear : FIELDNAME, FIELDVALUE.
FIELDNAME = 'EBELN'.
FIELDVALUE = gs_ekko-ebeln.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
loop at gt_ekpo into gs_ekpo WHERE ebeln = gs_ekko-ebeln.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_MATNR' into FIELDNAME.
FIELDVALUE = gs_ekpo-matnr.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_TXZ01' into FIELDNAME.
FIELDVALUE = gs_ekpo-TXZ01.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_MENGE' into FIELDNAME.
FIELDVALUE = gs_ekpo-menge.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_NETWR' into FIELDNAME.
FIELDVALUE = gs_ekpo-netwr.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : gs_ekpo.
endloop.
append <DYN_WA> to <DYN_TABLE>.
clear : gs_ekko.
endloop.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM ALV_DISPLAY .
GS_LAYOUT1-COL_OPT = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GS_LAYOUT1
IT_FIELDCAT_LVC = IT_FLDCAT[]
* I_GRID_SETTINGS = gs_grid
* IT_EVENTS = lt_evts[]
* IT_EVENTS = I_EVENTS
I_DEFAULT = 'X'
I_SAVE = 'A'
* IS_VARIANT = GS_VARIANT1
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = <DYN_TABLE>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
Using field symbol, abap consultant can create the dynamic output column, means based on your conditions the number of columns in the output are created and display.
Code :
REPORT ZDEMO_DYNAMIC_ALV_OUTPUT1.
tables : ekko, ekpo.
data : gt_ekko type STANDARD TABLE OF ekko, "po header
gs_ekko type ekko,
gt_ekpo type STANDARD TABLE OF ekpo, "po item
gs_ekpo type ekpo.
"varaibles
data : gv_ebelp type ekpo-ebelp, "for
gv_max_ebelp type ekpo-ebelp. "to select max number of items in data
"for dynamic table
FIELD-SYMBOLS : <DYN_TABLE> TYPE STANDARD TABLE, "for dynamic table
<DYN_WA>,
<FS1>.
* Create the dynamic internal table
data : NEW_TABLE TYPE REF TO DATA,
NEW_LINE TYPE REF TO DATA.
DATA: FIELDNAME(20) TYPE C,
FIELDVALUE(60) TYPE C.
DATA: IT_FLDCAT TYPE LVC_T_FCAT,
WA_FLDCAT TYPE LVC_S_FCAT,
GS_LAYOUT1 TYPE LVC_S_LAYO. "slis_layout_alv,
SELECTION-SCREEN begin of block b1 WITH FRAME TITLE text-001.
select-OPTIONS : s_ebeln for ekko-ebeln,
s_aedat for ekko-AEDAT,
s_bsart for ekko-bsart.
SELECTION-SCREEN end of BLOCK b1.
START-OF-SELECTION.
perform get_data.
PERFORM BUILD_DYNAMIC_TABLE.
perform build_data.
perform alv_display.
end-of-SELECTION.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_DATA .
"select header data
select * from ekko into CORRESPONDING FIELDS OF TABLE gt_ekko
WHERE ebeln in s_ebeln
and aedat in s_aedat
and bsart in s_bsart.
"select line item
if gt_ekko[] is NOT INITIAL.
select * from ekpo into CORRESPONDING FIELDS OF TABLE gt_ekpo
FOR ALL ENTRIES IN gt_ekko WHERE ebeln = gt_ekko-ebeln.
sort gt_ekpo DESCENDING by ebelp.
clear : gs_ekpo.
read TABLE gt_ekpo into gs_ekpo INDEX 1.
GV_MAX_EBELP = gs_ekpo-ebelp.
sort gt_ekpo by ebeln ebelp.
endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_DYNAMIC_TABLE .
CLEAR WA_FLDCAT.
WA_FLDCAT-FIELDNAME = 'EBELN'.
WA_FLDCAT-COLTEXT = 'PO No.'.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '10'.
WA_FLDCAT-EMPHASIZE = 'C5'.
APPEND WA_FLDCAT TO IT_FLDCAT.
gv_ebelp = 10.
DO.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_MATNR' INTO WA_FLDCAT-FIELDNAME.
CONCATENATE 'Material Code_' gv_ebelp into WA_FLDCAT-COLTEXT.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '18'.
WA_FLDCAT-NO_ZERO = 'X'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_TXZ01' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Description'.
WA_FLDCAT-DATATYPE = 'CHAR'.
WA_FLDCAT-OUTPUTLEN = '40'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_MENGE' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Quantity'.
WA_FLDCAT-DATATYPE = 'CURR'.
APPEND WA_FLDCAT TO IT_FLDCAT.
CLEAR WA_FLDCAT.
CONCATENATE GV_EBELP '_NETWR' INTO WA_FLDCAT-FIELDNAME.
WA_FLDCAT-COLTEXT = 'Amount'.
WA_FLDCAT-DATATYPE = 'CURR'.
APPEND WA_FLDCAT TO IT_FLDCAT.
if gv_ebelp = GV_MAX_EBELP.
exit.
else.
gv_ebelp = gv_ebelp + 10.
endif.
enddo.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
* I_STYLE_TABLE =
IT_FIELDCATALOG = IT_FLDCAT
* I_LENGTH_IN_BYTE =
IMPORTING
EP_TABLE = NEW_TABLE
* E_STYLE_FNAME =
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN NEW_TABLE->* TO <DYN_TABLE>.
* Create dynamic work area and assign to FS
CREATE DATA NEW_LINE LIKE LINE OF <DYN_TABLE>.
ASSIGN NEW_LINE->* TO <DYN_WA>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_DATA .
sort gt_ekko by ebeln.
sort gt_ekpo by ebeln ebelp.
loop at gt_ekko into gs_ekko.
clear : <dyn_wa>.
clear : FIELDNAME, FIELDVALUE.
FIELDNAME = 'EBELN'.
FIELDVALUE = gs_ekko-ebeln.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
loop at gt_ekpo into gs_ekpo WHERE ebeln = gs_ekko-ebeln.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_MATNR' into FIELDNAME.
FIELDVALUE = gs_ekpo-matnr.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_TXZ01' into FIELDNAME.
FIELDVALUE = gs_ekpo-TXZ01.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_MENGE' into FIELDNAME.
FIELDVALUE = gs_ekpo-menge.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : FIELDNAME, FIELDVALUE.
CONCATENATE gs_ekpo-ebelp '_NETWR' into FIELDNAME.
FIELDVALUE = gs_ekpo-netwr.
CONDENSE FIELDVALUE.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
<FS1> = FIELDVALUE.
clear : gs_ekpo.
endloop.
append <DYN_WA> to <DYN_TABLE>.
clear : gs_ekko.
endloop.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM ALV_DISPLAY .
GS_LAYOUT1-COL_OPT = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GS_LAYOUT1
IT_FIELDCAT_LVC = IT_FLDCAT[]
* I_GRID_SETTINGS = gs_grid
* IT_EVENTS = lt_evts[]
* IT_EVENTS = I_EVENTS
I_DEFAULT = 'X'
I_SAVE = 'A'
* IS_VARIANT = GS_VARIANT1
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = <DYN_TABLE>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
0 Comments