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

move-corresponding fields in loop

former_member209900
Participant
0 Likes
2,760

Dear All,

Please see my code. Here, I had the GRN values in IT2 table and use loop in IT2 then i got the information about INVOICE details. After, the fields move-corresponding to IT4 table. But it's working properly. IT4 table getting the value of IT2 table's last record only.

Please help. I am new to abap

REPORT  zpo3 LINE-SIZE 240.

TABLES : ekko,ekpo,ekbe.

TYPES : BEGIN OF k,

         ebeln TYPE ekko-ebeln,

         lifnr TYPE ekko-lifnr,

         AEDAT TYPE EKKO-AEDAT,

         rlwrt TYPE ekko-rlwrt,

*        EBELN TYPE EKPO-EBELN," PO NUMBER

*        NETWR TYPE EKPO-NETWR," PO VALUE

         WERKS TYPE EKPO-WERKS,

         NAME1 TYPE LFA1-NAME1,

*

   END OF k.

DATA : it1 TYPE TABLE OF k, wa1 TYPE k.

DATA : it3 TYPE TABLE OF ekbe, wa3 TYPE ekbe.

DATA : BEGIN OF wa_collect OCCURS 0,                   "GRN - MIRO

         ebeln TYPE ekpo-ebeln," PO NUMBER

         lifnr TYPE ekko-lifnr,

         rlwrt TYPE ekko-rlwrt,

         WERKS TYPE EKPO-WERKS,

         menge TYPE ekbe-menge,

         dmbtr TYPE ekbe-dmbtr,

         belnr TYPE ekbe-belnr,

         budat TYPE ekbe-budat,

         NAME1 TYPE LFA1-NAME1,

   END OF wa_collect.

   DATA : BEGIN OF wa_collect1 OCCURS 0,                 " IR - MIGO

         ebeln TYPE ekpo-ebeln," PO NUMBER

         lifnr TYPE ekko-lifnr,

         belnr1 TYPE ekbe-belnr,

         budat1 TYPE ekbe-budat,

         dmbtr1 TYPE ekbe-dmbtr,

         menge1 TYPE ekbe-menge,

   END OF wa_collect1.

   TYPES : BEGIN OF S,

         ebeln TYPE ekko-ebeln,

         lifnr TYPE ekko-lifnr,

         AEDAT TYPE EKKO-AEDAT,

         rlwrt TYPE ekko-rlwrt,

         belnr TYPE ekbe-belnr,

         dmbtr TYPE ekbe-dmbtr,

         menge TYPE ekbe-menge,

         budat TYPE ekbe-budat,

         WERKS TYPE EKPO-WERKS,

         NAME1 TYPE LFA1-NAME1,

     END OF S.

     DATA : IT2 TYPE TABLE OF S, WA2 TYPE S.

       TYPES : BEGIN OF M,

         ebeln  TYPE ekko-ebeln,

         lifnr  TYPE ekko-lifnr,

         AEDAT  TYPE EKKO-AEDAT,

         rlwrt  TYPE ekko-rlwrt,

         belnr  TYPE ekbe-belnr,

         dmbtr  TYPE ekbe-dmbtr,

         menge  TYPE ekbe-menge,

         budat  TYPE ekbe-budat,

         WERKS  TYPE EKPO-WERKS,

         NAME1  TYPE LFA1-NAME1,

         belnr1 TYPE ekbe-belnr,

         budat1 TYPE ekbe-budat,

         dmbtr1 TYPE ekbe-dmbtr,

         menge1 TYPE ekbe-menge,

     END OF M.

     DATA : IT4 TYPE TABLE OF M, WA4 TYPE M.

SELECT-OPTIONS : so_ebeln FOR ekko-ebeln, so_edat FOR ekko-aedat.

START-OF-SELECTION.

IF EKKO IS INITIAL.

*SELECT ebeln lifnr AEDAT rlwrt FROM ekko INTO TABLE it1 WHERE ebeln IN so_ebeln.

     SELECT

     EKKO~EBELN

     EKKO~LIFNR

     EKKO~AEDAT

     ekko~rlwrt

     EKPO~WERKS

     LFA1~NAME1

     INTO TABLE IT1

     FROM EKKO

     JOIN EKPO ON ( EKKO~EBELN = EKPO~EBELN )

     JOIN LFA1 ON ( EKKO~LIFNR = LFA1~LIFNR )

     WHERE EKKO~ebeln IN SO_ebeln AND

     EKKO~AEDAT IN SO_EDAT

     ORDER BY EKKO~LIFNR .

