Application Development 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: 

Subtotal in Dynamic ALV

Former Member
0 Kudos

Hi,

I am actually working on a dynamic ALV report. But the subtotal is not working. It seems that the following code gives subtotal only when a static table is passed to the REUSE_ALV_GRID function module :

CLEAR wa_sort.

wa_sort-fieldname = c_sfcpf.

wa_sort-subtot = c_x.

APPEND wa_sort TO i_sort.

CLEAR wa_sort.

wa_sort-fieldname = c_plnbez.

wa_sort-subtot = c_x.

APPEND wa_sort TO i_sort.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

i_interface_check = c_blank

i_callback_program = v_repid

is_layout = wa_layout

it_fieldcat = i_fieldcat[]

it_sort = i_sort[]

it_events = i_event[]

i_save = c_a

TABLES

t_outtab = <fs_1>"i_output"

EXCEPTIONS

program_error = 1

OTHERS = 2.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

Did anyone of you ever worked with subtotal in dynamic ALV?

Thanks for your replies.

4 REPLIES 4

Former Member
0 Kudos

Smita,

First add beow code in field catelog on which fields base you want subtotal .

Compare your code with below code.

EX; You want sub total on "ZZVENDOR" "TYPBZ" base

DATA : w_fieldcat TYPE slis_fieldcat_alv,

i_fieldcat TYPE slis_t_fieldcat_alv,

gs_layout TYPE slis_layout_alv,

wa_sort1 TYPE slis_t_sortinfo_alv,

wa_sort2 TYPE slis_sortinfo_alv.

wa_sort2-spos = '07'.

wa_sort2-up = 'X'.

wa_sort2-fieldname = 'ZZVENDOR'.

APPEND wa_sort2 TO wa_sort1.

CLEAR wa_sort2.

wa_sort2-spos = '08'.

wa_sort2-up = 'X'.

wa_sort2-subtot = 'X'.

wa_sort2-fieldname = 'TYPBZ'.

APPEND wa_sort2 TO wa_sort1.

CLEAR wa_sort2.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

i_callback_program = ws_repid

i_callback_pf_status_set = 'GUI_STAT1'

i_callback_user_command = 'STAT'

is_layout = gs_layout

it_fieldcat = i_fieldcat[]

it_sort = wa_sort1

TABLES

t_outtab = i_zaw_pol_plan.

Don't forget to reward if useful

0 Kudos

Smita,

for above code add one more step.

In your field catelog add field

"w_fieldcat-do_sum = c_x. "This you have to add only the fields on which base you are sorting and on which fields you are summing.

w_fieldcat-tabname = c_tabname.

w_fieldcat-fieldname = c_fldname4.

w_fieldcat-do_sum = c_x.

w_fieldcat-outputlen = '8'.

w_fieldcat-col_pos = '5'.

w_fieldcat-row_pos = '1'.

w_fieldcat-seltext_l = c_seltext_l4.

APPEND w_fieldcat TO i_fieldcat.

CLEAR w_fieldcat.

If you are getting confuse take the below code.

&----


*& Report ZALVTOTAL *

*& *

&----


*& *

*& *

&----


REPORT ZALVTOTAL .

TYPES :

BEGIN OF ty_vbak,

vkorg TYPE vbak-vkorg, " Sales organization

kunnr TYPE vbak-kunnr, " Sold-to party

vbeln TYPE vbak-vbeln, " Sales document

netwr TYPE vbak-netwr, " Net Value of the Sales Order

waerk TYPE vbak-waerk, " Document currency

END OF ty_vbak.

DATA:

vbak TYPE vbak,

gt_vbak TYPE TABLE OF ty_vbak.

SELECT-OPTIONS :

s_vkorg FOR vbak-vkorg, " Sales organization

s_kunnr FOR vbak-kunnr, " Sold-to party

s_vbeln FOR vbak-vbeln. " Sales document

SELECTION-SCREEN :

SKIP, BEGIN OF LINE,COMMENT 5(27) v_1 FOR FIELD p_max.

PARAMETERS p_max(2) TYPE n DEFAULT '20' OBLIGATORY.

SELECTION-SCREEN END OF LINE.

-


INITIALIZATION.

v_1 = 'Maximum of records to read'.

-


START-OF-SELECTION.

PERFORM f_read_data.

PERFORM f_display_data.

-


Form f_read_data

-


FORM f_read_data.

SELECT vkorg kunnr vbeln netwr waerk

UP TO p_max ROWS

INTO TABLE gt_vbak

