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

WRONG OUTPUT

Former Member
0 Likes
1,325

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.

1 ACCEPTED SOLUTION
Read only

deepak_dhamat
Active Contributor
0 Likes
1,263

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.

13 REPLIES 13
Read only

deepak_dhamat
Active Contributor
0 Likes
1,264

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.

Read only

0 Likes
1,263

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.

Read only

0 Likes
1,263

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

Read only

0 Likes
1,263

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.

Read only

0 Likes
1,263

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

Read only

0 Likes
1,263

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.

Read only

0 Likes
1,263

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

Read only

0 Likes
1,263

<sorry wrong post>

Read only

deepak_dhamat
Active Contributor
0 Likes
1,263

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.

Read only

0 Likes
1,263

Hi, thanks for your reply

but am getting error

at


append  it_coll  using  wa_coll . " wa_coll is not table with occurs n

Read only

0 Likes
1,263

Hi ,

append internal table it_coll using your work area .

regards

Deepak.

Read only

matt
Active Contributor
0 Likes
1,263

Moderator message Please use a meaningful subject, and do not put it in ALL CAPITALS.

matt

Read only

Former Member
0 Likes
1,263

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.