LOOP AT it1 INTO wa1.

*  READ TABLE IT1 INTO WA1 WITH KEY EBELN = WA3-EBELN.

DELETE ADJACENT DUPLICATES FROM it1 COMPARING ALL FIELDS.

   SELECT ebeln belnr budat menge dmbtr FROM ekbe

     INTO (wa3-ebeln,wa3-belnr,wa3-budat,wa3-menge,wa3-dmbtr) WHERE ebeln = wa1-ebeln

     AND bwart = '101'.

     IF sy-subrc = 0.

       wa_collect-ebeln = wa1-ebeln.

       wa_collect-lifnr = wa1-lifnr.

       wa_collect-rlwrt = wa1-rlwrt.

       wa_collect-werks = wa1-werks.

       wa_collect-menge = wa3-menge.

       wa_collect-dmbtr = wa3-dmbtr.

       wa_collect-name1 = wa1-name1.

       wa_collect-belnr = wa3-belnr.

       wa_collect-budat = wa3-budat.

     ENDIF.

     COLLECT wa_collect .

     clear : wa1-rlwrt.

   ENDSELECT.

ENDLOOP.

LOOP AT WA_COLLECT.

   MOVE-CORRESPONDING WA_COLLECT TO WA2.

   READ TABLE IT1 INTO wa1 WITH KEY ebeln = wa1-ebeln.

   wa2-aedat = wa1-aedat.

   APPEND wa2 to it2.

ENDLOOP.

*  LOOP AT it2 INTO wa2.

*   WRITE : / wa2-lifnr ,wa2-ebeln ,wa2-name1 ,wa2-aedat ,wa2-rlwrt ,wa2-werks ,wa2-dmbtr ,wa2-menge ,wa2-budat ,wa2-belnr .

*  ENDLOOP.

   LOOP AT it2 into wa2.

*    MOVE-CORRESPONDING WA_COLLECT TO WA4.

      SELECT ebeln belnr budat menge dmbtr FROM ekbe

     INTO (wa3-ebeln,wa3-belnr,wa3-budat,wa3-menge,wa3-dmbtr) WHERE ebeln = wa2-ebeln AND BEWTP = 'Q' .

     IF sy-subrc = 0.

       wa_collect1-ebeln = wa2-ebeln.

       wa_collect1-lifnr = wa2-lifnr.

       wa_collect1-belnr1 = wa3-belnr.

       wa_collect1-budat1 = wa3-budat.

       wa_collect1-menge1 = wa3-menge.

       wa_collect1-dmbtr1 = wa3-dmbtr.

       ENDIF.

       COLLECT wa_collect1 .

       ENDSELECT.

   ENDLOOP.

*

*  LOOP AT wa_collect1.

*

*  WRITE :

**  wa_collect1-EBELN , wa_collect1-LIFNR ,

*  / wa_collect1-belnr1 , wa_collect1-budat1 , wa_collect1-MENGE1 , wa_COLLECT1-DMBTR1 .

*

*ENDLOOP.

LOOP at wa_collect1.

MOVE-CORRESPONDING WA_COLLECT1 TO WA4.

   READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa2-ebeln.

    IF SY-SUBRC = 0.

       wa4-rlwrt = wa2-rlwrt.

       wa4-aedat = wa2-aedat.

       wa4-werks = wa2-werks.

       wa4-menge = wa2-menge.

       wa4-dmbtr = wa2-dmbtr.

       wa4-name1 = wa2-name1.

       wa4-belnr = wa2-belnr.

       wa4-budat = wa2-budat.

       ENDIF.

        APPEND wa4 to it4.

        CLEAR : wa4,wa2,WA_COLLECT1.

ENDLOOP.

*

*

*

*WRITE : 'PO No.' , 15 'VENDOR' , 37 'NAME' , 76 'PO VALUE' , 88 'PO CREATED', 100 'PLANT', 108 'GRN NO',  127'GRN Qty', 146 'GRN Value',

*       160 'GRN CREATED', 175 'IR No', 192 'IR Qty',  213 'IR VALUE' , 225 'IR CREATED'.

*ULINE.

*

*

*LOOP AT it4 INTO wa4.

*

