02-01-2008 2:37 AM
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.
02-01-2008 2:59 AM
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
02-01-2008 3:06 AM
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....
02-01-2008 5:31 AM
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.
02-01-2008 7:14 AM
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