FROM vbak

WHERE kunnr IN s_kunnr

AND vbeln IN s_vbeln

AND vkorg IN s_vkorg.

ENDFORM. " F_READ_DATA

-


Form f_display_data

-


FORM f_display_data.

TYPE-POOLS: slis. " ALV Global types

DEFINE m_fieldcat.

add 1 to ls_fieldcat-col_pos.

ls_fieldcat-fieldname = &1.

ls_fieldcat-ref_tabname = 'VBAK'.

ls_fieldcat-do_sum = &2.

ls_fieldcat-cfieldname = &3.

append ls_fieldcat to lt_fieldcat.

END-OF-DEFINITION.

DEFINE m_sort.

add 1 to ls_sort-spos.

ls_sort-fieldname = &1.

ls_sort-up = 'X'.

ls_sort-subtot = &2.

append ls_sort to lt_sort.

END-OF-DEFINITION.

DATA:

ls_fieldcat TYPE slis_fieldcat_alv,

lt_fieldcat TYPE slis_t_fieldcat_alv,

lt_sort TYPE slis_t_sortinfo_alv,

ls_sort TYPE slis_sortinfo_alv,

ls_layout TYPE slis_layout_alv.

m_fieldcat 'VKORG' '' ''.

m_fieldcat 'KUNNR' '' ''.

m_fieldcat 'VBELN' '' ''.

m_fieldcat 'NETWR' 'X' 'WAERK'.

m_fieldcat 'WAERK' '' ''.

m_sort 'VKORG' 'X'. " Sort by vkorg and subtotal

m_sort 'KUNNR' 'X'. " Sort by kunnr and subtotal

m_sort 'VBELN' ''. " Sort by vbeln

ls_layout-cell_merge = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

is_layout = ls_layout

it_fieldcat = lt_fieldcat

it_sort = lt_sort

TABLES

t_outtab = gt_vbak.

ENDFORM. " F_DISPLAY_DATA[/code]

Don't forget to reward if useful....

0 Kudos

Hi Muralikrishna,

Thanks for your reply. But for the solution you provided, it is a static table which is being passed and not a dynamic table.

The report I am working on gives total and subtotal when the dynamic fields are not displayed. But when a dynamic table is passed to the REUSE_ALV_GRID, the total and subtotal do not work.

Former Member
0 Kudos

here is a ref code for dynamic table display using classes

here u need create a screen and place the custom container with name CONTAINER and remove comments to

MODULE STATUS_0100.

MODULE USER_COMMAND_0100.

in flow logic.

eample code

&----


*& Report YTEST_Dynamic tabel

*&

&----


*&

*&

&----


REPORT YTEST_FIELDCAT.

TABLES: KNA1.

DATA:

BEGIN OF FS_KNA1,

KUNNR TYPE KNA1-KUNNR,

NAME1 TYPE KNA1-NAME1,

END OF FS_KNA1,

BEGIN OF FS_VBAK,

VBELN TYPE VBAK-VBELN,

ERDAT TYPE VBAK-ERDAT,

ERNAM TYPE VBAK-ERNAM,

KUNNR TYPE KNA1-KUNNR,

END OF FS_VBAK,

BEGIN OF FS_VBAP,

VBELN TYPE VBAK-VBELN,

POSNR TYPE VBAP-POSNR,

MATNR TYPE VBAP-MATNR,

NETWR TYPE VBAP-NETWR,

END OF FS_VBAP,

BEGIN OF FS_FINAL,

KUNNR TYPE KNA1-KUNNR,

NAME1 TYPE KNA1-NAME1,

END OF FS_FINAL,

T_KNA1 LIKE STANDARD TABLE OF FS_KNA1,

T_VBAK LIKE STANDARD TABLE OF FS_VBAK,

T_VBAP LIKE STANDARD TABLE OF FS_VBAP,

T_FINAL LIKE STANDARD TABLE OF FS_FINAL,

  • Layout in Grid

FS_LAYOUT TYPE LVC_S_LAYO,

  • Sort table

T_SORT TYPE LVC_T_SORT.

DATA:

W_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,

  • " Container class

W_GRID TYPE REF TO CL_GUI_ALV_GRID,

  • " Grid class

W_MYCONTAINER TYPE SCRFNAME " Container Name

VALUE 'CONTAINER',

W_OKCODE TYPE SY-UCOMM. " Ok Code

DATA: W_INDEX(3) TYPE N.

DATA: NEW_TABLE TYPE REF TO DATA,

