Subtotal in custom report
I am new to ABAP. I have had no training, but am eager to learn... The following was written with help from learn ABAP in 21 days.
I have written a report - rather basic, and I would like to add subtotals, at the kunnr level.
I am unsure on the best way to go about this. I have searched through the ABAP Forum, and found some information on a collect statement.
My questions are:
Is the collect statement the best sub-routine for a report?
Where is the best place in the report to add a collect statement?
Also, when I run the report, the first selection is repeated in the report, once generated. How can this be removed?
Can anyone point me in the direction of a good online repository for abap code help?
You must excuse this coding as it is my first attempt at writing ABAP. Any suggestions for ammendments to improve the report would be gratefully appreciated.
REPORT zdebt NO STANDARD PAGE HEADING.
TABLES: bsid,
kna1,
knb5,
vbrp.
DATA: BEGIN OF idat OCCURS 0,
bukrs LIKE bsid-bukrs,
kunnr LIKE bsid-kunnr,
blart LIKE bsid-blart,
mahna LIKE knb5-mahna,
mansp LIKE knb5-mansp,
mahns LIKE knb5-mahns,
xblnr LIKE bsid-xblnr,
vbeln LIKE vbrp-vbeln,
bldat LIKE bsid-bldat,
sgtxt LIKE bsid-sgtxt,
wrbtr LIKE bsid-wrbtr,
name1 LIKE kna1-name1,
gjahr LIKE bsid-gjahr,
vkgrp LIKE vbrp-vkgrp,
vkbur LIKE vbrp-vkbur,
shkzg LIKE bsid-shkzg,
END OF idat.
DATA: record_count TYPE n,
kunnr_total TYPE n.
*Start-of-selection-----------------------------------------------------
START-OF-SELECTION.
SELECT-OPTIONS bukrs FOR idat-bukrs.
SELECT-OPTIONS kunnr FOR idat-kunnr.
SELECT-OPTIONS mahna FOR idat-mahna.
SELECT-OPTIONS mansp FOR idat-mansp.
SELECT-OPTIONS mahns FOR idat-mahns.
SELECT-OPTIONS vkgrp FOR idat-vkgrp.
SELECT-OPTIONS vkbur FOR idat-vkbur.
SELECT-OPTIONS blart FOR idat-blart.
*Parameters-------------------------------------------------------------
PARAMETER max_recs LIKE record_count.
*Initialisation---------------------------------------------------------
INITIALIZATION.
record_count = 0.
max_recs = 1000.
*Top-of-page------------------------------------------------------------
TOP-OF-PAGE.
WRITE: /1 sy-title,
50 'Date:',
sy-datum,
70 'Page No.',
sy-pagno.
ULINE.
WRITE: /1 'Customer No.',
15 'Name',
50 'Billing Number',
65 'Date',
85 'Amount',
98 'Doc',
105 'Text'.
ULINE.
*Start-of-Selection-----------------------------------------------------
Clear: idat.
START-OF-SELECTION.
SELECT bsid~kunnr bsid~bukrs bsid~wrbtr bsid~bldat bsid~blart
bsid~mansp knb5~mansp knb5~mahna kna1~name1 bsid~shkzg
vbrp~vkgrp vbrp~vkbur bsid~sgtxt vbrp~vbeln
INTO CORRESPONDING FIELDS OF TABLE idat
FROM ( bsid INNER JOIN knb5 ON bsid~kunnr = knb5~kunnr
INNER JOIN kna1 ON bsid~kunnr = kna1~kunnr
LEFT OUTER JOIN vbrp ON vbrp~vbeln = bsid~vbeln )
WHERE bsid~kunnr = knb5~kunnr
ORDER BY bsid~kunnr ASCENDING.
LOOP AT idat.
*Show credit value as credit amount
IF idat-shkzg = 'S'.
idat-wrbtr = idat-wrbtr.
ELSE.
idat-wrbtr = - ( idat-wrbtr ).
ENDIF.
*Subtotal by Customer Number
FORMAT HOTSPOT ON.
WRITE:/1 idat-kunnr, 15 idat-name1, 50 idat-vbeln, 65 idat-bldat,
79 idat-shkzg, 80 idat-wrbtr, 100 idat-blart, 105 idat-sgtxt.
HIDE: idat-bukrs, idat-gjahr, idat-kunnr.
FORMAT HOTSPOT OFF.
CLEAR: idat.
ENDLOOP.
*End of Selection-------------------------------------------------------
*At Line-Selection------------------------------------------------------
AT LINE-SELECTION.
SET PARAMETER ID 'KUN' FIELD idat-kunnr.
SET PARAMETER ID 'BUK' FIELD idat-bukrs.
CALL TRANSACTION 'FBL5N' AND SKIP FIRST SCREEN.
Once complete I will post the corrected code for all who wish to use it.
Many thanks.
Baz
add this logic .. ( warning, will give syntax error since this is coming out of my head and not checked)
..
check for shkzg (don't remember which is which tho') ..
if shkzg = 'S' ..
sum = sum + wrtbr
else
sum = sum + ( wrtbr * -1 )
at end of kunnr.
write: / 'Total: ' , sum .
clear: sum.
endat.
endloop.
I have added the subtotal and grand total to the report. see coding...
IF idat-shkzg = 'S'.
idat-wrbtr = idat-wrbtr.
ELSE.
idat-wrbtr = ( idat-wrbtr * -1 ).
ENDIF.
AT END OF kunnr.
SUM.
WRITE: /'Customer Total', 80 idat-wrbtr.
ULINE.
CLEAR: sum.
ENDAT.
*In the last Loop run, final total
AT LAST.
SUM.
WRITE: /'Overall Total:', 80 idat-wrbtr.
ENDAT.
ENDLOOP.
unforunately, it adds up all the amounts, but does not take into account debits and crtedits.
Is there an easy way around this?
I have searched help.sap.com but I can only find info on sum function.
Has anyone any ideas on this?
Regards.
Baz
Try this,
Hi
For coding examples and best practice have look into ittoolbox.com
there u will good good coding examples.
Regards
RK
You could have a look too. WS_QUERY is used for presentation server and not application server!
I'd like to thank Guest(?) .....
IF idat-shkzg = 'S'.
idat-wrbtr = idat-wrbtr.
ELSE.
idat-wrbtr = ( idat-wrbtr * -1 ).
modify idat transporting wrbtr.
ENDIF.
...
and wiraone ... check for shkzg (don't remember which is which tho') ..
if shkzg = 'S' ..
sum = sum + wrtbr
else
sum = sum + ( wrtbr * -1 )
at end of kunnr.
write: / 'Total: ' , sum .
clear: sum.
endat.
My report is now finished, complete and working. Thanks for taking the time to respond and assist me with this. I couldn't have done it without your help.
Regards.
Barry
I enclose the code for all to ammend and use.
*&---------------------------------------------------------------------*
*& Report ZDEBT *
*& DESCRIPTION: New Program for reporting on Dunning/Debt Recovery. *
*& *
*&---------------------------------------------------------------------*
*Set style, tables for look up, creation of temporary table & constants
REPORT zdebt NO STANDARD PAGE HEADING.
TABLES: bsid,
kna1,
knb5,
vbrp.
DATA: BEGIN OF idat OCCURS 100,
bukrs LIKE bsid-bukrs,
kunnr LIKE bsid-kunnr,
blart LIKE bsid-blart,
mahna LIKE knb5-mahna,
mansp LIKE knb5-mansp,
mahns LIKE knb5-mahns,
xblnr LIKE bsid-xblnr,
vbeln LIKE vbrp-vbeln,
bldat LIKE bsid-bldat,
sgtxt LIKE bsid-sgtxt,
wrbtr LIKE bsid-wrbtr,
name1 LIKE kna1-name1,
gjahr LIKE bsid-gjahr,
vkgrp LIKE vbrp-vkgrp,
vkbur LIKE vbrp-vkbur,
shkzg LIKE bsid-shkzg,
zterm LIKE bsid-zterm,
END OF idat.
DATA: sum LIKE bsid-wrbtr,
total LIKE bsid-wrbtr,
record_count TYPE n.
*Selection screen fields -> goto->text elements->selection texts
*obligatoty function makes selection field mandatory
*Start-of-selection-----------------------------------------------------
START-OF-SELECTION.
SELECT-OPTIONS co_code FOR bsid-bukrs OBLIGATORY.
SELECT-OPTIONS customer FOR bsid-kunnr OBLIGATORY.
SELECT-OPTIONS dun_prc FOR knb5-mahna OBLIGATORY.
SELECT-OPTIONS dun_blk FOR knb5-mansp.
SELECT-OPTIONS dun_lvl FOR knb5-mahns.
SELECT-OPTIONS sls_grp FOR vbrp-vkgrp.
SELECT-OPTIONS sls_off FOR vbrp-vkbur.
SELECT-OPTIONS doc_type FOR bsid-blart.
SELECT-OPTIONS blne_dte FOR bsid-bldat.
SELECT-OPTIONS blk_dun FOR bsid-mansp.
SELECT-OPTIONS lvl_dun FOR bsid-manst.
*Parameters-------------------------------------------------------------
PARAMETER max_recs LIKE record_count.
*Initialisation---------------------------------------------------------
INITIALIZATION.
record_count = 0.
max_recs = 1000.
*Create report headers and position on page
*Top-of-page------------------------------------------------------------
TOP-OF-PAGE.
WRITE: /1 sy-title,
50 'Date:',
sy-datum,
70 'Page No.',
sy-pagno.
ULINE.
WRITE: /1 'Customer No.',
15 'Name',
50 'Billing Number',
65 'Date',
85 'Amount',
98 'Doc',
105 'Text'.
ULINE.
*Select fields, table joins, selection fields and extract to temporary
*idat table
*Start-of-Selection-----------------------------------------------------
START-OF-SELECTION.
CLEAR: idat.
SELECT bsid~kunnr bsid~bukrs bsid~wrbtr bsid~bldat bsid~blart
bsid~mansp knb5~mansp knb5~mahna kna1~name1 bsid~shkzg
vbrp~vkgrp vbrp~vkbur bsid~sgtxt vbrp~vbeln bsid~zterm
bsid~xblnr
INTO CORRESPONDING FIELDS OF TABLE idat
FROM ( bsid INNER JOIN knb5 ON bsid~kunnr = knb5~kunnr
INNER JOIN kna1 ON bsid~kunnr = kna1~kunnr
LEFT OUTER JOIN vbrp ON bsid~vbeln = vbrp~vbeln )
WHERE bsid~kunnr IN customer
AND bsid~bukrs IN co_code
AND knb5~mahna IN dun_prc
AND knb5~mansp IN dun_lvl
AND knb5~mahns IN dun_blk
AND bsid~blart IN doc_type
AND bsid~bldat IN blne_dte
AND bsid~mansp IN lvl_dun
AND bsid~manst IN blk_dun
*Sort table by customer number
ORDER BY bsid~kunnr ASCENDING.
*remove duplicate records
DELETE ADJACENT DUPLICATES
FROM idat
COMPARING kunnr xblnr vbeln bukrs bldat sgtxt zterm.
CLEAR: idat.
LOOP AT idat.
IF sy-subrc = 0.
record_count = record_count + 1.
ENDIF.
*Show credit value as credit amount
*Subtotal (sum) by Customer Number
IF idat-shkzg = 'S'.
idat-wrbtr = idat-wrbtr.
ELSE.
idat-wrbtr = ( idat-wrbtr * -1 ).
MODIFY idat TRANSPORTING wrbtr.
ENDIF.
*Hotspot for drill down
FORMAT HOTSPOT ON.
WRITE:/1 idat-kunnr, 15 idat-name1, 50 idat-vbeln, 65 idat-bldat,
80 idat-wrbtr, 100 idat-blart, 105 idat-sgtxt.
HIDE: idat-bukrs, idat-gjahr, idat-kunnr.
FORMAT HOTSPOT OFF.
*Subtotal by customer number
AT END OF kunnr.
SUM.
WRITE: /'Customer Total', 80 idat-wrbtr.
ULINE.
CLEAR: sum.
ENDAT.
*In the last Loop run, final total
AT LAST.
SUM.
WRITE: /'Overall Total:', 80 idat-wrbtr.
ENDAT.
ENDLOOP.
*Call FBL5N, enter customer number and company code
*At Line-Selection------------------------------------------------------
AT LINE-SELECTION.
SET PARAMETER ID 'KUN' FIELD idat-kunnr.
SET PARAMETER ID 'BUK' FIELD idat-bukrs.
CALL TRANSACTION 'FBL5N' AND SKIP FIRST SCREEN.