Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Dynamic Report

Former Member
0 Likes
1,193

Hi Experts,

I have requirement, in a custom table i have 28 entries, and the same have to displayed in the output report as column vice, but this should be done dynamically. eg. if there is 20 entries in the table output of the report should be 20 column, can you please tell me how to do this?

Can i Use GENERATE SUBROUTINE POOL ? if yes how?

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
955

Hi,

We can create a Dynamic internal tabel in the Report and display it as list.

bellow find some example it might help u .

type-pools : abap.

field-symbols: <dyn_table> type standard table,

<dyn_wa>,

<dyn_field>.

data: dy_table type ref to data,

dy_line type ref to data,

xfc type lvc_s_fcat,

ifc type lvc_t_fcat.

selection-screen begin of block b1 with frame.

parameters: p_table(30) type c default 'T001'.

selection-screen end of block b1.

start-of-selection.

perform get_structure.

perform create_dynamic_itab. *********Creates a dyanamic internal table*********

perform get_data.

perform write_out.

form get_structure.

data : idetails type abap_compdescr_tab,

xdetails type abap_compdescr.

data : ref_table_des type ref to cl_abap_structdescr.

  • Get the structure of the table.

ref_table_des ?=

cl_abap_typedescr=>describe_by_name( p_table ).

idetails[] = ref_table_des->components[].

loop at idetails into xdetails.

clear xfc.

xfc-fieldname = xdetails-name .

xfc-datatype = xdetails-type_kind.

xfc-inttype = xdetails-type_kind.

xfc-intlen = xdetails-length.

xfc-decimals = xdetails-decimals.

append xfc to ifc.

endloop.

endform.

form create_dynamic_itab.

  • Create dynamic internal table and assign to FS

call method cl_alv_table_create=>create_dynamic_table

exporting

it_fieldcatalog = ifc

importing

ep_table = dy_table.

assign dy_table->* to <dyn_table>.

  • Create dynamic work area and assign to FS

create data dy_line like line of <dyn_table>.

assign dy_line->* to <dyn_wa>.

endform.

form get_data.

  • Select Data from table.

select * into table <dyn_table>

from (p_table).

endform.

Write out data from table.

loop at <dyn_table> into <dyn_wa>.

do.

assign component sy-index

of structure <dyn_wa> to <dyn_field>.

if sy-subrc <> 0.

exit.

endif.

if sy-index = 1.

write:/ <dyn_field>.

else.

write: <dyn_field>.

endif.

enddo.

endloop.

-


REPORT ZCLUST1 .

  • Example: how to create a dynamic internal table

  • The dynamic internal table stucture

DATA: BEGIN OF STRUCT OCCURS 10,

FILDNAME(8) TYPE C,

ABPTYPE TYPE C,

LENGTH TYPE I,

END OF STRUCT.

  • The dynamic program source table

DATA: BEGIN OF INCTABL OCCURS 10,

LINE(72),

END OF INCTABL.

DATA: LNG TYPE I, TYPESRTING(6).

  • Sample dynamic internal table stucture

STRUCT-FILDNAME = 'field1'. STRUCT-ABPTYPE = 'c'. STRUCT-LENGTH = '6'.

APPEND STRUCT. CLEAR STRUCT.

STRUCT-FILDNAME = 'field2'. STRUCT-ABPTYPE = 'd'.

APPEND STRUCT. CLEAR STRUCT.

STRUCT-FILDNAME = 'field3'. STRUCT-ABPTYPE = 'i'.

APPEND STRUCT. CLEAR STRUCT.

  • Create the dynamic internal table definition in the dyn. program

INCTABL-LINE = 'program zdynpro.'. APPEND INCTABL.

INCTABL-LINE = 'data: begin of dyntab occurs 10,'. APPEND INCTABL.

LOOP AT STRUCT.

INCTABL-LINE = STRUCT-FILDNAME.

LNG = STRLEN( STRUCT-FILDNAME ).

IF NOT STRUCT-LENGTH IS INITIAL .

TYPESRTING(1) = '('.

TYPESRTING+1 = STRUCT-LENGTH.

TYPESRTING+5 = ')'.

CONDENSE TYPESRTING NO-GAPS.

INCTABL-LINE+LNG = TYPESRTING.

ENDIF.

INCTABL-LINE+15 = 'type '.

INCTABL-LINE+21 = STRUCT-ABPTYPE.

INCTABL-LINE+22 = ','.

APPEND INCTABL.

ENDLOOP.

INCTABL-LINE = 'end of dyntab. '.

APPEND INCTABL.

  • Create the code processes the dynamic internal table

INCTABL-LINE = ' '. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = ''aaaaaa''.'. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = ''19970814''.'. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = 1.'. APPEND INCTABL.

INCTABL-LINE = 'append dyntab.'. APPEND INCTABL.