*  WRITE : / wa4-EBELN ,SY-VLINE, wa4-LIFNR ,SY-VLINE, wa4-name1 ,SY-VLINE, wa4-rlwrt , SY-VLINE ,wa4-aedat ,SY-VLINE, wa4-werks ,SY-VLINE, wa4-belnr ,SY-VLINE, wa4-MENGE ,SY-VLINE,

*           wa4-DMBTR ,SY-VLINE, wa4-budat,SY-VLINE, wa4-belnr1 ,SY-VLINE,wa4-MENGE1 ,SY-VLINE, wa4-DMBTR1 ,SY-VLINE, wa4-budat1 .

*

*ENDLOOP.

ENDIF.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
2,412

Hi Ganapathi,

While looping at wa_collect1 , and reading data from table IT2 you are using wrong key, in wa2-ebeln there will be last value so it's appending only last record.

Please replace below strike through the code with BOLD code line.

LOOP at wa_collect1.

MOVE-CORRESPONDING WA_COLLECT1 TO WA4.

   READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa2-ebeln.

 

  READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa_collect1-ebeln.

    IF SY-SUBRC = 0.

       wa4-rlwrt = wa2-rlwrt.

       wa4-aedat = wa2-aedat.

       wa4-werks = wa2-werks.

       wa4-menge = wa2-menge.

       wa4-dmbtr = wa2-dmbtr.

       wa4-name1 = wa2-name1.

       wa4-belnr = wa2-belnr.

       wa4-budat = wa2-budat.

       ENDIF.

        APPEND wa4 to it4.

        CLEAR : wa4,wa2,WA_COLLECT1.

ENDLOOP.


Thanks.


Regards,

Ashish Desai

2 REPLIES 2
Read only

Former Member
0 Likes
2,413

Hi Ganapathi,

While looping at wa_collect1 , and reading data from table IT2 you are using wrong key, in wa2-ebeln there will be last value so it's appending only last record.

Please replace below strike through the code with BOLD code line.

LOOP at wa_collect1.

MOVE-CORRESPONDING WA_COLLECT1 TO WA4.

   READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa2-ebeln.

 

  READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa_collect1-ebeln.

    IF SY-SUBRC = 0.

       wa4-rlwrt = wa2-rlwrt.

       wa4-aedat = wa2-aedat.

       wa4-werks = wa2-werks.

       wa4-menge = wa2-menge.

       wa4-dmbtr = wa2-dmbtr.

       wa4-name1 = wa2-name1.

       wa4-belnr = wa2-belnr.

       wa4-budat = wa2-budat.

       ENDIF.

        APPEND wa4 to it4.

        CLEAR : wa4,wa2,WA_COLLECT1.

ENDLOOP.


Thanks.


Regards,

Ashish Desai

Read only

Former Member
0 Likes
2,412

Hi Ganapathi,

             In the last piece of code(below), does wa_collect1 contains all the required records?

Also the where condition of the READ statement should be from WA4. Does the records contain same PO's? In that case then you should consider another WHERE condition also otherwise the same PO will be read.

Why are you clearing WA_COLLECT1 within the loop?

LOOP at wa_collect1.

MOVE-CORRESPONDING WA_COLLECT1 TO WA4.

   READ TABLE IT2 INTO wa2 WITH KEY ebeln = wa2-ebeln.

    IF SY-SUBRC = 0.

       wa4-rlwrt = wa2-rlwrt.

       wa4-aedat = wa2-aedat.

       wa4-werks = wa2-werks.

       wa4-menge = wa2-menge.

       wa4-dmbtr = wa2-dmbtr.

       wa4-name1 = wa2-name1.

       wa4-belnr = wa2-belnr.

       wa4-budat = wa2-budat.

       ENDIF.

        APPEND wa4 to it4.

        CLEAR : wa4,wa2,WA_COLLECT1.

ENDLOOP.

            

Please check the points I mentioned and let me know.

Also I have few suggestions to your program:

1) DELETE ADJACENT DUPLICATES FROM it1 COMPARING ALL FIELDS. - Can you please make this before the loop.

2) Also if you can try to avoid SELECT ENDSELECT stmts. Instead select the required data outside the loops of it1 and it3 and place the datas into another internal table and then read from the internal table within the loop.

The second point is a performance issue its just up to you if you want to rectify so in future there won't be any performance issues

Thanks & Regards,

Jenny