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: 

Loop at...where problem

Former Member
0 Kudos

Hi,

SELECT-OPTIONS: SO_KUNNR FOR KNA1-KUNNR OBLIGATORY.

SORT IT_BSID1 BY KUNNR.

SORT IT_KNA1 BY KUNNR.

SORT IT_OPBAL BY KUNNR.

LOOP AT IT_KNA1 INTO WA_KNA1.

CLEAR : WA_OUTPUT.

WA_OUTPUT-KUNNR = WA_KNA1-KUNNR.

WA_OUTPUT-NAME1 = WA_KNA1-NAME1.

READ TABLE IT_OPBAL WITH KEY KUNNR = WA_KNA1-KUNNR

BINARY SEARCH.

IF SY-SUBRC = 0.

WA_OUTPUT-OPNBAL = IT_OPBAL-LC_BAL.

ENDIF.

LOOP AT IT_BSID1 INTO WA_BSID1 WHERE KUNNR = WA_KNA1-KUNNR.

IF SY-SUBRC = 0.

CASE WA_BSID1-BLART.

WHEN 'RV'.

IF WA_BSID1-SHKZG = 'S'.

WA_OUTPUT-SALE = WA_BSID1-DMBTR.

ENDIF.

ENDLOOP.

ENDLOOP.

Both WA_KNA1 AND WA_BSID1 contains the same KUNNR .

But after LOOP AT .....WHERE i am not getting SY-SUBRC = 0.

For example if i give the KUNNR = 2 in the selection-screen everything is fine but if i give KUNNR = 7002 in the selection-screen the above problem is arising.

when i checked in debugging at

LOOP AT ...WHERE statement

wa_kna1-kunnr = 0000007002 and wa_bsid1-kunnr = 0000007002.But iam getting sy-subrc = 8. Please suggest soln .

Thanks and Regards

Venkat

5 REPLIES 5

ThomasZloch
Active Contributor
0 Kudos

I don't think that LOOP is setting SY-SUBRC inside the loop. Which means that in some cases SY-SUBRC ne 0 could "survive" from the preceding READ statement (no entry in IT_OPBAL).

From my point of view you can remove the IF SY-SUBRC = 0 statement inside the LOOP AT IT_BSID1 altogether, because you will not be inside the loop anymore, should SY-SUBRC be not equal 0.

Thomas

P.S. just looked it up in ABAP docu: LOOP is not setting SY-SUBRC, only when there were no LOOP passes at all due to the WHERE condition, SY-SUBRC will be 4 after the ENDLOOP.

mvoros
Active Contributor
0 Kudos

Hi,

that IF condition in the second loop is useless. That second loop goes only over records which fulfill the condition in WHERE. You can also combine conditions in your WHERE statement.


LOOP AT IT_BSID1 INTO WA_BSID1 WHERE KUNNR = WA_KNA1-KUNNR AND 
                                     SHKZG = 'S' AND
                                     BLART = 'RV'.
        WA_OUTPUT-SALE = WA_BSID1-DMBTR.
ENDLOOP.

Cheers

Former Member
0 Kudos

hey,

In the case of LOOPS there is no need to check the SY-SUBRC ok,

Chage the code as,

LOOP AT IT_BSID1 INTO WA_BSID1 WHERE KUNNR = WA_KNA1-KUNNR.

CASE WA_BSID1-BLART.

WHEN 'RV'.

IF WA_BSID1-SHKZG = 'S'.

WA_OUTPUT-SALE = WA_BSID1-DMBTR.

ENDCASE.

ENDLOOP.

ENDLOOP.

Regards,

Midhun Abraham

Former Member
0 Kudos

hi,

you are getting result of READ TABLE IT_OPBAL WITH KEY KUNNR = WA_KNA1-KUNNR BINARY SEARCH.

You can get result for LOOP after the ENDLOOP statement.system will give 0 or 4. 0 for LOOP has gone inside. 4 for LOOP didn't go to inside.

former_member194613
Active Contributor
0 Kudos

SELECT-OPTIONS: SO_KUNNR FOR KNA1-KUNNR OBLIGATORY.

SORT IT_BSID1 BY KUNNR.
SORT IT_KNA1 BY KUNNR.
SORT IT_OPBAL BY KUNNR.

LOOP AT IT_KNA1 INTO WA_KNA1.
  CLEAR : WA_OUTPUT.
  WA_OUTPUT-KUNNR = WA_KNA1-KUNNR.
  WA_OUTPUT-NAME1 = WA_KNA1-NAME1.
  
  READ TABLE IT_OPBAL 
            WITH KEY KUNNR = WA_KNA1-KUNNR
            BINARY SEARCH.
  IF SY-SUBRC = 0.
    WA_OUTPUT-OPNBAL = IT_OPBAL-LC_BAL.
  ENDIF.

    LOOP AT IT_BSID1 
           INTO WA_BSID1 
          WHERE KUNNR = WA_KNA1-KUNNR.
     IF SY-SUBRC = 0.
       CASE WA_BSID1-BLART.
       WHEN 'RV'.
          IF WA_BSID1-SHKZG = 'S'.
       WA_OUTPUT-SALE = WA_BSID1-DMBTR.
      ENDIF.
   ENDLOOP.
ENDLOOP.

What you need a better performaning solution


SELECT-OPTIONS: SO_KUNNR FOR KNA1-KUNNR OBLIGATORY.

SORT IT_BSID1 BY KUNNR.
SORT IT_KNA1 BY KUNNR.
SORT IT_OPBAL BY KUNNR.

LOOP AT IT_KNA1 INTO WA_KNA1.
  CLEAR : WA_OUTPUT.
  WA_OUTPUT-KUNNR = WA_KNA1-KUNNR.
  WA_OUTPUT-NAME1 = WA_KNA1-NAME1.
  
  READ TABLE IT_OPBAL 
            WITH KEY KUNNR = WA_KNA1-KUNNR
            BINARY SEARCH.
  IF SY-SUBRC = 0.
    WA_OUTPUT-OPNBAL = IT_OPBAL-LC_BAL.
  ENDIF.

  READ TABLE IT_BSID1 
           TRANSPORTING NO FIELDS
            WHERE KUNNR = WA_KNA1-KUNNR.
            BINARY SEARCH.
  IF SY-SUBRC = 0.
    TABIX = SY-TABIX.

     LOOP AT IT_BSID1 
             INTO WA_BSID1 
             FROM INDEX tabix.

       IF ( WA_BSID1-KUNNR NE WA_KNA1-KUNNR ).
          EXIT.
        ELSE.
           IF ( WA_BSID1-BLART = 'RV'
              AND WA_BSID1-SHKZG = 'S' ).
            WA_OUTPUT-SALE = WA_BSID1-DMBTR.
           ENDIF.
          WA_OUTPUT-OPNBAL = IT_OPBAL-LC_BAL.
        ENDIF.   
      ENDLOOP.
   ENDIF.
ENDLOOP.

There are maybe some smaller bugs, which you will easily figure out with the syntax check, but the structurse should be o.k.

Siegfried