‎2011 Oct 11 11:53 AM
Hi all,
i am getting wrong output when executing the below code
i.e the output is coming regard less of the order number in select statement.
Kindly please help me.
REPORT ZTEMP2.
TYPES: BEGIN OF TY_BKPF,
MONAT TYPE MONAT,
BUDAT TYPE BUDAT,
BELNR TYPE BELNR_D,
GJAHR TYPE GJAHR,
BUKRS TYPE BUKRS,
END OF TY_BKPF.
TYPES: BEGIN OF TY_BSEG,
BUKRS TYPE BUKRS,
BELNR TYPE BELNR_D,
GJAHR TYPE GJAHR,
HKONT TYPE HKONT,
WRBTR TYPE WRBTR,
SGTXT TYPE SGTXT,
AUFNR TYPE AUFNR,
END OF TY_BSEG.
TYPES: BEGIN OF TY_COLL,
MONAT TYPE MONAT,
BUDAT TYPE BUDAT,
BELNR TYPE BELNR_D,
WRBTR TYPE WRBTR,
SGTXT TYPE SGTXT,
END OF TY_COLL.
DATA: TOT LIKE BSEG-WRBTR.
DATA: IT_BKPF TYPE TABLE OF TY_BKPF,
WA_BKPF TYPE TY_BKPF,
IT_BSEG TYPE TABLE OF TY_BSEG,
WA_BSEG TYPE TY_BSEG,
IT_COLL TYPE TABLE OF TY_COLL,
WA_COLL TYPE TY_COLL.
SELECTION-SCREEN: BEGIN OF BLOCK B1.
SELECT-OPTIONS: S_HKONT FOR WA_BSEG-HKONT memory id one,
S_AUFNR FOR WA_BSEG-AUFNR memory id twq,
S_BELNR FOR WA_BKPF-BELNR memory id twe,
S_BUDAT FOR WA_BKPF-BUDAT memory id two.
SELECTION-SCREEN: END OF BLOCK B1.
START-OF-SELECTION.
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF
WHERE BELNR IN S_BELNR
AND BUDAT IN S_BUDAT.
IF NOT IT_BKPF[] IS INITIAL.
SELECT BUKRS
BELNR
GJAHR
HKONT
WRBTR
SGTXT
AUFNR FROM BSEG
INTO TABLE IT_BSEG
FOR ALL ENTRIES IN IT_BKPF
WHERE HKONT IN S_HKONT
AND AUFNR IN S_AUFNR
AND BELNR IN S_BELNR
AND GJAHR = IT_BKPF-GJAHR
AND BUKRS = IT_BKPF-BUKRS.
ENDIF.
END-OF-SELECTION.
SORT IT_BKPF BY MONAT.
SORT IT_BSEG BY HKONT.
LOOP AT IT_BKPF INTO WA_BKPF.
Read table IT_BSEG INTO WA_BSEG WITH KEY BUKRS = WA_BKPF-BUKRS
BELNR = WA_BKPF-BELNR
GJAHR = WA_BKPF-GJAHR BINARY SEARCH.
WA_COLL-BELNR = WA_BKPF-BELNR.
WA_COLL-BUDAT = WA_BKPF-BUDAT.
WA_COLL-WRBTR = WA_BSEG-WRBTR.
WA_COLL-SGTXT = WA_BSEG-SGTXT.
WA_COLL-MONAT = WA_BKPF-MONAT.
COLLECT WA_COLL INTO IT_COLL.
CLEAR: WA_BKPF, WA_BSEG.
ENDLOOP.
SORT IT_COLL BY MONAT.
LOOP AT IT_COLL INTO WA_COLL.
WRITE:/06 WA_COLL-BELNR,
22 WA_COLL-BUDAT,
32 WA_COLL-WRBTR,
54 WA_COLL-SGTXT.
AT end of MONAT.
SUM.
WRITE:/ WA_COLL-MONAT.
WRITE:32 WA_COLL-WRBTR.
ENDAT.
ENDLOOP.
Thanks in advance,
ben2012.
‎2011 Oct 11 12:01 PM
Hi ,
IF you don't pass order no still it will execute the code because you have Used select-options : S_AUFNR FOR bseg-aufnr without Obligatory .
Either use PARAMETER for single value and make it obligatory and passvalue .
I think you should Go For INNER JOIN on BSEG and BKPF .
regards
Deepak.
‎2011 Oct 11 12:01 PM
Hi ,
IF you don't pass order no still it will execute the code because you have Used select-options : S_AUFNR FOR bseg-aufnr without Obligatory .
Either use PARAMETER for single value and make it obligatory and passvalue .
I think you should Go For INNER JOIN on BSEG and BKPF .
regards
Deepak.
‎2011 Oct 11 12:05 PM
Hi thanks for your reply,
but i am entering all the fields in the selection screen.
Even though i am getting data based on date only (i.e it is not considering order number)
And bseg is not allowed for innerjoin..
Kindly suggest me.
Regards,
ben.
‎2011 Oct 11 12:14 PM
Hi,
In the select, please select in the below order (key fields first)
SELECT BUKRS
BELNR
GJAHR
BUDAT
MONAT
FROM BKPF
INTO TABLE IT_BKPF
WHERE BELNR IN S_BELNR
AND BUDAT IN S_BUDAT.
Edited by: Ashwin Kumar Chitram on Oct 11, 2011 1:15 PM
‎2011 Oct 11 12:42 PM
Hi Ben,
Your code works as expected. Although i wish to highlight some corrections as shown below.. apply it and try if it suits your requirement...
SELECT BUKRS
BELNR
GJAHR
HKONT
WRBTR
SGTXT
AUFNR FROM BSEG
INTO TABLE IT_BSEG
WHERE HKONT IN S_HKONT
AND AUFNR IN S_AUFNR
AND BELNR IN S_BELNR.
IF NOT IT_BSEG[] IS INITIAL.
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF
FOR ALL ENTRIES IN IT_BSEG
WHERE BELNR = IT_BSEG-BELNR
AND BUKRS = IT_BSEG-BUKRS
AND GJAHR = IT_BSEG-GJAHR
AND BUDAT IN S_BUDAT.
ENDIF.
END-OF-SELECTION.
SORT IT_BKPF BY MONAT.
SORT IT_BSEG BY HKONT.
*Looping at bseg will aggregate amount of all the items of an acoounting document.
*LOOP AT IT_BKPF INTO WA_BKPF.
LOOP AT IT_BSEG INTO WA_BSEG.
* READ TABLE IT_BSEG INTO WA_BSEG WITH KEY BUKRS = WA_BKPF-BUKRS
* BELNR = WA_BKPF-BELNR
* GJAHR = WA_BKPF-GJAHR
* BINARY SEARCH.
READ TABLE IT_BKPF INTO WA_BKPF WITH KEY BUKRS = WA_BSEG-BUKRS
BELNR = WA_BSEG-BELNR
GJAHR = WA_BSEG-GJAHR
BINARY SEARCH.
WA_COLL-BELNR = WA_BKPF-BELNR.
WA_COLL-BUDAT = WA_BKPF-BUDAT.
WA_COLL-WRBTR = WA_BSEG-WRBTR.
WA_COLL-SGTXT = WA_BSEG-SGTXT.
WA_COLL-MONAT = WA_BKPF-MONAT.
COLLECT WA_COLL INTO IT_COLL.
CLEAR: WA_BKPF, WA_BSEG.
ENDLOOP.
As as indicated above...make the select-options s_aufnr mandatory...
Hope it helps you.
‎2011 Oct 12 5:07 AM
Hi,
I tried this way to calculcate opening balance,
but it is not working kindly suggest me.
REPORT ZTEMP1.
" Types Declaration part
TYPES: BEGIN OF TY_COLL,
MONAT TYPE MONAT,
BUDAT TYPE BUDAT,
BELNR TYPE BELNR_D,
WRBTR TYPE WRBTR,
SGTXT TYPE SGTXT,
TOT TYPE WRBTR,
END OF TY_COLL.
DATA: TOT LIKE BSEG-WRBTR.
DATA: IT_BKPF TYPE TABLE OF TY_BKPF,
WA_BKPF TYPE TY_BKPF,
IT_BSEG TYPE TABLE OF TY_BSEG,
WA_BSEG TYPE TY_BSEG,
IT_BKPF1 TYPE TABLE OF TY_BKPF1,
WA_BKPF1 TYPE TY_BKPF1,
IT_BSEG1 TYPE TABLE OF TY_BSEG1,
WA_BSEG1 TYPE TY_BSEG1,
IT_COLL TYPE TABLE OF TY_COLL,
WA_COLL TYPE TY_COLL.
SELECTION-SCREEN: BEGIN OF BLOCK B1.
SELECT-OPTIONS: S_HKONT FOR WA_BSEG-HKONT memory id one,
S_AUFNR FOR WA_BSEG-AUFNR memory id twq,
S_BELNR FOR WA_BKPF-BELNR memory id twe,
S_BUDAT FOR WA_BKPF-BUDAT memory id two.
SELECTION-SCREEN: END OF BLOCK B1.
START-OF-SELECTION.
PERFORM SELECT1.
PERFORM OPB.
END-OF-SELECTION.
PERFORM P_SELECT1.
PERFORM P_OPB.
PERFORM P_COLL.
*&---------------------------------------------------------------------*
*& Form SELECT1
*&---------------------------------------------------------------------*
FORM SELECT1 .
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF
WHERE BELNR IN S_BELNR
AND BUDAT IN S_BUDAT.
IF NOT IT_BKPF[] IS INITIAL.
SELECT BUKRS
BELNR
GJAHR
HKONT
WRBTR
SGTXT
AUFNR FROM BSEG
INTO TABLE IT_BSEG
FOR ALL ENTRIES IN IT_BKPF
WHERE HKONT IN S_HKONT
AND AUFNR IN S_AUFNR
AND BELNR = IT_BKPF-BELNR
AND GJAHR = IT_BKPF-GJAHR
AND BUKRS = IT_BKPF-BUKRS.
ENDIF.
ENDFORM. " SELECT1
*&---------------------------------------------------------------------*
*& Form OPB
*&---------------------------------------------------------------------*
FORM OPB .
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF1
WHERE BELNR IN S_BELNR
AND BUDAT < S_BUDAT+3(8).
IF NOT IT_BKPF1[] IS INITIAL.
SELECT BUKRS
BELNR
GJAHR
HKONT
WRBTR
SGTXT
AUFNR FROM BSEG
INTO TABLE IT_BSEG1
FOR ALL ENTRIES IN IT_BKPF1
WHERE HKONT IN S_HKONT
AND AUFNR IN S_AUFNR
AND BELNR = IT_BKPF1-BELNR
AND GJAHR = IT_BKPF1-GJAHR
AND BUKRS = IT_BKPF1-BUKRS.
ENDIF.
ENDFORM. " OPB
*&---------------------------------------------------------------------*
*& Form P_SELECT1
*&---------------------------------------------------------------------*
FORM P_SELECT1 .
SORT IT_BKPF BY MONAT.
SORT IT_BSEG BY HKONT.
LOOP AT IT_BSEG INTO WA_BSEG.
READ TABLE IT_BKPF INTO WA_BKPF WITH KEY BUKRS = WA_BSEG-BUKRS
BELNR = WA_BSEG-BELNR
GJAHR = WA_BSEG-GJAHR BINARY SEARCH.
IF sy-subrc EQ 0.
WA_COLL-BELNR = WA_BKPF-BELNR.
WA_COLL-BUDAT = WA_BKPF-BUDAT.
WA_COLL-WRBTR = WA_BSEG-WRBTR.
WA_COLL-SGTXT = WA_BSEG-SGTXT.
WA_COLL-MONAT = WA_BKPF-MONAT.
COLLECT WA_COLL INTO IT_COLL.
endif.
CLEAR: WA_BKPF, WA_BSEG.
ENDLOOP.
ENDFORM. " P_SELECT1
*&---------------------------------------------------------------------*
*& Form P_OPB
*&---------------------------------------------------------------------*
FORM P_OPB .
SORT IT_BKPF1 BY MONAT.
SORT IT_BSEG1 BY HKONT.
LOOP AT IT_BSEG1 INTO WA_BSEG1.
READ TABLE IT_BKPF1 INTO WA_BKPF1 WITH KEY BUKRS = WA_BSEG1-BUKRS
BELNR = WA_BSEG1-BELNR
GJAHR = WA_BSEG1-GJAHR BINARY SEARCH.
IF sy-subrc EQ 0.
WA_COLL-TOT = WA_BSEG1-WRBTR.
COLLECT WA_COLL INTO IT_COLL.
endif.
CLEAR: WA_BKPF1, WA_BSEG1.
ENDLOOP.
ENDFORM. " P_OPB
*&---------------------------------------------------------------------*
*& Form P_COLL
*&---------------------------------------------------------------------*
FORM P_COLL .
SORT IT_COLL BY MONAT.
LOOP AT IT_COLL INTO WA_COLL.
WRITE:/06 WA_COLL-BELNR,
22 WA_COLL-BUDAT,
32 WA_COLL-WRBTR,
54 WA_COLL-SGTXT.
AT end of MONAT.
SUM.
WRITE:/ WA_COLL-MONAT.
WRITE:32 WA_COLL-WRBTR.
WRITE: WA_COLL-TOT. " getting value 0
ENDAT.
ENDLOOP.
ENDFORM. " P_COLL
‎2011 Oct 12 5:37 AM
Hi Ben,
I went through your code and found some inconsistencies as listed below....
1. What are you trying to achieve with this condition BUDAT < S_BUDAT+3(8) in the select query? S_BUDAT is an internal table with header line and this condition will only take the value available in the header line into consideration and leave other values if your select options has multiple entries.
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF1
WHERE BELNR IN S_BELNR
AND BUDAT < S_BUDAT+3(8).
2. Before using READ TABLE...BINARY SEARCH, the internal table should be sorted with the key used for reading it. In the below case IT_BKPF is read with BUKRS,BELNR and GJAHR as key with binary search and sorted only with MONAT ! There exists possibilities of failure of the read statement.
SORT IT_BKPF BY MONAT.
SORT IT_BSEG BY HKONT.
READ TABLE IT_BKPF INTO WA_BKPF WITH KEY BUKRS = WA_BSEG-BUKRS
BELNR = WA_BSEG-BELNR
GJAHR = WA_BSEG-GJAHR BINARY SEARCH.
3. Indicated that you are getting zero for
WRITE: WA_COLL-TOT. " getting value 0 ...
The value for WA_COLL-TOT is passed inside the form p_opb ... there may be a failure of read statement due to the reason indicated in point 2 or failure of select queries in point 1 and subsequent from BSEG. Correct the program accordingly and check.
FORM P_OPB .
SORT IT_BKPF1 BY MONAT.
SORT IT_BSEG1 BY HKONT.
LOOP AT IT_BSEG1 INTO WA_BSEG1.
READ TABLE IT_BKPF1 INTO WA_BKPF1 WITH KEY BUKRS = WA_BSEG1-BUKRS
BELNR = WA_BSEG1-BELNR
GJAHR = WA_BSEG1-GJAHR BINARY SEARCH.
IF sy-subrc EQ 0.
WA_COLL-TOT = WA_BSEG1-WRBTR.
COLLECT WA_COLL INTO IT_COLL.
endif.
CLEAR: WA_BKPF1, WA_BSEG1.
ENDLOOP.
ENDFORM. " P_OPB
All the Best.
‎2011 Oct 12 5:54 AM
Here i am trying to calculate opening balance i.e <s_budat,
SELECT MONAT
BUDAT
BELNR
GJAHR
BUKRS FROM BKPF
INTO TABLE IT_BKPF1
WHERE BELNR IN S_BELNR
AND BUDAT < S_BUDAT. " here
‎2011 Oct 12 5:57 AM
‎2011 Oct 11 12:13 PM
Hi ,
1)Before passign BKPF data to BSEG . delete duplicate reocrds .
LOOP AT IT_BKPF INTO WA_BKPF.
Read table IT_BSEG INTO WA_BSEG WITH KEY BUKRS = WA_BKPF-BUKRS
BELNR = WA_BKPF-BELNR
GJAHR = WA_BKPF-GJAHR BINARY SEARCH.
IF sy-subrc = 0 .
WA_COLL-BELNR = WA_BKPF-BELNR.
WA_COLL-BUDAT = WA_BKPF-BUDAT.
WA_COLL-WRBTR = WA_BSEG-WRBTR.
WA_COLL-SGTXT = WA_BSEG-SGTXT.
WA_COLL-MONAT = WA_BKPF-MONAT.
append it_coll using wa_coll .
endif.
CLEAR: WA_BKPF, WA_BSEG wa_coll.
ENDLOOP.
regards
Deepak.
‎2011 Oct 11 12:20 PM
Hi, thanks for your reply
but am getting error
at
append it_coll using wa_coll . " wa_coll is not table with occurs n
‎2011 Oct 11 12:30 PM
Hi ,
append internal table it_coll using your work area .
regards
Deepak.
‎2011 Oct 11 12:34 PM
Moderator message Please use a meaningful subject, and do not put it in ALL CAPITALS.
matt
‎2011 Oct 11 1:03 PM
Hi,
Logic... you didn't check the subrc field after reading your IT_BSEG table...
Read table IT_BSEG INTO WA_BSEG WITH KEY BUKRS = WA_BKPF-BUKRS
BELNR = WA_BKPF-BELNR
GJAHR = WA_BKPF-GJAHR BINARY SEARCH.
IF sy-subrc EQ 0.
"...
ENDIF.
Kr,
m.