INCTABL-LINE = ' '. APPEND INCTABL.

INCTABL-LINE = 'loop at dyntab.'. APPEND INCTABL.

INCTABL-LINE = 'write: / dyntab.'. APPEND INCTABL.

INCTABL-LINE = 'endloop.'. APPEND INCTABL.

  • Create and run the dynamic program

INSERT REPORT 'zdynpro'(001) FROM INCTABL.

SUBMIT ZDYNPRO.

-


or Just try out this simpler dynamic internal tables

DATA: itab TYPE STANDARD TABLE OF spfli,

wa LIKE LINE OF itab.

DATA: line(72) TYPE c,

list LIKE TABLE OF line(72).

START-OF-SELECTION.

*line = ' CITYFROM CITYTO '.

line = ' AIRPTO '.

APPEND line TO list.

SELECT DISTINCT (list)

INTO CORRESPONDING FIELDS OF TABLE itab

FROM spfli.

IF sy-subrc EQ 0.

LOOP AT itab INTO wa.

  • WRITE: / wa-cityfrom, wa-cityto.

WRITE 😕 wa-airpto.

ENDLOOP.

ENDIF.

Regards,

Sunil

2 REPLIES 2
Read only

Former Member
0 Likes
956

Hi,

We can create a Dynamic internal tabel in the Report and display it as list.

bellow find some example it might help u .

type-pools : abap.

field-symbols: <dyn_table> type standard table,

<dyn_wa>,

<dyn_field>.

data: dy_table type ref to data,

dy_line type ref to data,

xfc type lvc_s_fcat,

ifc type lvc_t_fcat.

selection-screen begin of block b1 with frame.

parameters: p_table(30) type c default 'T001'.

selection-screen end of block b1.

start-of-selection.

perform get_structure.

perform create_dynamic_itab. *********Creates a dyanamic internal table*********

perform get_data.

perform write_out.

form get_structure.

data : idetails type abap_compdescr_tab,

xdetails type abap_compdescr.

data : ref_table_des type ref to cl_abap_structdescr.

  • Get the structure of the table.

ref_table_des ?=

cl_abap_typedescr=>describe_by_name( p_table ).

idetails[] = ref_table_des->components[].

loop at idetails into xdetails.

clear xfc.

xfc-fieldname = xdetails-name .

xfc-datatype = xdetails-type_kind.

xfc-inttype = xdetails-type_kind.

xfc-intlen = xdetails-length.

xfc-decimals = xdetails-decimals.

append xfc to ifc.

endloop.

endform.

form create_dynamic_itab.

  • Create dynamic internal table and assign to FS

call method cl_alv_table_create=>create_dynamic_table

exporting

it_fieldcatalog = ifc

importing

ep_table = dy_table.

assign dy_table->* to <dyn_table>.

  • Create dynamic work area and assign to FS

create data dy_line like line of <dyn_table>.

assign dy_line->* to <dyn_wa>.

endform.

form get_data.

  • Select Data from table.

select * into table <dyn_table>

from (p_table).

endform.

Write out data from table.

loop at <dyn_table> into <dyn_wa>.

do.

assign component sy-index

of structure <dyn_wa> to <dyn_field>.

if sy-subrc <> 0.

exit.

endif.

if sy-index = 1.

write:/ <dyn_field>.

else.

write: <dyn_field>.

endif.

enddo.

endloop.

-


REPORT ZCLUST1 .

  • Example: how to create a dynamic internal table

  • The dynamic internal table stucture

DATA: BEGIN OF STRUCT OCCURS 10,

FILDNAME(8) TYPE C,

ABPTYPE TYPE C,

LENGTH TYPE I,

END OF STRUCT.

  • The dynamic program source table

DATA: BEGIN OF INCTABL OCCURS 10,

LINE(72),

END OF INCTABL.

DATA: LNG TYPE I, TYPESRTING(6).

  • Sample dynamic internal table stucture

STRUCT-FILDNAME = 'field1'. STRUCT-ABPTYPE = 'c'. STRUCT-LENGTH = '6'.

APPEND STRUCT. CLEAR STRUCT.

STRUCT-FILDNAME = 'field2'. STRUCT-ABPTYPE = 'd'.

APPEND STRUCT. CLEAR STRUCT.

STRUCT-FILDNAME = 'field3'. STRUCT-ABPTYPE = 'i'.

APPEND STRUCT. CLEAR STRUCT.

  • Create the dynamic internal table definition in the dyn. program

INCTABL-LINE = 'program zdynpro.'. APPEND INCTABL.

INCTABL-LINE = 'data: begin of dyntab occurs 10,'. APPEND INCTABL.

LOOP AT STRUCT.

INCTABL-LINE = STRUCT-FILDNAME.

LNG = STRLEN( STRUCT-FILDNAME ).

IF NOT STRUCT-LENGTH IS INITIAL .