NEW_LINE TYPE REF TO DATA,

WA_IT_FLDCAT TYPE LVC_S_FCAT,

IT_FLDCAT TYPE LVC_T_FCAT.

TYPE-POOLS: SLIS.

FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,

<DYN_WA>,

<FS>.

SELECT-OPTIONS: S_KUNNR FOR KNA1-KUNNR.

START-OF-SELECTION.

SELECT KUNNR

NAME1

FROM KNA1

INTO TABLE T_KNA1

WHERE KUNNR IN S_KUNNR.

IF SY-SUBRC EQ 0.

SELECT VBELN

ERDAT

ERNAM

KUNNR

FROM VBAK

INTO TABLE T_VBAK

FOR ALL ENTRIES IN T_KNA1

WHERE KUNNR EQ T_KNA1-KUNNR.

IF SY-SUBRC EQ 0.

SELECT VBELN

POSNR

MATNR

NETWR

FROM VBAP

INTO TABLE T_VBAP

FOR ALL ENTRIES IN T_VBAK

WHERE VBELN EQ T_VBAK-VBELN.

ENDIF.

ENDIF.

END-OF-SELECTION.

PERFORM BUILD_CATLOG.

PERFORM BUILD_TABLE.

CALL SCREEN 100.

&----


*& Form BUILD_CATLOG

&----


  • text

----


FORM BUILD_CATLOG.

LOOP AT T_KNA1 INTO FS_KNA1.

IF SY-TABIX EQ 1.

CLEAR WA_IT_FLDCAT.

MOVE 'NAME1' TO WA_IT_FLDCAT-FIELDNAME .

WA_IT_FLDCAT-COLTEXT = WA_IT_FLDCAT-FIELDNAME.

WA_IT_FLDCAT-DATATYPE = 'CHAR'.

APPEND WA_IT_FLDCAT TO IT_FLDCAT .

CLEAR WA_IT_FLDCAT.

MOVE 'KUNNR' TO WA_IT_FLDCAT-FIELDNAME .

WA_IT_FLDCAT-DATATYPE = 'CHAR'.

WA_IT_FLDCAT-COLTEXT = WA_IT_FLDCAT-FIELDNAME.

  • WA_IT_FLDCAT-KEY = 'X'.

APPEND WA_IT_FLDCAT TO IT_FLDCAT .

LOOP AT T_VBAK INTO FS_VBAK WHERE KUNNR EQ FS_KNA1-KUNNR.

CONCATENATE 'FIELD' W_INDEX INTO

WA_IT_FLDCAT-FIELDNAME .

CONDENSE WA_IT_FLDCAT-FIELDNAME NO-GAPS.

WA_IT_FLDCAT-REF_TABLE = 'VBAK'.

WA_IT_FLDCAT-REF_FIELD = 'NETWR'.

WA_IT_FLDCAT-DO_SUM = 'X'.

WA_IT_FLDCAT-COLTEXT = WA_IT_FLDCAT-FIELDNAME.

APPEND WA_IT_FLDCAT TO IT_FLDCAT .

CLEAR WA_IT_FLDCAT.

W_INDEX = W_INDEX + 1.

ENDLOOP.

ENDIF.

ENDLOOP.

  • Create dynamic internal table and assign to FS

CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE

EXPORTING

IT_FIELDCATALOG = IT_FLDCAT

IMPORTING

EP_TABLE = NEW_TABLE.

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. "BUILD_CATLOG

&----


*& Form BUILD_TABLE

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM BUILD_TABLE .

DATA: W_COMP(20),

W_SYTABIX(3) TYPE N.

LOOP AT T_KNA1 INTO FS_KNA1.

ASSIGN COMPONENT 'NAME1' OF STRUCTURE <DYN_WA> TO <FS>.

<FS> = FS_KNA1-NAME1.

ASSIGN COMPONENT 'KUNNR' OF STRUCTURE <DYN_WA> TO <FS>.

<FS> = FS_KNA1-KUNNR.

LOOP AT T_VBAK INTO FS_VBAK WHERE KUNNR EQ FS_KNA1-KUNNR.

CONCATENATE 'FIELD' W_SYTABIX INTO W_COMP.

CONDENSE W_COMP.

ASSIGN COMPONENT W_COMP OF STRUCTURE <DYN_WA> TO <FS>.

<FS> = FS_VBAK-VBELN.

W_SYTABIX = W_SYTABIX + 1.

ENDLOOP.

APPEND <dyn_wa> TO <dyn_table>.

CLEAR W_SYTABIX.

