‎2015 Nov 14 10:27 AM
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.
‎2015 Nov 14 1:32 PM
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
‎2015 Nov 14 1:32 PM
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
‎2015 Nov 14 1:40 PM
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