TYPESRTING(1) = '('.

TYPESRTING+1 = STRUCT-LENGTH.

TYPESRTING+5 = ')'.

CONDENSE TYPESRTING NO-GAPS.

INCTABL-LINE+LNG = TYPESRTING.

ENDIF.

INCTABL-LINE+15 = 'type '.

INCTABL-LINE+21 = STRUCT-ABPTYPE.

INCTABL-LINE+22 = ','.

APPEND INCTABL.

ENDLOOP.

INCTABL-LINE = 'end of dyntab. '.

APPEND INCTABL.

  • Create the code processes the dynamic internal table

INCTABL-LINE = ' '. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = ''aaaaaa''.'. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = ''19970814''.'. APPEND INCTABL.

INCTABL-LINE = 'dyntab-field1 = 1.'. APPEND INCTABL.

INCTABL-LINE = 'append dyntab.'. APPEND INCTABL.

INCTABL-LINE = ' '. APPEND INCTABL.

INCTABL-LINE = 'loop at dyntab.'. APPEND INCTABL.

INCTABL-LINE = 'write: / dyntab.'. APPEND INCTABL.

INCTABL-LINE = 'endloop.'. APPEND INCTABL.

  • Create and run the dynamic program

INSERT REPORT 'zdynpro'(001) FROM INCTABL.

SUBMIT ZDYNPRO.

-


or Just try out this simpler dynamic internal tables

DATA: itab TYPE STANDARD TABLE OF spfli,

wa LIKE LINE OF itab.

DATA: line(72) TYPE c,

list LIKE TABLE OF line(72).

START-OF-SELECTION.

*line = ' CITYFROM CITYTO '.

line = ' AIRPTO '.

APPEND line TO list.

SELECT DISTINCT (list)

INTO CORRESPONDING FIELDS OF TABLE itab

FROM spfli.

IF sy-subrc EQ 0.

LOOP AT itab INTO wa.

  • WRITE: / wa-cityfrom, wa-cityto.

WRITE 😕 wa-airpto.

ENDLOOP.

ENDIF.

Regards,

Sunil

Read only

Former Member
0 Likes
955

Hi U can do it with use of an internal table...

Here is an example I have done... Study it... this may be helpful to u.

I have cut and pest required logic only just to give u idea. Hope this will help u.

DATA: BEGIN OF WA_MAIN,

prctr(10),

MATNR(18),

WERKS(4),

bdzei(12),

MEINS(3),

w1 LIKE PBED-PLNMG,

w2 LIKE PBED-PLNMG,

w3 LIKE PBED-PLNMG,

w4 LIKE PBED-PLNMG,

w5 like pbed-pLNMG,

w6 like pbed-pLNMG,

w7 like pbed-pLNMG,

w8 like pbed-pLNMG,

w9 like pbed-pLNMG,

w10 like pbed-pLNMG,

w11 like pbed-pLNMG,

w12 like pbed-pLNMG,

w13 like pbed-pLNMG,

w14 like pbed-pLNMG,

w15 like pbed-pLNMG,

w16 like pbed-pLNMG,

w17 like pbed-pLNMG,

w18 like pbed-pLNMG,

w19 like pbed-pLNMG,

w20 like pbed-pLNMG,

w21 like pbed-pLNMG,

w22 like pbed-pLNMG,

w23 like pbed-pLNMG,

w24 like pbed-pLNMG,

w25 like pbed-pLNMG,

w26 like pbed-pLNMG,

w27 like pbed-pLNMG,

w28 like pbed-pLNMG,

w29 like pbed-pLNMG,

w30 like pbed-pLNMG,

w31 like pbed-pLNMG,

w32 like pbed-pLNMG,

w33 like pbed-pLNMG,

w34 like pbed-pLNMG,

w35 like pbed-pLNMG,

w36 like pbed-pLNMG,

w37 like pbed-pLNMG,

w38 like pbed-pLNMG,

w39 like pbed-pLNMG,

w40 like pbed-pLNMG,

w41 like pbed-pLNMG,

w42 like pbed-pLNMG,

w43 like pbed-pLNMG,

w44 like pbed-pLNMG,

w45 like pbed-pLNMG,

w46 like pbed-pLNMG,

w47 like pbed-pLNMG,

w48 like pbed-pLNMG,

w49 like pbed-pLNMG,

w50 like pbed-pLNMG,

w51 like pbed-pLNMG,

w52 like pbed-pLNMG,

END OF WA_MAIN.

DATA: VA_TEMP(2) TYPE N.

VA_TEMP = wa_pbed-PERXX+4(2).

IF VA_TEMP GE VA_WEEK+4(2).

VA_TEMP = wa_pbed-PERXX4(2) - VA_WEEK4(2).

va_temp = va_temp + 1.

ELSE.