ENDLOOP.

ENDFORM. " BUILD_TABLE

&----


*& Module STATUS_0100 OUTPUT

&----


  • text

----


MODULE STATUS_0100 OUTPUT.

SET PF-STATUS 'TES'.

SET TITLEBAR 'TES'.

PERFORM FILL_LAYOUT.

IF CL_GUI_ALV_GRID=>OFFLINE( ) IS INITIAL.

IF W_CUSTOM_CONTAINER IS INITIAL.

  • Create a custom container control for our ALV Control

CREATE OBJECT W_CUSTOM_CONTAINER

EXPORTING

CONTAINER_NAME = W_MYCONTAINER

EXCEPTIONS

CNTL_ERROR = 1

CNTL_SYSTEM_ERROR = 2

CREATE_ERROR = 3

LIFETIME_ERROR = 4

LIFETIME_DYNPRO_DYNPRO_LINK = 5.

CREATE OBJECT W_GRID

EXPORTING I_PARENT = W_CUSTOM_CONTAINER.

  • Sort table by two levels of hierarchy

REFRESH T_SORT.

PERFORM PREPARE_SORTTABLE CHANGING T_SORT.

CALL METHOD W_GRID->SET_TABLE_FOR_FIRST_DISPLAY

EXPORTING

IS_LAYOUT = FS_LAYOUT

CHANGING

IT_OUTTAB = <DYN_TABLE>

IT_FIELDCATALOG = IT_FLDCAT[]

IT_SORT = T_SORT[]

EXCEPTIONS

INVALID_PARAMETER_COMBINATION = 1

PROGRAM_ERROR = 2

TOO_MANY_LINES = 3

OTHERS = 4.

ENDIF. " IF w_custom_container..

ENDIF. " IF CL_GUI_ALV_GRID..

ENDMODULE. " STATUS_0100 OUTPUT

&----


*& Module USER_COMMAND_0100 INPUT

&----


  • GUI Status for the ALV Grid

----


MODULE USER_COMMAND_0100 INPUT.

W_OKCODE = SY-UCOMM.

CASE W_OKCODE.

WHEN 'EXIT'. " WHEN clicks on EXIT button

PERFORM EXIT_PROGRAM.

LEAVE PROGRAM.

WHEN 'BACK'. " WHEN clicks on BACK button

PERFORM EXIT_PROGRAM.

LEAVE TO SCREEN 0.

WHEN 'CANC'. " WHEN clicks on CANCEL button

PERFORM EXIT_PROGRAM.

LEAVE TO SCREEN 0.

ENDCASE. " CASE w_ucomm.

CLEAR W_OKCODE.

ENDMODULE. " USER_COMMAND_0100 INPUT

&----


*& Form FILL_LAYOUT

&----


  • Filling the layout

----


  • No interface parameters to be passed to this sub routine

----


FORM FILL_LAYOUT .

FS_LAYOUT-CWIDTH_OPT = 'X'.

FS_LAYOUT-SEL_MODE = 'A'.

FS_LAYOUT-GRID_TITLE = 'TEST FIELDCAT'.

ENDFORM. " FILL_LAYOUT

&----


*& Form EXIT_PROGRAM

&----


  • Making the container free

----


  • There are no interface parameters to be passed to this routine

----


FORM EXIT_PROGRAM .

CALL METHOD W_CUSTOM_CONTAINER->FREE.

CALL METHOD CL_GUI_CFW=>FLUSH.

ENDFORM. " EXIT_PROGRAM

&----


*& Form PREPARE_SORTTABLE

&----


  • Sort the table by hierarchy levels one and two

----


  • <--P_T_SORT Sort table

----


FORM PREPARE_SORTTABLE CHANGING PV_T_SORT TYPE LVC_T_SORT.

  • Structure for sort table

DATA:

LFS_SORT TYPE LVC_S_SORT.

  • LFS_SORT-SPOS = '1'.

  • LFS_SORT-FIELDNAME = 'KUNNR'.

  • LFS_SORT-UP = 'X'.

  • LFS_SORT-SUBTOT = 'X'.

  • APPEND LFS_SORT TO PV_T_SORT.

CLEAR LFS_SORT.

LFS_SORT-SPOS = '1'.

LFS_SORT-FIELDNAME = 'NAME1'.

LFS_SORT-UP = 'X'.

LFS_SORT-SUBTOT = 'X'.

APPEND LFS_SORT TO PV_T_SORT.

ENDFORM. " PREPARE_SORTTABLE