VA_TEMP = wa_pbed-PERXX+4(2) + 53.

VA_TEMP = VA_TEMP - VA_WEEK+4(2).

ENDIF.

WA_MAIN_TEMP = WA_MAIN.

SELECT * FROM pbed INTO TABLE t_pbed

WHERE bdzei = wa_main-bdzei

and pdatu between p_pdatu and v_date " Date Range

and ENTLU = VA_ENTLU. " Period Indicator Is WEEK

LOOP AT t_pbed into wa_pbed.

CLEAR WA_MAIN.

WA_MAIN-MATNR = WA_MAIN_TEMP-MATNR .

WA_MAIN-WERKS = WA_MAIN_TEMP-WERKS .

WA_MAIN-PRCTR = WA_MAIN_TEMP-PRCTR .

WA_MAIN-BDZEI = WA_MAIN_TEMP-BDZEI.

wa_main-meins = wa_pbed-meins.

case VA_TEMP.

when '01'.

wa_main-w1 = wa_pbed-PLNMG.

when '02'.

wa_main-w2 = wa_pbed-PLNMG.

when '03'.

wa_main-w3 = wa_pbed-PLNMG.

when '04'.

wa_main-w4 = wa_pbed-PLNMG.

when '05'.

wa_main-w5 = wa_pbed-PLNMG.

when '06'.

wa_main-w6 = wa_pbed-PLNMG.

when '07'.

wa_main-w7 = wa_pbed-PLNMG.

when '08'.

wa_main-w8 = wa_pbed-PLNMG.

when '09'.

wa_main-w9 = wa_pbed-PLNMG.

when '10'.

wa_main-w10 = wa_pbed-PLNMG.

when '11'.

wa_main-w11 = wa_pbed-PLNMG.

when '12'.

wa_main-w12 = wa_pbed-PLNMG.

when '13'.

wa_main-w13 = wa_pbed-PLNMG.

when '14'.

wa_main-w14 = wa_pbed-PLNMG.

when '15'.

wa_main-w15 = wa_pbed-PLNMG.

when '16'.

wa_main-w16 = wa_pbed-PLNMG.

when '17'.

wa_main-w17 = wa_pbed-PLNMG.

when '18'.

wa_main-w18 = wa_pbed-PLNMG.

when '19'.

wa_main-w19 = wa_pbed-PLNMG.

when '20'.

wa_main-w20 = wa_pbed-PLNMG.

when '21'.

wa_main-w21 = wa_pbed-PLNMG.

when '22'.

wa_main-w22 = wa_pbed-PLNMG.

when '23'.

wa_main-w23 = wa_pbed-PLNMG.

when '24'.

wa_main-w24 = wa_pbed-PLNMG.

when '25'.

wa_main-w25 = wa_pbed-PLNMG.

when '26'.

wa_main-w26 = wa_pbed-PLNMG.

when '27'.

wa_main-w27 = wa_pbed-PLNMG.

when '28'.

wa_main-w28 = wa_pbed-PLNMG.

when '29'.

wa_main-w29 = wa_pbed-PLNMG.

when '30'.

wa_main-w30 = wa_pbed-PLNMG.

when '31'.

wa_main-w31 = wa_pbed-PLNMG.

when '32'.

wa_main-w32 = wa_pbed-PLNMG.

when '33'.

wa_main-w33 = wa_pbed-PLNMG.

when '34'.

wa_main-w34 = wa_pbed-PLNMG.

when '35'.

wa_main-w35 = wa_pbed-PLNMG.

when '36'.

wa_main-w36 = wa_pbed-PLNMG.

when '37'.

wa_main-w37 = wa_pbed-PLNMG.

when '38'.

wa_main-w38 = wa_pbed-PLNMG.

when '39'.

wa_main-w39 = wa_pbed-PLNMG.

when '40'.

wa_main-w40 = wa_pbed-PLNMG.

when '41'.

wa_main-w41 = wa_pbed-PLNMG.

when '42'.

wa_main-w42 = wa_pbed-PLNMG.

when '43'.

wa_main-w43 = wa_pbed-PLNMG.

when '44'.

wa_main-w44 = wa_pbed-PLNMG.

when '45'.

wa_main-w45 = wa_pbed-PLNMG.

when '46'.

wa_main-w46 = wa_pbed-PLNMG.

when '47'.

wa_main-w47 = wa_pbed-PLNMG.

when '48'.

wa_main-w48 = wa_pbed-PLNMG.

when '49'.

wa_main-w49 = wa_pbed-PLNMG.

when '50'.

wa_main-w50 = wa_pbed-PLNMG.

when '51'.

wa_main-w51 = wa_pbed-PLNMG.

when '52'.

wa_main-w52 = wa_pbed-PLNMG.

ENDCASE.

COLLECT WA_main INTO T_main.

ENDLOOP.

DARSHAN.