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: 

How to get the open order quantity for a material

Former Member
0 Kudos

Hi All,

We need to get the open order quantity for materials. At present we are using the following logic...

SELECT VBAKVBELN VBAPPOSNR VBAP~KWMENG

INTO TABLE IT_VBAP

FROM VBAP

INNER JOIN VBAK ON VBAKVBELN = VBAPVBELN

INNER JOIN VAPMA ON VAPMAVBELN = VBAPVBELN

AND VAPMAPOSNR = VBAPPOSNR

INNER JOIN VBUP ON VBUPVBELN = VBAPVBELN

AND VBUPPOSNR = VBAPPOSNR

WHERE VAPMA~MATNR = IT_OUTPUT-MATNR

AND VAPMA~WERKS = IT_OUTPUT-WERKS

AND VBAK~AUART IN S_AUART

AND VBUP~GBSTA NE 'C'.

But the Query takes quite a long time as it does a full range scan on all the tables. Is there any way the query can be improved, may be by creating an index etc? Or is there anyother way by which i can get the required data?

Any input is appreciated.

Regards

Brain.

1 ACCEPTED SOLUTION

SantoshKallem
Active Contributor
0 Kudos

This could help.

&----


*& Report: zsdvr055 date written: 03/24/00 *

*& Author: Brian Huntley last update: 03/24/00 *

*& Program Title: Open Order Report *

&----


*& Description: This report will create a list of sales documents *

*& that are open (contain at least one item that is not shipped). *

*& The report will sort by ship-to customer name and by sales *

*& document number. *

*& *

*& Tables: *

*& *

*& Files: *

*& Transactions: *

*& *

*& Changes: *

*& *

*& *

&----


REPORT ZSDVR055 LINE-SIZE 255.

TABLES: VBPA,

VBAP,

VBUP,

VBAK,

VBKD,

KNA1,

VBEP,

VBFA,

LIKP,

LIPS,

EKET,

T171T.

*

  • define hashed table for selected ship-to and sold-to SO's

*

TYPES: BEGIN OF TVBPA_TYPE,

VBELN LIKE VBPA-VBELN, "sales document

POSNR LIKE VBPA-POSNR, "item number

PARVW LIKE VBPA-PARVW, "partner function

KUNNR LIKE VBPA-KUNNR, "customer number

END OF TVBPA_TYPE.

DATA: TVBPA TYPE HASHED TABLE OF TVBPA_TYPE

WITH UNIQUE KEY VBELN POSNR PARVW WITH HEADER LINE.

*

  • define internal table for all selected SO's

*

DATA: BEGIN OF ITAB0 OCCURS 0,

VBELN LIKE VBPA-VBELN, "sales document

END OF ITAB0.

*

  • define internal table for all selected SO items

*

DATA: BEGIN OF ITAB OCCURS 0,

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

MATNR LIKE VBAP-MATNR, "material

ARKTX LIKE VBAP-ARKTX, "description

PSTYV LIKE VBAP-PSTYV, "item category

KDMAT LIKE VBAP-KDMAT, "customer material

NETWR LIKE VBAP-NETWR, "net value

WAERK LIKE VBAP-WAERK, "currency

KWMENG LIKE VBAP-KWMENG, "quantity

ERDAT LIKE VBAP-ERDAT, "entry date

NETPR LIKE VBAP-NETPR, "net price

KPEIN LIKE VBAP-KPEIN, "pricing unit

PRCTR LIKE VBAP-PRCTR, "profit center

ERNAM LIKE VBAK-ERNAM, "entered by

AUART LIKE VBAK-AUART, "order type

VKORG LIKE VBAK-VKORG, "sales organization

VTWEG LIKE VBAK-VTWEG, "distribution channel

VDATU LIKE VBAK-VDATU, "requested date (header)

BNAME LIKE VBAK-BNAME, "name of orderer

KUNNR LIKE VBAK-KUNNR, "sold-to customer

BZIRK LIKE VBKD-BZIRK, "sales district

KURSK LIKE VBKD-KURSK, "conversion rate

BSTKD LIKE VBKD-BSTKD, "customer PO

LFGSA LIKE VBUP-LFGSA, "overall delivery status

FKSAA LIKE VBUP-FKSAA, "overall billing status

KUNWE LIKE VBPA-KUNNR, "ship-to customer

NAME1 LIKE KNA1-NAME1, "ship-to customer name

ORT01 LIKE KNA1-ORT01, "ship-to address

REGIO LIKE KNA1-REGIO, "ship-to region (state)

LAND1 LIKE KNA1-LAND1, "ship-to country

END OF ITAB.

*

  • create internal table for open orders

*

DATA: BEGIN OF ITAB1 OCCURS 0,

KUNNR LIKE VBAK-KUNNR, "sold-to customer

KUNWE LIKE VBPA-KUNNR, "ship-to customer

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

ZDATE1 LIKE VBEP-EDATU, "requested date

ZDATE2 LIKE VBEP-EDATU, "scheduled date (confirm)

ZDATE3 LIKE VBEP-EDATU, "committed date

ZQTY1 LIKE VBAP-KWMENG, "qty ordered

ZQTY2 LIKE VBEP-BMENG, "backlog qty

ZEXTD LIKE VBAP-NETWR, "backlog net value

ZDESC(30) TYPE C, "backlog description

END OF ITAB1.

*

  • define internal table for SO schedule lines

*

DATA: BEGIN OF ITAB2A OCCURS 0,

WADAT LIKE VBEP-WADAT, "planned goods issue date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

WMENG LIKE VBEP-WMENG, "qty ordered

BMENG LIKE VBEP-BMENG, "qty confirmed

END OF ITAB2A.

*

  • define internal table for SO item request dates

*

DATA: BEGIN OF ITAB2B OCCURS 0,

EDATU LIKE VBEP-EDATU, "delivery date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

WMENG LIKE VBEP-WMENG, "qty ordered

END OF ITAB2B.

*

  • define internal table for SO item commit dates

*

DATA: BEGIN OF ITAB2C OCCURS 0,

EDATU LIKE VBEP-EDATU, "delivery date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

ROMS1 LIKE VBEP-WMENG, "committed qty

END OF ITAB2C.

*

  • define internal table for SO item deliveries

*

DATA: BEGIN OF ITAB3 OCCURS 0,

VGBEL LIKE LIPS-VGBEL, "sales document

VGPOS LIKE LIPS-VGPOS, "sales document item

VBELN LIKE LIKP-VBELN, "delivery number

POSNR LIKE LIPS-POSNR, "delivery item number

WADAT LIKE LIKP-WADAT, "planned GI date

WADAT_IST LIKE LIKP-WADAT_IST, "actual GI date

LFIMG LIKE LIPS-LFIMG, "actual qty delivered

ERDAT LIKE LIKP-ERDAT, "date created

ERZET LIKE LIKP-ERZET, "time created

END OF ITAB3.

*

  • define internal table for SO item / delivery cross reference

*

DATA: BEGIN OF ITAB4 OCCURS 0,

VBELV LIKE VBFA-VBELV, "sales document

POSNV LIKE VBFA-POSNV, "sales document item

VBELN LIKE VBFA-VBELN, "delivery number

POSNN LIKE VBFA-POSNN, "delivery item

VBTYP_N LIKE VBFA-VBTYP_N, "document category

RFMNG LIKE VBFA-RFMNG, "qty delivered

PLMIN LIKE VBFA-PLMIN, "plus/minus flag

END OF ITAB4.

*

  • define local variables

*

DATA: ORDR_QTY LIKE VBEP-WMENG, "order qty

CONF_QTY LIKE VBEP-BMENG, "confirmed qty

NOCONF_QTY LIKE VBEP-BMENG, "qty not confirmed

DELV_QTY LIKE VBEP-WMENG, "qty delivered

NODELV_QTY LIKE VBEP-WMENG, "qty not delivered

REMAIN_QTY LIKE VBEP-WMENG, "qty remain to get conf date

REQ_DATE LIKE VBEP-EDATU, "request date

COM_DATE LIKE VBEP-EDATU, "committed date

DELV_QTY1 LIKE VBEP-WMENG, "preceding delivery qty

REMAIN_QTY1 LIKE VBEP-WMENG, "qty remain to get reqest date

REMAIN_QTY2 LIKE VBEP-WMENG, "qty remain to get commit date

THIRD_QTY LIKE VBEP-WMENG, "3rd party no PO qty

SO_STOCK LIKE MSKA-KALAB, "sales order stock

ZPRICE LIKE VBAP-NETPR, "unit price USD

ADRS1(40) TYPE C, "concatenated city and region

ADRS2(45) TYPE C, "city, region and country

ADRS3(80) TYPE C, "name, city, rgn, ctry

ZCNTR TYPE I. "counter

*

  • define select options

*

SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS: S_VKORG FOR VBAK-VKORG DEFAULT '1000',

S_VTWEG FOR VBAK-VTWEG DEFAULT '10' NO-DISPLAY,

S_SPART FOR VBAK-SPART DEFAULT '00' NO-DISPLAY,

S_KUNNR FOR VBPA-KUNNR MATCHCODE OBJECT DEBI,

S_KUNWE FOR VBPA-KUNNR MATCHCODE OBJECT DEBI.

SELECTION-SCREEN SKIP.

SELECT-OPTIONS:

S_BZIRK FOR VBKD-BZIRK,

S_PRCTR FOR VBAP-PRCTR,

S_MATNR FOR VBAP-MATNR MATCHCODE OBJECT MAT1,

S_ERNAM FOR VBAK-ERNAM,

S_ERDAT FOR VBAP-ERDAT.

SELECTION-SCREEN END OF BLOCK BLK1.

AT SELECTION-SCREEN.

IF S_KUNNR IS INITIAL AND S_KUNWE IS INITIAL.

MESSAGE E005(ZM) WITH TEXT-100.

ENDIF.

************************************************************************

  • MAIN PROGRAM

************************************************************************

INITIALIZATION.

INCLUDE ZSYHEADR.

START-OF-SELECTION.

PERFORM 100_GET_SO_ITEMS.

PERFORM 200_GET_NO_DELIVERY.

PERFORM 300_GET_NO_GOODS_ISSUE.

PERFORM 400_GET_PARTIAL_DELIVERY.

PERFORM 500_GET_THIRD_PARTY.

PERFORM 900_CREATE_LIST.

************************************************************************

  • FORM 100_GET_SO_ITEMS

************************************************************************

FORM 100_GET_SO_ITEMS.

*

  • get SO's for selected ship-to and sold-to customers

*

REFRESH TVBPA.

IF NOT S_KUNNR IS INITIAL.

SELECT VBELN POSNR PARVW KUNNR

FROM VBPA INTO TABLE TVBPA

WHERE KUNNR IN S_KUNNR AND PARVW = 'AG' AND VBELN < '0080000000'.

ENDIF.

IF NOT S_KUNWE IS INITIAL.

SELECT VBELN POSNR PARVW KUNNR

FROM VBPA APPENDING TABLE TVBPA

WHERE KUNNR IN S_KUNWE AND PARVW = 'WE' AND VBELN < '0080000000'.

ENDIF.

DESCRIBE TABLE TVBPA LINES ZCNTR.

IF ZCNTR = 0.

WRITE: /1 'No data found for selection'.

STOP.

ENDIF.

*

  • eliminate duplicate SO's

*

LOOP AT TVBPA.

CLEAR ITAB0.

MOVE TVBPA-VBELN TO ITAB0-VBELN.

APPEND ITAB0.

ENDLOOP.

DELETE ADJACENT DUPLICATES FROM ITAB0.

*

  • get SO detail

*

SELECT VBAP~VBELN VBAP~POSNR VBAP~MATNR VBAP~ARKTX VBAP~PSTYV

VBAP~KDMAT VBAP~NETWR VBAP~WAERK VBAP~KWMENG VBAP~ERDAT

VBAP~NETPR VBAP~KPEIN VBAP~PRCTR VBAK~ERNAM VBAK~AUART

VBAK~VKORG VBAK~VTWEG VBAK~VDATU VBAK~BNAME VBAK~KUNNR

VBKD~BZIRK VBKD~KURSK VBKD~BSTKD VBUP~LFGSA VBUP~FKSAA

FROM VBAP INNER JOIN VBUP ON VBUP~VBELN = VBAP~VBELN AND

VBUP~POSNR = VBAP~POSNR

INNER JOIN VBKD ON VBKD~VBELN = VBAP~VBELN AND

VBKD~POSNR = VBAP~POSNR

INNER JOIN VBAK ON VBAK~VBELN = VBAP~VBELN

INTO TABLE ITAB FOR ALL ENTRIES IN ITAB0

WHERE VBAP~VBELN = ITAB0-VBELN AND VBAP~MATNR IN S_MATNR AND

VBAP~ERDAT IN S_ERDAT AND VBAP~PRCTR IN S_PRCTR AND

VBAP~ABGRU = SPACE AND VBKD~BZIRK IN S_BZIRK AND

VBAK~VKORG IN S_VKORG AND VBAK~VTWEG IN S_VTWEG AND

VBAK~SPART IN S_SPART AND VBAK~KUNNR IN S_KUNNR AND

VBAK~ERNAM IN S_ERNAM.

IF SY-SUBRC <> 0.

WRITE: /1 'No data found for selection'.

STOP.

ENDIF.

*

  • loop thru SO items

*

LOOP AT ITAB.

*

  • get ship-to customer

*

IF NOT S_KUNWE IS INITIAL.

CLEAR TVBPA.

READ TABLE TVBPA WITH TABLE KEY VBELN = ITAB-VBELN

POSNR = ITAB-POSNR PARVW = 'WE'.

IF SY-SUBRC <> 0.

READ TABLE TVBPA WITH TABLE KEY VBELN = ITAB-VBELN

POSNR = '000000' PARVW = 'WE'.

ENDIF.

MOVE TVBPA-KUNNR TO ITAB-KUNWE.

ELSE.

CLEAR ITAB-KUNWE.

SELECT SINGLE KUNNR FROM VBPA INTO ITAB-KUNWE

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

PARVW = 'WE'.

IF SY-SUBRC <> 0.

SELECT SINGLE KUNNR FROM VBPA INTO ITAB-KUNWE

WHERE VBELN = ITAB-VBELN AND POSNR = '000000' AND

PARVW = 'WE'.

ENDIF.

ENDIF.

IF NOT ITAB-KUNWE IN S_KUNWE.

DELETE ITAB.

CONTINUE.

ENDIF.

*

  • get ship-to customer address info

*

SELECT SINGLE NAME1 ORT01 REGIO LAND1 FROM KNA1

INTO (ITAB-NAME1, ITAB-ORT01, ITAB-REGIO, ITAB-LAND1)

WHERE KUNNR = ITAB-KUNWE.

MODIFY ITAB.

ENDLOOP.

SORT ITAB BY VBELN POSNR.

ENDFORM.

************************************************************************

  • FORM 200_GET_NO_DELIVERY

*

  • get detail for SO items w/ no deliveries for order document types

  • (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 200_GET_NO_DELIVERY.

LOOP AT ITAB WHERE AUART = 'ZZOR' OR AUART = 'ZZC1' OR

AUART = 'ZZCO' OR AUART = 'ZZRP' OR AUART = 'ZZRW' OR

AUART = 'KE' OR AUART = 'KR' OR AUART = 'ZCHP' OR

AUART = 'ZPSO' OR AUART = 'ZZNC'.

*

  • select if delivery status = A (not delivered)

*

IF ITAB-LFGSA = 'A'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select schedule lines for SO item and write to internal table itab2a

*

SELECT WADAT VBELN POSNR WMENG BMENG

FROM VBEP INTO TABLE ITAB2A

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR.

*

  • select sched lines w/request date and write to internal table itab2b

*

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • select sched lines w/commit date and write to internal table itab2c

*

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2A BY WADAT.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

ORDR_QTY = 0.

CONF_QTY = 0.

NOCONF_QTY = 0.

*

  • calculate the unconfirmed qty for a SO item

*

LOOP AT ITAB2A.

CONF_QTY = CONF_QTY + ITAB2A-BMENG.

ORDR_QTY = ORDR_QTY + ITAB2A-WMENG.

ENDLOOP.

NOCONF_QTY = ORDR_QTY - CONF_QTY.

LOOP AT ITAB2A WHERE BMENG <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB2A-BMENG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB2A-BMENG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB2A-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB2A-BMENG.

ITAB1-ZDESC = 'no delivery, confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDLOOP.

*

  • get request date for SO item

*

IF NOCONF_QTY <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING NOCONF_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING NOCONF_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = NOCONF_QTY.

ITAB1-ZDESC = 'no delivery, not confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 300_GET_NO_GOODS_ISSUE

*

  • get detail for SO items w/deliveries and no goods issue for

  • doc types (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 300_GET_NO_GOODS_ISSUE.

*

  • get detail for deliveries w/no goods issue

*

SELECT VBELN WADAT WADAT_IST ERDAT ERZET

FROM LIKP INTO (LIKP-VBELN, LIKP-WADAT, LIKP-WADAT_IST,

LIKP-ERDAT, LIKP-ERZET)

WHERE WADAT_IST = 0.

*

  • select if actual qty delivered <> 0

*

CLEAR LIPS.

SELECT POSNR VGBEL VGPOS LFIMG

FROM LIPS INTO (LIPS-POSNR, LIPS-VGBEL, LIPS-VGPOS, LIPS-LFIMG)

WHERE VBELN = LIKP-VBELN AND LFIMG <> 0.

*

  • select if goods movement status on delivery = A (no goods issue)

*

CLEAR VBUP.

SELECT SINGLE WBSTA FROM VBUP INTO VBUP-WBSTA

WHERE VBELN = LIKP-VBELN AND POSNR = LIPS-POSNR.

IF VBUP-WBSTA = 'A'.

CLEAR ITAB3.

ITAB3-VGBEL = LIPS-VGBEL.

ITAB3-VGPOS = LIPS-VGPOS.

ITAB3-VBELN = LIKP-VBELN.

ITAB3-POSNR = LIPS-POSNR.

ITAB3-WADAT = LIKP-WADAT.

ITAB3-WADAT_IST = LIKP-WADAT_IST.

ITAB3-LFIMG = LIPS-LFIMG.

ITAB3-ERDAT = LIKP-ERDAT.

ITAB3-ERZET = LIKP-ERZET.

APPEND ITAB3.

ENDIF.

ENDSELECT.

ENDSELECT.

SORT ITAB3 BY VGBEL VGPOS VBELN POSNR.

*

  • loop thru deliveries w/no goods issue and get SO item detail

*

LOOP AT ITAB3.

CLEAR ITAB.

READ TABLE ITAB WITH KEY VBELN = ITAB3-VGBEL POSNR = ITAB3-VGPOS.

IF SY-SUBRC <> 0.

IF ITAB-AUART = 'ZZOR' OR ITAB-AUART = 'ZZC1' OR

ITAB-AUART = 'ZZCO' OR ITAB-AUART = 'ZZRP' OR

ITAB-AUART = 'ZZRW' OR ITAB-AUART = 'KE' OR

ITAB-AUART = 'KR' OR ITAB-AUART = 'ZCHP' OR

ITAB-AUART = 'ZPSO' OR ITAB-AUART = 'ZZNC'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select delivery qty for SO item and write to internal table

*

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

( VBTYP_N = 'J' OR VBTYP_N = 'T' ).

*

  • calculate total delivery qty for SO item

*

DELV_QTY = 0.

DELV_QTY1 = 0.

LOOP AT ITAB4.

IF ITAB4-VBTYP_N = 'J' OR ( ITAB4-VBTYP_N = 'T' AND

ITAB-AUART = 'KR').

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

*

  • determine if delivery for SO item precedes delivery w/no goods

  • issue (to determine request date and qty)

*

CLEAR LIKP.

SELECT SINGLE ERDAT ERZET

FROM LIKP INTO (LIKP-ERDAT, LIKP-ERZET)

WHERE VBELN = ITAB4-VBELN.

IF LIKP-ERDAT < ITAB3-ERDAT OR ( LIKP-ERDAT = ITAB3-ERDAT

AND LIKP-ERZET < ITAB3-ERZET ).

DELV_QTY1 = DELV_QTY1 + ITAB4-RFMNG.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDIF.

ENDLOOP.

*

  • get request dates for SO item

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • select sched lines w/commit date and write to itab2c

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

*

  • loop thru request dates and delete request date entries for

  • quantity(s) for preceding deliveries

*

REMAIN_QTY1 = DELV_QTY1.

LOOP AT ITAB2B.

IF ITAB2B-WMENG > REMAIN_QTY1.

ITAB2B-WMENG = ITAB2B-WMENG - REMAIN_QTY1.

MODIFY ITAB2B.

EXIT.

ELSEIF ITAB2B-WMENG = REMAIN_QTY1.

DELETE ITAB2B.

EXIT.

ELSE.

REMAIN_QTY1 = REMAIN_QTY1 - ITAB2B-WMENG.

DELETE ITAB2B.

ENDIF.

ENDLOOP.

*

  • loop thru commit dates and delete commit date entries for

  • quantity(s) for preceding deliveries

*

REMAIN_QTY2 = DELV_QTY1.

LOOP AT ITAB2C.

IF ITAB2C-ROMS1 > REMAIN_QTY2.

ITAB2C-ROMS1 = ITAB2C-ROMS1 - REMAIN_QTY2.

MODIFY ITAB2C.

EXIT.

ELSEIF ITAB2C-ROMS1 = REMAIN_QTY2.

DELETE ITAB2C.

EXIT.

ELSE.

REMAIN_QTY2 = REMAIN_QTY2 - ITAB2C-ROMS1.

DELETE ITAB2C.

ENDIF.

ENDLOOP.

*

  • if planned goods issue date is 0, put qty in non-confirmed

*

  • get request date for SO item

*

IF ITAB3-WADAT <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB3-LFIMG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB3-LFIMG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB3-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB3-LFIMG.

ITAB1-ZDESC = 'delivery, no goods issue'.

ELSE.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB3-LFIMG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB3-LFIMG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB3-LFIMG.

ITAB1-ZDESC = 'delivery, no goods issue date'.

ENDIF.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 400_GET_PARTIAL_DELIVERY

*

  • get detail for SO items w/partial deliveries for document types

  • (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 400_GET_PARTIAL_DELIVERY.

*

  • process SO items for selected order types

*

LOOP AT ITAB WHERE AUART = 'ZZOR' OR AUART = 'ZZC1' OR

AUART = 'ZZCO' OR AUART = 'ZZRP' OR AUART = 'ZZRW' OR

AUART = 'KE' OR AUART = 'KR' OR AUART = 'ZCHP' OR

AUART = 'ZPSO' OR AUART = 'ZZNC'.

*

  • select if delivery status = B (partially delivered)

*

IF ITAB-LFGSA = 'B'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select delivery qty for SO item and write to internal table

*

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

( VBTYP_N = 'J' OR VBTYP_N = 'T' ).

*

  • calculate total delivery qty for SO item

*

DELV_QTY = 0.

LOOP AT ITAB4.

IF ITAB4-VBTYP_N = 'J' OR ( ITAB4-VBTYP_N = 'T' AND

ITAB-AUART = 'KR').

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDIF.

ENDLOOP.

*

  • select schedule lines for SO item and write to internal table

*

REFRESH ITAB2A.

SELECT WADAT VBELN POSNR WMENG BMENG

FROM VBEP INTO TABLE ITAB2A

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR.

*

  • get request dates from schedule line table

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • get commit dates from schedule line table

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

SORT ITAB2A BY WADAT.

*

  • loop thru request dates and delete request date entries for

  • quantity(s) already delivered

*

REMAIN_QTY1 = DELV_QTY.

LOOP AT ITAB2B.

IF ITAB2B-WMENG > REMAIN_QTY1.

ITAB2B-WMENG = ITAB2B-WMENG - REMAIN_QTY1.

MODIFY ITAB2B.

EXIT.

ELSEIF ITAB2B-WMENG = REMAIN_QTY1.

DELETE ITAB2B.

EXIT.

ELSE.

REMAIN_QTY1 = REMAIN_QTY1 - ITAB2B-WMENG.

DELETE ITAB2B.

ENDIF.

ENDLOOP.

*

  • loop thru commit dates and delete request date entries for

  • quantity(s) already delivered

*

REMAIN_QTY2 = DELV_QTY.

LOOP AT ITAB2C.

IF ITAB2C-ROMS1 > REMAIN_QTY2.

ITAB2C-ROMS1 = ITAB2C-ROMS1 - REMAIN_QTY2.

MODIFY ITAB2C.

EXIT.

ELSEIF ITAB2C-ROMS1 = REMAIN_QTY2.

DELETE ITAB2C.

EXIT.

ELSE.

REMAIN_QTY2 = REMAIN_QTY2 - ITAB2C-ROMS1.

DELETE ITAB2C.

ENDIF.

ENDLOOP.

ORDR_QTY = 0.

CONF_QTY = 0.

NOCONF_QTY = 0.

*

  • calculate the unconfirmed qty for SO item

*

LOOP AT ITAB2A.

ORDR_QTY = ORDR_QTY + ITAB2A-WMENG.

CONF_QTY = CONF_QTY + ITAB2A-BMENG.

ENDLOOP.

NOCONF_QTY = ORDR_QTY - CONF_QTY.

NODELV_QTY = ORDR_QTY - DELV_QTY.

*

  • loop thru schedule lines and process entries with no related

  • delivery(s)

*

REMAIN_QTY = DELV_QTY.

LOOP AT ITAB2A.

IF ITAB2A-BMENG <> 0.

IF ITAB2A-BMENG <= REMAIN_QTY.

REMAIN_QTY = REMAIN_QTY - ITAB2A-BMENG.

ELSE.

ITAB2A-BMENG = ITAB2A-BMENG - REMAIN_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB2A-BMENG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB2A-BMENG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB2A-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB2A-BMENG.

ITAB1-ZDESC = 'partial delivery'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

REMAIN_QTY = 0.

ENDIF.

ENDIF.

ENDLOOP.

*

  • if total unconfirmed >= total not delivered, qty is unconfirmed

*

IF NOCONF_QTY >= NODELV_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING NODELV_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING NODELV_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = NODELV_QTY.

ITAB1-ZDESC = 'partial delv, not confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 500_GET_THIRD_PARTY

*

  • get detail for third party SO items

************************************************************************

FORM 500_GET_THIRD_PARTY.

*

  • process SO items for selected order types

*

LOOP AT ITAB WHERE PSTYV = 'TAS' AND ( AUART = 'ZZOR' OR

AUART = 'ZZC1' OR AUART = 'ZZCO' OR AUART = 'ZZRP' OR

AUART = 'ZZRW' OR AUART = 'KE' OR AUART = 'KR' OR

AUART = 'ZCHP' OR AUART = 'ZPSO' OR AUART = 'ZZNC' ).

*

  • select if billing status <> C (billed)

*

IF ITAB-FKSAA <> 'C'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • get request dates from schedule line table

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • get commit dates from schedule line table

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

*

  • get PO number(s) for SO item and write to internal table

*

REFRESH ITAB4.

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

VBTYP_N = 'V' AND RFMNG <> 0.

*

  • calculate total delivery qty for PO item

*

DELV_QTY = 0.

LOOP AT ITAB4.

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDLOOP.

*

  • loop thru PO's for SO item

*

LOOP AT ITAB4.

*

  • select delivery lines for PO item

*

SELECT EINDT EBELN EBELP MENGE FROM EKET

INTO (EKET-EINDT, EKET-EBELN, EKET-EBELP, EKET-MENGE)

WHERE EBELN = ITAB4-VBELN AND EBELP = ITAB4-POSNN.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING EKET-MENGE REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING EKET-MENGE COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = EKET-EINDT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = EKET-MENGE.

ITAB1-ZDESC = '3rd party item'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

APPEND ITAB1.

ENDSELECT.

ENDLOOP.

*

  • if total delivery qty < order qty, put remaining in non-confirmed

*

IF DELV_QTY < ITAB-KWMENG.

THIRD_QTY = ITAB-KWMENG - DELV_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING THIRD_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING THIRD_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE2 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = THIRD_QTY.

ITAB1-ZDESC = '3rd party item, no PO'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

APPEND ITAB1.

CONTINUE.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 900_CREATE_LIST

*

  • process open business detail and create list

************************************************************************

FORM 900_CREATE_LIST.

*

  • if internal table is empty, write message and exit

*

DESCRIBE TABLE ITAB1 LINES ZCNTR.

IF ZCNTR = 0.

WRITE: / 'No Data Found for Selection'.

STOP.

ENDIF.

SORT ITAB1 BY KUNNR KUNWE VBELN POSNR.

*

  • loop thru sorted table and create list

*

LOOP AT ITAB1.

IF ITAB1-ZDATE1 = SPACE.

ITAB1-ZDATE1 = '99991231'.

ENDIF.

IF ITAB1-ZDATE3 = SPACE.

ITAB1-ZDATE3 = '99991231'.

ENDIF.

*

  • get SO item detail

*

CLEAR ITAB.

READ TABLE ITAB WITH KEY VBELN = ITAB1-VBELN

POSNR = ITAB1-POSNR BINARY SEARCH.

*

  • print sold-to and ship-to customer header info

*

AT NEW KUNWE.

CLEAR KNA1.

SELECT SINGLE NAME1 FROM KNA1 INTO KNA1-NAME1

WHERE KUNNR = ITAB1-KUNNR.

CONCATENATE ITAB-ORT01 ITAB-REGIO INTO ADRS1 SEPARATED BY ', '.

CONCATENATE ADRS1 ITAB-LAND1 INTO ADRS2 SEPARATED BY ' '.

CONCATENATE ITAB-NAME1 ADRS2 INTO ADRS3 SEPARATED BY ' '.

FORMAT COLOR 1 INTENSIFIED OFF.

WRITE: /1 'Sold-to:', 10 ITAB1-KUNNR, 18 KNA1-NAME1,

56 'Ship-to:', 65 ITAB1-KUNWE, 73 ADRS3.

FORMAT RESET.

SKIP.

ENDAT.

*

  • print out backlog detail

*

CLEAR T171T.

SELECT SINGLE BZTXT FROM T171T INTO T171T-BZTXT

WHERE SPRAS = SY-LANGU AND BZIRK = ITAB-BZIRK.

WRITE: /1 ITAB1-VBELN,

13(6) ITAB1-POSNR NO-ZERO,

21 ITAB-MATNR,

41 ITAB-ARKTX,

83 ITAB1-ZDATE1,

95 ITAB1-ZDATE3,

107 ITAB1-ZDATE2,

119 ITAB-ERNAM,

129 ITAB-BZIRK, 135 T171T-BZTXT,

157(20) ITAB-BSTKD,

179(12) ITAB1-ZQTY1 DECIMALS 0,

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2,

225 ITAB1-ZDESC.

AT END OF VBELN.

SKIP.

ENDAT.

*

  • print footing at ship-to customer

*

AT END OF KUNWE.

SUM.

ULINE: /193(12), 207(16).

FORMAT COLOR 1 INTENSIFIED OFF.

WRITE: /1 'Total: Sold-to:', 18 ITAB1-KUNNR,

25 '/', 27 'Ship-to:', 36 ITAB1-KUNWE,

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2.

FORMAT RESET.

SKIP 2.

ENDAT.

AT LAST.

SUM.

ULINE: /193(12), 207(16).

FORMAT COLOR 1 INTENSIFIED ON.

WRITE: /1 'Report Total:',

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2.

FORMAT RESET.

ENDAT.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM GET_REQUEST_DATE

*

  • subroutine to get request date for SO item

************************************************************************

FORM GET_REQUEST_DATE TABLES FTAB STRUCTURE ITAB2B

USING CONF_QTY REQ_DATE.

DATA: REMAIN LIKE VBEP-WMENG, "qty remaining

CNTR TYPE I, "loop counter

TAB_INDEX TYPE I. "table index

*

  • initialize

*

REMAIN = 0.

REQ_DATE = SPACE.

*

  • get first request date from table

*

TAB_INDEX = 1.

READ TABLE FTAB INDEX TAB_INDEX.

*

  • if request date not found, set request date to blank

*

IF SY-SUBRC <> 0.

REQ_DATE = SPACE.

EXIT.

ELSE.

REQ_DATE = FTAB-EDATU.

ENDIF.

*

  • calculate quantity remaining for request date

*

REMAIN = FTAB-WMENG - CONF_QTY.

*

  • if qty remaining > 0, update request date with qty remaining

*

IF REMAIN > 0.

FTAB-WMENG = REMAIN.

MODIFY FTAB INDEX TAB_INDEX.

*

  • if qty remaining = 0, delete request date (so next request

  • date will be used for next confirmed qty)

*

ELSEIF REMAIN = 0.

DELETE FTAB INDEX TAB_INDEX.

*

  • if qty remaining < 0, find next request date and update

*

ELSE.

CNTR = 0.

WHILE REMAIN < 0 OR CNTR < 10.

DELETE FTAB INDEX TAB_INDEX.

TAB_INDEX = TAB_INDEX + 1.

READ TABLE FTAB INDEX TAB_INDEX.

REMAIN = REMAIN + FTAB-WMENG.

CNTR = CNTR + 1.

ENDWHILE.

IF REMAIN = 0.

DELETE FTAB INDEX TAB_INDEX.

ELSEIF REMAIN > 0.

FTAB-WMENG = REMAIN.

MODIFY FTAB INDEX TAB_INDEX.

ENDIF.

ENDIF.

ENDFORM.

************************************************************************

  • FORM GET_COMMIT_DATE

*

  • subroutine to get commit date for SO item

************************************************************************

FORM GET_COMMIT_DATE TABLES CTAB STRUCTURE ITAB2C

USING CONF_QTY COM_DATE.

DATA: REMAIN LIKE VBEP-WMENG, "qty remaining

CNTR TYPE I, "loop counter

TAB_INDEX TYPE I. "table index

*

  • initialize

*

REMAIN = 0.

COM_DATE = SPACE.

*

  • get first commit date from table

*

TAB_INDEX = 1.

READ TABLE CTAB INDEX TAB_INDEX.

*

  • if request date not found, set request date to blank

*

IF SY-SUBRC <> 0.

COM_DATE = SPACE.

EXIT.

ELSE.

COM_DATE = CTAB-EDATU.

ENDIF.

*

  • calculate quantity remaining for request date

*

REMAIN = CTAB-ROMS1 - CONF_QTY.

*

  • if qty remaining > 0, update request date with qty remaining

*

IF REMAIN > 0.

CTAB-ROMS1 = REMAIN.

MODIFY CTAB INDEX TAB_INDEX.

*

  • if qty remaining = 0, delete request date (so next request

  • date will be used for next confirmed qty)

*

ELSEIF REMAIN = 0.

DELETE CTAB INDEX TAB_INDEX.

*

  • if qty remaining < 0, find next request date and update

*

ELSE.

CNTR = 0.

WHILE REMAIN < 0 OR CNTR < 10.

DELETE CTAB INDEX TAB_INDEX.

TAB_INDEX = TAB_INDEX + 1.

READ TABLE CTAB INDEX TAB_INDEX.

REMAIN = REMAIN + CTAB-ROMS1.

CNTR = CNTR + 1.

ENDWHILE.

IF REMAIN = 0.

DELETE CTAB INDEX TAB_INDEX.

ELSEIF REMAIN > 0.

CTAB-ROMS1 = REMAIN.

MODIFY CTAB INDEX TAB_INDEX.

ENDIF.

ENDIF.

ENDFORM.

END-OF-REPORT.

5 REPLIES 5

ferry_lianto
Active Contributor
0 Kudos

Hi Brian,

Try this logic perhaps it may help.


select a~vbeln into table i_outtab
  from vbak as a inner join vbap as b on a~vbeln = b~vbeln
                 inner join vbuk as c on a~vbeln = c~vbeln
    where b~mantr in it_output-matnr and
          b~werks in it_output-werks and 
          a~auart in s_auart         and
        ( c~lfstk = 'A' or
          c~lfstk = 'B' ) and
        ( c~abstk = 'A' or
          c~abstk = 'B' ).

Also you can check the logic behind VA05.

Hope this will help.

Regards,

Ferry Lianto

0 Kudos

Thanks for the quick reply Ferry, but we want to ge the open orders for a particular material and plant, basically to get the shelf quantity.

Regards

Brain

Message was edited by:

Brain Charles

SantoshKallem
Active Contributor
0 Kudos

This could help.

&----


*& Report: zsdvr055 date written: 03/24/00 *

*& Author: Brian Huntley last update: 03/24/00 *

*& Program Title: Open Order Report *

&----


*& Description: This report will create a list of sales documents *

*& that are open (contain at least one item that is not shipped). *

*& The report will sort by ship-to customer name and by sales *

*& document number. *

*& *

*& Tables: *

*& *

*& Files: *

*& Transactions: *

*& *

*& Changes: *

*& *

*& *

&----


REPORT ZSDVR055 LINE-SIZE 255.

TABLES: VBPA,

VBAP,

VBUP,

VBAK,

VBKD,

KNA1,

VBEP,

VBFA,

LIKP,

LIPS,

EKET,

T171T.

*

  • define hashed table for selected ship-to and sold-to SO's

*

TYPES: BEGIN OF TVBPA_TYPE,

VBELN LIKE VBPA-VBELN, "sales document

POSNR LIKE VBPA-POSNR, "item number

PARVW LIKE VBPA-PARVW, "partner function

KUNNR LIKE VBPA-KUNNR, "customer number

END OF TVBPA_TYPE.

DATA: TVBPA TYPE HASHED TABLE OF TVBPA_TYPE

WITH UNIQUE KEY VBELN POSNR PARVW WITH HEADER LINE.

*

  • define internal table for all selected SO's

*

DATA: BEGIN OF ITAB0 OCCURS 0,

VBELN LIKE VBPA-VBELN, "sales document

END OF ITAB0.

*

  • define internal table for all selected SO items

*

DATA: BEGIN OF ITAB OCCURS 0,

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

MATNR LIKE VBAP-MATNR, "material

ARKTX LIKE VBAP-ARKTX, "description

PSTYV LIKE VBAP-PSTYV, "item category

KDMAT LIKE VBAP-KDMAT, "customer material

NETWR LIKE VBAP-NETWR, "net value

WAERK LIKE VBAP-WAERK, "currency

KWMENG LIKE VBAP-KWMENG, "quantity

ERDAT LIKE VBAP-ERDAT, "entry date

NETPR LIKE VBAP-NETPR, "net price

KPEIN LIKE VBAP-KPEIN, "pricing unit

PRCTR LIKE VBAP-PRCTR, "profit center

ERNAM LIKE VBAK-ERNAM, "entered by

AUART LIKE VBAK-AUART, "order type

VKORG LIKE VBAK-VKORG, "sales organization

VTWEG LIKE VBAK-VTWEG, "distribution channel

VDATU LIKE VBAK-VDATU, "requested date (header)

BNAME LIKE VBAK-BNAME, "name of orderer

KUNNR LIKE VBAK-KUNNR, "sold-to customer

BZIRK LIKE VBKD-BZIRK, "sales district

KURSK LIKE VBKD-KURSK, "conversion rate

BSTKD LIKE VBKD-BSTKD, "customer PO

LFGSA LIKE VBUP-LFGSA, "overall delivery status

FKSAA LIKE VBUP-FKSAA, "overall billing status

KUNWE LIKE VBPA-KUNNR, "ship-to customer

NAME1 LIKE KNA1-NAME1, "ship-to customer name

ORT01 LIKE KNA1-ORT01, "ship-to address

REGIO LIKE KNA1-REGIO, "ship-to region (state)

LAND1 LIKE KNA1-LAND1, "ship-to country

END OF ITAB.

*

  • create internal table for open orders

*

DATA: BEGIN OF ITAB1 OCCURS 0,

KUNNR LIKE VBAK-KUNNR, "sold-to customer

KUNWE LIKE VBPA-KUNNR, "ship-to customer

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

ZDATE1 LIKE VBEP-EDATU, "requested date

ZDATE2 LIKE VBEP-EDATU, "scheduled date (confirm)

ZDATE3 LIKE VBEP-EDATU, "committed date

ZQTY1 LIKE VBAP-KWMENG, "qty ordered

ZQTY2 LIKE VBEP-BMENG, "backlog qty

ZEXTD LIKE VBAP-NETWR, "backlog net value

ZDESC(30) TYPE C, "backlog description

END OF ITAB1.

*

  • define internal table for SO schedule lines

*

DATA: BEGIN OF ITAB2A OCCURS 0,

WADAT LIKE VBEP-WADAT, "planned goods issue date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

WMENG LIKE VBEP-WMENG, "qty ordered

BMENG LIKE VBEP-BMENG, "qty confirmed

END OF ITAB2A.

*

  • define internal table for SO item request dates

*

DATA: BEGIN OF ITAB2B OCCURS 0,

EDATU LIKE VBEP-EDATU, "delivery date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

WMENG LIKE VBEP-WMENG, "qty ordered

END OF ITAB2B.

*

  • define internal table for SO item commit dates

*

DATA: BEGIN OF ITAB2C OCCURS 0,

EDATU LIKE VBEP-EDATU, "delivery date

VBELN LIKE VBAP-VBELN, "document number

POSNR LIKE VBAP-POSNR, "item number

ROMS1 LIKE VBEP-WMENG, "committed qty

END OF ITAB2C.

*

  • define internal table for SO item deliveries

*

DATA: BEGIN OF ITAB3 OCCURS 0,

VGBEL LIKE LIPS-VGBEL, "sales document

VGPOS LIKE LIPS-VGPOS, "sales document item

VBELN LIKE LIKP-VBELN, "delivery number

POSNR LIKE LIPS-POSNR, "delivery item number

WADAT LIKE LIKP-WADAT, "planned GI date

WADAT_IST LIKE LIKP-WADAT_IST, "actual GI date

LFIMG LIKE LIPS-LFIMG, "actual qty delivered

ERDAT LIKE LIKP-ERDAT, "date created

ERZET LIKE LIKP-ERZET, "time created

END OF ITAB3.

*

  • define internal table for SO item / delivery cross reference

*

DATA: BEGIN OF ITAB4 OCCURS 0,

VBELV LIKE VBFA-VBELV, "sales document

POSNV LIKE VBFA-POSNV, "sales document item

VBELN LIKE VBFA-VBELN, "delivery number

POSNN LIKE VBFA-POSNN, "delivery item

VBTYP_N LIKE VBFA-VBTYP_N, "document category

RFMNG LIKE VBFA-RFMNG, "qty delivered

PLMIN LIKE VBFA-PLMIN, "plus/minus flag

END OF ITAB4.

*

  • define local variables

*

DATA: ORDR_QTY LIKE VBEP-WMENG, "order qty

CONF_QTY LIKE VBEP-BMENG, "confirmed qty

NOCONF_QTY LIKE VBEP-BMENG, "qty not confirmed

DELV_QTY LIKE VBEP-WMENG, "qty delivered

NODELV_QTY LIKE VBEP-WMENG, "qty not delivered

REMAIN_QTY LIKE VBEP-WMENG, "qty remain to get conf date

REQ_DATE LIKE VBEP-EDATU, "request date

COM_DATE LIKE VBEP-EDATU, "committed date

DELV_QTY1 LIKE VBEP-WMENG, "preceding delivery qty

REMAIN_QTY1 LIKE VBEP-WMENG, "qty remain to get reqest date

REMAIN_QTY2 LIKE VBEP-WMENG, "qty remain to get commit date

THIRD_QTY LIKE VBEP-WMENG, "3rd party no PO qty

SO_STOCK LIKE MSKA-KALAB, "sales order stock

ZPRICE LIKE VBAP-NETPR, "unit price USD

ADRS1(40) TYPE C, "concatenated city and region

ADRS2(45) TYPE C, "city, region and country

ADRS3(80) TYPE C, "name, city, rgn, ctry

ZCNTR TYPE I. "counter

*

  • define select options

*

SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS: S_VKORG FOR VBAK-VKORG DEFAULT '1000',

S_VTWEG FOR VBAK-VTWEG DEFAULT '10' NO-DISPLAY,

S_SPART FOR VBAK-SPART DEFAULT '00' NO-DISPLAY,

S_KUNNR FOR VBPA-KUNNR MATCHCODE OBJECT DEBI,

S_KUNWE FOR VBPA-KUNNR MATCHCODE OBJECT DEBI.

SELECTION-SCREEN SKIP.

SELECT-OPTIONS:

S_BZIRK FOR VBKD-BZIRK,

S_PRCTR FOR VBAP-PRCTR,

S_MATNR FOR VBAP-MATNR MATCHCODE OBJECT MAT1,

S_ERNAM FOR VBAK-ERNAM,

S_ERDAT FOR VBAP-ERDAT.

SELECTION-SCREEN END OF BLOCK BLK1.

AT SELECTION-SCREEN.

IF S_KUNNR IS INITIAL AND S_KUNWE IS INITIAL.

MESSAGE E005(ZM) WITH TEXT-100.

ENDIF.

************************************************************************

  • MAIN PROGRAM

************************************************************************

INITIALIZATION.

INCLUDE ZSYHEADR.

START-OF-SELECTION.

PERFORM 100_GET_SO_ITEMS.

PERFORM 200_GET_NO_DELIVERY.

PERFORM 300_GET_NO_GOODS_ISSUE.

PERFORM 400_GET_PARTIAL_DELIVERY.

PERFORM 500_GET_THIRD_PARTY.

PERFORM 900_CREATE_LIST.

************************************************************************

  • FORM 100_GET_SO_ITEMS

************************************************************************

FORM 100_GET_SO_ITEMS.

*

  • get SO's for selected ship-to and sold-to customers

*

REFRESH TVBPA.

IF NOT S_KUNNR IS INITIAL.

SELECT VBELN POSNR PARVW KUNNR

FROM VBPA INTO TABLE TVBPA

WHERE KUNNR IN S_KUNNR AND PARVW = 'AG' AND VBELN < '0080000000'.

ENDIF.

IF NOT S_KUNWE IS INITIAL.

SELECT VBELN POSNR PARVW KUNNR

FROM VBPA APPENDING TABLE TVBPA

WHERE KUNNR IN S_KUNWE AND PARVW = 'WE' AND VBELN < '0080000000'.

ENDIF.

DESCRIBE TABLE TVBPA LINES ZCNTR.

IF ZCNTR = 0.

WRITE: /1 'No data found for selection'.

STOP.

ENDIF.

*

  • eliminate duplicate SO's

*

LOOP AT TVBPA.

CLEAR ITAB0.

MOVE TVBPA-VBELN TO ITAB0-VBELN.

APPEND ITAB0.

ENDLOOP.

DELETE ADJACENT DUPLICATES FROM ITAB0.

*

  • get SO detail

*

SELECT VBAP~VBELN VBAP~POSNR VBAP~MATNR VBAP~ARKTX VBAP~PSTYV

VBAP~KDMAT VBAP~NETWR VBAP~WAERK VBAP~KWMENG VBAP~ERDAT

VBAP~NETPR VBAP~KPEIN VBAP~PRCTR VBAK~ERNAM VBAK~AUART

VBAK~VKORG VBAK~VTWEG VBAK~VDATU VBAK~BNAME VBAK~KUNNR

VBKD~BZIRK VBKD~KURSK VBKD~BSTKD VBUP~LFGSA VBUP~FKSAA

FROM VBAP INNER JOIN VBUP ON VBUP~VBELN = VBAP~VBELN AND

VBUP~POSNR = VBAP~POSNR

INNER JOIN VBKD ON VBKD~VBELN = VBAP~VBELN AND

VBKD~POSNR = VBAP~POSNR

INNER JOIN VBAK ON VBAK~VBELN = VBAP~VBELN

INTO TABLE ITAB FOR ALL ENTRIES IN ITAB0

WHERE VBAP~VBELN = ITAB0-VBELN AND VBAP~MATNR IN S_MATNR AND

VBAP~ERDAT IN S_ERDAT AND VBAP~PRCTR IN S_PRCTR AND

VBAP~ABGRU = SPACE AND VBKD~BZIRK IN S_BZIRK AND

VBAK~VKORG IN S_VKORG AND VBAK~VTWEG IN S_VTWEG AND

VBAK~SPART IN S_SPART AND VBAK~KUNNR IN S_KUNNR AND

VBAK~ERNAM IN S_ERNAM.

IF SY-SUBRC <> 0.

WRITE: /1 'No data found for selection'.

STOP.

ENDIF.

*

  • loop thru SO items

*

LOOP AT ITAB.

*

  • get ship-to customer

*

IF NOT S_KUNWE IS INITIAL.

CLEAR TVBPA.

READ TABLE TVBPA WITH TABLE KEY VBELN = ITAB-VBELN

POSNR = ITAB-POSNR PARVW = 'WE'.

IF SY-SUBRC <> 0.

READ TABLE TVBPA WITH TABLE KEY VBELN = ITAB-VBELN

POSNR = '000000' PARVW = 'WE'.

ENDIF.

MOVE TVBPA-KUNNR TO ITAB-KUNWE.

ELSE.

CLEAR ITAB-KUNWE.

SELECT SINGLE KUNNR FROM VBPA INTO ITAB-KUNWE

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

PARVW = 'WE'.

IF SY-SUBRC <> 0.

SELECT SINGLE KUNNR FROM VBPA INTO ITAB-KUNWE

WHERE VBELN = ITAB-VBELN AND POSNR = '000000' AND

PARVW = 'WE'.

ENDIF.

ENDIF.

IF NOT ITAB-KUNWE IN S_KUNWE.

DELETE ITAB.

CONTINUE.

ENDIF.

*

  • get ship-to customer address info

*

SELECT SINGLE NAME1 ORT01 REGIO LAND1 FROM KNA1

INTO (ITAB-NAME1, ITAB-ORT01, ITAB-REGIO, ITAB-LAND1)

WHERE KUNNR = ITAB-KUNWE.

MODIFY ITAB.

ENDLOOP.

SORT ITAB BY VBELN POSNR.

ENDFORM.

************************************************************************

  • FORM 200_GET_NO_DELIVERY

*

  • get detail for SO items w/ no deliveries for order document types

  • (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 200_GET_NO_DELIVERY.

LOOP AT ITAB WHERE AUART = 'ZZOR' OR AUART = 'ZZC1' OR

AUART = 'ZZCO' OR AUART = 'ZZRP' OR AUART = 'ZZRW' OR

AUART = 'KE' OR AUART = 'KR' OR AUART = 'ZCHP' OR

AUART = 'ZPSO' OR AUART = 'ZZNC'.

*

  • select if delivery status = A (not delivered)

*

IF ITAB-LFGSA = 'A'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select schedule lines for SO item and write to internal table itab2a

*

SELECT WADAT VBELN POSNR WMENG BMENG

FROM VBEP INTO TABLE ITAB2A

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR.

*

  • select sched lines w/request date and write to internal table itab2b

*

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • select sched lines w/commit date and write to internal table itab2c

*

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2A BY WADAT.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

ORDR_QTY = 0.

CONF_QTY = 0.

NOCONF_QTY = 0.

*

  • calculate the unconfirmed qty for a SO item

*

LOOP AT ITAB2A.

CONF_QTY = CONF_QTY + ITAB2A-BMENG.

ORDR_QTY = ORDR_QTY + ITAB2A-WMENG.

ENDLOOP.

NOCONF_QTY = ORDR_QTY - CONF_QTY.

LOOP AT ITAB2A WHERE BMENG <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB2A-BMENG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB2A-BMENG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB2A-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB2A-BMENG.

ITAB1-ZDESC = 'no delivery, confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDLOOP.

*

  • get request date for SO item

*

IF NOCONF_QTY <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING NOCONF_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING NOCONF_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = NOCONF_QTY.

ITAB1-ZDESC = 'no delivery, not confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 300_GET_NO_GOODS_ISSUE

*

  • get detail for SO items w/deliveries and no goods issue for

  • doc types (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 300_GET_NO_GOODS_ISSUE.

*

  • get detail for deliveries w/no goods issue

*

SELECT VBELN WADAT WADAT_IST ERDAT ERZET

FROM LIKP INTO (LIKP-VBELN, LIKP-WADAT, LIKP-WADAT_IST,

LIKP-ERDAT, LIKP-ERZET)

WHERE WADAT_IST = 0.

*

  • select if actual qty delivered <> 0

*

CLEAR LIPS.

SELECT POSNR VGBEL VGPOS LFIMG

FROM LIPS INTO (LIPS-POSNR, LIPS-VGBEL, LIPS-VGPOS, LIPS-LFIMG)

WHERE VBELN = LIKP-VBELN AND LFIMG <> 0.

*

  • select if goods movement status on delivery = A (no goods issue)

*

CLEAR VBUP.

SELECT SINGLE WBSTA FROM VBUP INTO VBUP-WBSTA

WHERE VBELN = LIKP-VBELN AND POSNR = LIPS-POSNR.

IF VBUP-WBSTA = 'A'.

CLEAR ITAB3.

ITAB3-VGBEL = LIPS-VGBEL.

ITAB3-VGPOS = LIPS-VGPOS.

ITAB3-VBELN = LIKP-VBELN.

ITAB3-POSNR = LIPS-POSNR.

ITAB3-WADAT = LIKP-WADAT.

ITAB3-WADAT_IST = LIKP-WADAT_IST.

ITAB3-LFIMG = LIPS-LFIMG.

ITAB3-ERDAT = LIKP-ERDAT.

ITAB3-ERZET = LIKP-ERZET.

APPEND ITAB3.

ENDIF.

ENDSELECT.

ENDSELECT.

SORT ITAB3 BY VGBEL VGPOS VBELN POSNR.

*

  • loop thru deliveries w/no goods issue and get SO item detail

*

LOOP AT ITAB3.

CLEAR ITAB.

READ TABLE ITAB WITH KEY VBELN = ITAB3-VGBEL POSNR = ITAB3-VGPOS.

IF SY-SUBRC <> 0.

IF ITAB-AUART = 'ZZOR' OR ITAB-AUART = 'ZZC1' OR

ITAB-AUART = 'ZZCO' OR ITAB-AUART = 'ZZRP' OR

ITAB-AUART = 'ZZRW' OR ITAB-AUART = 'KE' OR

ITAB-AUART = 'KR' OR ITAB-AUART = 'ZCHP' OR

ITAB-AUART = 'ZPSO' OR ITAB-AUART = 'ZZNC'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select delivery qty for SO item and write to internal table

*

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

( VBTYP_N = 'J' OR VBTYP_N = 'T' ).

*

  • calculate total delivery qty for SO item

*

DELV_QTY = 0.

DELV_QTY1 = 0.

LOOP AT ITAB4.

IF ITAB4-VBTYP_N = 'J' OR ( ITAB4-VBTYP_N = 'T' AND

ITAB-AUART = 'KR').

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

*

  • determine if delivery for SO item precedes delivery w/no goods

  • issue (to determine request date and qty)

*

CLEAR LIKP.

SELECT SINGLE ERDAT ERZET

FROM LIKP INTO (LIKP-ERDAT, LIKP-ERZET)

WHERE VBELN = ITAB4-VBELN.

IF LIKP-ERDAT < ITAB3-ERDAT OR ( LIKP-ERDAT = ITAB3-ERDAT

AND LIKP-ERZET < ITAB3-ERZET ).

DELV_QTY1 = DELV_QTY1 + ITAB4-RFMNG.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDIF.

ENDLOOP.

*

  • get request dates for SO item

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • select sched lines w/commit date and write to itab2c

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

*

  • loop thru request dates and delete request date entries for

  • quantity(s) for preceding deliveries

*

REMAIN_QTY1 = DELV_QTY1.

LOOP AT ITAB2B.

IF ITAB2B-WMENG > REMAIN_QTY1.

ITAB2B-WMENG = ITAB2B-WMENG - REMAIN_QTY1.

MODIFY ITAB2B.

EXIT.

ELSEIF ITAB2B-WMENG = REMAIN_QTY1.

DELETE ITAB2B.

EXIT.

ELSE.

REMAIN_QTY1 = REMAIN_QTY1 - ITAB2B-WMENG.

DELETE ITAB2B.

ENDIF.

ENDLOOP.

*

  • loop thru commit dates and delete commit date entries for

  • quantity(s) for preceding deliveries

*

REMAIN_QTY2 = DELV_QTY1.

LOOP AT ITAB2C.

IF ITAB2C-ROMS1 > REMAIN_QTY2.

ITAB2C-ROMS1 = ITAB2C-ROMS1 - REMAIN_QTY2.

MODIFY ITAB2C.

EXIT.

ELSEIF ITAB2C-ROMS1 = REMAIN_QTY2.

DELETE ITAB2C.

EXIT.

ELSE.

REMAIN_QTY2 = REMAIN_QTY2 - ITAB2C-ROMS1.

DELETE ITAB2C.

ENDIF.

ENDLOOP.

*

  • if planned goods issue date is 0, put qty in non-confirmed

*

  • get request date for SO item

*

IF ITAB3-WADAT <> 0.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB3-LFIMG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB3-LFIMG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB3-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB3-LFIMG.

ITAB1-ZDESC = 'delivery, no goods issue'.

ELSE.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB3-LFIMG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB3-LFIMG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB3-LFIMG.

ITAB1-ZDESC = 'delivery, no goods issue date'.

ENDIF.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 400_GET_PARTIAL_DELIVERY

*

  • get detail for SO items w/partial deliveries for document types

  • (ZZOR, ZZC1, ZZCO, ZZRP, ZZRW, KE, KR, ZCHP, ZPSO, ZZNC)

************************************************************************

FORM 400_GET_PARTIAL_DELIVERY.

*

  • process SO items for selected order types

*

LOOP AT ITAB WHERE AUART = 'ZZOR' OR AUART = 'ZZC1' OR

AUART = 'ZZCO' OR AUART = 'ZZRP' OR AUART = 'ZZRW' OR

AUART = 'KE' OR AUART = 'KR' OR AUART = 'ZCHP' OR

AUART = 'ZPSO' OR AUART = 'ZZNC'.

*

  • select if delivery status = B (partially delivered)

*

IF ITAB-LFGSA = 'B'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • select delivery qty for SO item and write to internal table

*

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

( VBTYP_N = 'J' OR VBTYP_N = 'T' ).

*

  • calculate total delivery qty for SO item

*

DELV_QTY = 0.

LOOP AT ITAB4.

IF ITAB4-VBTYP_N = 'J' OR ( ITAB4-VBTYP_N = 'T' AND

ITAB-AUART = 'KR').

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDIF.

ENDLOOP.

*

  • select schedule lines for SO item and write to internal table

*

REFRESH ITAB2A.

SELECT WADAT VBELN POSNR WMENG BMENG

FROM VBEP INTO TABLE ITAB2A

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR.

*

  • get request dates from schedule line table

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • get commit dates from schedule line table

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

SORT ITAB2A BY WADAT.

*

  • loop thru request dates and delete request date entries for

  • quantity(s) already delivered

*

REMAIN_QTY1 = DELV_QTY.

LOOP AT ITAB2B.

IF ITAB2B-WMENG > REMAIN_QTY1.

ITAB2B-WMENG = ITAB2B-WMENG - REMAIN_QTY1.

MODIFY ITAB2B.

EXIT.

ELSEIF ITAB2B-WMENG = REMAIN_QTY1.

DELETE ITAB2B.

EXIT.

ELSE.

REMAIN_QTY1 = REMAIN_QTY1 - ITAB2B-WMENG.

DELETE ITAB2B.

ENDIF.

ENDLOOP.

*

  • loop thru commit dates and delete request date entries for

  • quantity(s) already delivered

*

REMAIN_QTY2 = DELV_QTY.

LOOP AT ITAB2C.

IF ITAB2C-ROMS1 > REMAIN_QTY2.

ITAB2C-ROMS1 = ITAB2C-ROMS1 - REMAIN_QTY2.

MODIFY ITAB2C.

EXIT.

ELSEIF ITAB2C-ROMS1 = REMAIN_QTY2.

DELETE ITAB2C.

EXIT.

ELSE.

REMAIN_QTY2 = REMAIN_QTY2 - ITAB2C-ROMS1.

DELETE ITAB2C.

ENDIF.

ENDLOOP.

ORDR_QTY = 0.

CONF_QTY = 0.

NOCONF_QTY = 0.

*

  • calculate the unconfirmed qty for SO item

*

LOOP AT ITAB2A.

ORDR_QTY = ORDR_QTY + ITAB2A-WMENG.

CONF_QTY = CONF_QTY + ITAB2A-BMENG.

ENDLOOP.

NOCONF_QTY = ORDR_QTY - CONF_QTY.

NODELV_QTY = ORDR_QTY - DELV_QTY.

*

  • loop thru schedule lines and process entries with no related

  • delivery(s)

*

REMAIN_QTY = DELV_QTY.

LOOP AT ITAB2A.

IF ITAB2A-BMENG <> 0.

IF ITAB2A-BMENG <= REMAIN_QTY.

REMAIN_QTY = REMAIN_QTY - ITAB2A-BMENG.

ELSE.

ITAB2A-BMENG = ITAB2A-BMENG - REMAIN_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING ITAB2A-BMENG REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING ITAB2A-BMENG COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = ITAB2A-WADAT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = ITAB2A-BMENG.

ITAB1-ZDESC = 'partial delivery'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

REMAIN_QTY = 0.

ENDIF.

ENDIF.

ENDLOOP.

*

  • if total unconfirmed >= total not delivered, qty is unconfirmed

*

IF NOCONF_QTY >= NODELV_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING NODELV_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING NODELV_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = NODELV_QTY.

ITAB1-ZDESC = 'partial delv, not confirmed'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

*

  • if order type is consignment return (KR), reverse sign

*

IF ITAB-AUART = 'KR'.

ITAB1-ZQTY1 = ITAB1-ZQTY1 * -1.

ITAB1-ZQTY2 = ITAB1-ZQTY2 * -1.

ITAB1-ZEXTD = ITAB1-ZEXTD * -1.

ENDIF.

APPEND ITAB1.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 500_GET_THIRD_PARTY

*

  • get detail for third party SO items

************************************************************************

FORM 500_GET_THIRD_PARTY.

*

  • process SO items for selected order types

*

LOOP AT ITAB WHERE PSTYV = 'TAS' AND ( AUART = 'ZZOR' OR

AUART = 'ZZC1' OR AUART = 'ZZCO' OR AUART = 'ZZRP' OR

AUART = 'ZZRW' OR AUART = 'KE' OR AUART = 'KR' OR

AUART = 'ZCHP' OR AUART = 'ZPSO' OR AUART = 'ZZNC' ).

*

  • select if billing status <> C (billed)

*

IF ITAB-FKSAA <> 'C'.

*

  • assign values to detail fields

*

CLEAR ITAB1.

ITAB1-KUNNR = ITAB-KUNNR.

ITAB1-KUNWE = ITAB-KUNWE.

ITAB1-VBELN = ITAB-VBELN.

ITAB1-POSNR = ITAB-POSNR.

IF ITAB-KURSK = 0.

ITAB-KURSK = 1.

ENDIF.

IF ITAB-KPEIN = 0.

ITAB-KPEIN = 1.

ENDIF.

*

  • get request dates from schedule line table

*

REFRESH ITAB2B.

SELECT EDATU VBELN POSNR WMENG

FROM VBEP INTO TABLE ITAB2B

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

WMENG <> 0.

*

  • get commit dates from schedule line table

*

REFRESH ITAB2C.

SELECT EDATU VBELN POSNR ROMS1

FROM VBEP INTO TABLE ITAB2C

WHERE VBELN = ITAB-VBELN AND POSNR = ITAB-POSNR AND

ROMS1 <> 0.

SORT ITAB2B BY EDATU.

SORT ITAB2C BY EDATU.

*

  • get PO number(s) for SO item and write to internal table

*

REFRESH ITAB4.

SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG PLMIN

FROM VBFA INTO TABLE ITAB4

WHERE VBELV = ITAB-VBELN AND POSNV = ITAB-POSNR AND

VBTYP_N = 'V' AND RFMNG <> 0.

*

  • calculate total delivery qty for PO item

*

DELV_QTY = 0.

LOOP AT ITAB4.

IF ITAB4-PLMIN = '-'.

ITAB4-RFMNG = ITAB4-RFMNG * -1.

ENDIF.

DELV_QTY = DELV_QTY + ITAB4-RFMNG.

ENDLOOP.

*

  • loop thru PO's for SO item

*

LOOP AT ITAB4.

*

  • select delivery lines for PO item

*

SELECT EINDT EBELN EBELP MENGE FROM EKET

INTO (EKET-EINDT, EKET-EBELN, EKET-EBELP, EKET-MENGE)

WHERE EBELN = ITAB4-VBELN AND EBELP = ITAB4-POSNN.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING EKET-MENGE REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING EKET-MENGE COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = EKET-EINDT.

ITAB1-ZDATE3 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = EKET-MENGE.

ITAB1-ZDESC = '3rd party item'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

APPEND ITAB1.

ENDSELECT.

ENDLOOP.

*

  • if total delivery qty < order qty, put remaining in non-confirmed

*

IF DELV_QTY < ITAB-KWMENG.

THIRD_QTY = ITAB-KWMENG - DELV_QTY.

PERFORM GET_REQUEST_DATE TABLES ITAB2B

USING THIRD_QTY REQ_DATE.

PERFORM GET_COMMIT_DATE TABLES ITAB2C

USING THIRD_QTY COM_DATE.

ITAB1-ZDATE1 = REQ_DATE.

ITAB1-ZDATE2 = '99991231'.

ITAB1-ZDATE2 = COM_DATE.

ITAB1-ZQTY1 = ITAB-KWMENG.

ITAB1-ZQTY2 = THIRD_QTY.

ITAB1-ZDESC = '3rd party item, no PO'.

*

  • calculate net value for backlog qty

*

ZPRICE = ( ITAB-NETPR / ITAB-KPEIN ) * ITAB-KURSK.

ITAB1-ZEXTD = ITAB1-ZQTY2 * ZPRICE.

APPEND ITAB1.

CONTINUE.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM 900_CREATE_LIST

*

  • process open business detail and create list

************************************************************************

FORM 900_CREATE_LIST.

*

  • if internal table is empty, write message and exit

*

DESCRIBE TABLE ITAB1 LINES ZCNTR.

IF ZCNTR = 0.

WRITE: / 'No Data Found for Selection'.

STOP.

ENDIF.

SORT ITAB1 BY KUNNR KUNWE VBELN POSNR.

*

  • loop thru sorted table and create list

*

LOOP AT ITAB1.

IF ITAB1-ZDATE1 = SPACE.

ITAB1-ZDATE1 = '99991231'.

ENDIF.

IF ITAB1-ZDATE3 = SPACE.

ITAB1-ZDATE3 = '99991231'.

ENDIF.

*

  • get SO item detail

*

CLEAR ITAB.

READ TABLE ITAB WITH KEY VBELN = ITAB1-VBELN

POSNR = ITAB1-POSNR BINARY SEARCH.

*

  • print sold-to and ship-to customer header info

*

AT NEW KUNWE.

CLEAR KNA1.

SELECT SINGLE NAME1 FROM KNA1 INTO KNA1-NAME1

WHERE KUNNR = ITAB1-KUNNR.

CONCATENATE ITAB-ORT01 ITAB-REGIO INTO ADRS1 SEPARATED BY ', '.

CONCATENATE ADRS1 ITAB-LAND1 INTO ADRS2 SEPARATED BY ' '.

CONCATENATE ITAB-NAME1 ADRS2 INTO ADRS3 SEPARATED BY ' '.

FORMAT COLOR 1 INTENSIFIED OFF.

WRITE: /1 'Sold-to:', 10 ITAB1-KUNNR, 18 KNA1-NAME1,

56 'Ship-to:', 65 ITAB1-KUNWE, 73 ADRS3.

FORMAT RESET.

SKIP.

ENDAT.

*

  • print out backlog detail

*

CLEAR T171T.

SELECT SINGLE BZTXT FROM T171T INTO T171T-BZTXT

WHERE SPRAS = SY-LANGU AND BZIRK = ITAB-BZIRK.

WRITE: /1 ITAB1-VBELN,

13(6) ITAB1-POSNR NO-ZERO,

21 ITAB-MATNR,

41 ITAB-ARKTX,

83 ITAB1-ZDATE1,

95 ITAB1-ZDATE3,

107 ITAB1-ZDATE2,

119 ITAB-ERNAM,

129 ITAB-BZIRK, 135 T171T-BZTXT,

157(20) ITAB-BSTKD,

179(12) ITAB1-ZQTY1 DECIMALS 0,

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2,

225 ITAB1-ZDESC.

AT END OF VBELN.

SKIP.

ENDAT.

*

  • print footing at ship-to customer

*

AT END OF KUNWE.

SUM.

ULINE: /193(12), 207(16).

FORMAT COLOR 1 INTENSIFIED OFF.

WRITE: /1 'Total: Sold-to:', 18 ITAB1-KUNNR,

25 '/', 27 'Ship-to:', 36 ITAB1-KUNWE,

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2.

FORMAT RESET.

SKIP 2.

ENDAT.

AT LAST.

SUM.

ULINE: /193(12), 207(16).

FORMAT COLOR 1 INTENSIFIED ON.

WRITE: /1 'Report Total:',

193(12) ITAB1-ZQTY2 DECIMALS 0,

207(16) ITAB1-ZEXTD DECIMALS 2.

FORMAT RESET.

ENDAT.

ENDLOOP.

ENDFORM.

************************************************************************

  • FORM GET_REQUEST_DATE

*

  • subroutine to get request date for SO item

************************************************************************

FORM GET_REQUEST_DATE TABLES FTAB STRUCTURE ITAB2B

USING CONF_QTY REQ_DATE.

DATA: REMAIN LIKE VBEP-WMENG, "qty remaining

CNTR TYPE I, "loop counter

TAB_INDEX TYPE I. "table index

*

  • initialize

*

REMAIN = 0.

REQ_DATE = SPACE.

*

  • get first request date from table

*

TAB_INDEX = 1.

READ TABLE FTAB INDEX TAB_INDEX.

*

  • if request date not found, set request date to blank

*

IF SY-SUBRC <> 0.

REQ_DATE = SPACE.

EXIT.

ELSE.

REQ_DATE = FTAB-EDATU.

ENDIF.

*

  • calculate quantity remaining for request date

*

REMAIN = FTAB-WMENG - CONF_QTY.

*

  • if qty remaining > 0, update request date with qty remaining

*

IF REMAIN > 0.

FTAB-WMENG = REMAIN.

MODIFY FTAB INDEX TAB_INDEX.

*

  • if qty remaining = 0, delete request date (so next request

  • date will be used for next confirmed qty)

*

ELSEIF REMAIN = 0.

DELETE FTAB INDEX TAB_INDEX.

*

  • if qty remaining < 0, find next request date and update

*

ELSE.

CNTR = 0.

WHILE REMAIN < 0 OR CNTR < 10.

DELETE FTAB INDEX TAB_INDEX.

TAB_INDEX = TAB_INDEX + 1.

READ TABLE FTAB INDEX TAB_INDEX.

REMAIN = REMAIN + FTAB-WMENG.

CNTR = CNTR + 1.

ENDWHILE.

IF REMAIN = 0.

DELETE FTAB INDEX TAB_INDEX.

ELSEIF REMAIN > 0.

FTAB-WMENG = REMAIN.

MODIFY FTAB INDEX TAB_INDEX.

ENDIF.

ENDIF.

ENDFORM.

************************************************************************

  • FORM GET_COMMIT_DATE

*

  • subroutine to get commit date for SO item

************************************************************************

FORM GET_COMMIT_DATE TABLES CTAB STRUCTURE ITAB2C

USING CONF_QTY COM_DATE.

DATA: REMAIN LIKE VBEP-WMENG, "qty remaining

CNTR TYPE I, "loop counter

TAB_INDEX TYPE I. "table index

*

  • initialize

*

REMAIN = 0.

COM_DATE = SPACE.

*

  • get first commit date from table

*

TAB_INDEX = 1.

READ TABLE CTAB INDEX TAB_INDEX.

*

  • if request date not found, set request date to blank

*

IF SY-SUBRC <> 0.

COM_DATE = SPACE.

EXIT.

ELSE.

COM_DATE = CTAB-EDATU.

ENDIF.

*

  • calculate quantity remaining for request date

*

REMAIN = CTAB-ROMS1 - CONF_QTY.

*

  • if qty remaining > 0, update request date with qty remaining

*

IF REMAIN > 0.

CTAB-ROMS1 = REMAIN.

MODIFY CTAB INDEX TAB_INDEX.

*

  • if qty remaining = 0, delete request date (so next request

  • date will be used for next confirmed qty)

*

ELSEIF REMAIN = 0.

DELETE CTAB INDEX TAB_INDEX.

*

  • if qty remaining < 0, find next request date and update

*

ELSE.

CNTR = 0.

WHILE REMAIN < 0 OR CNTR < 10.

DELETE CTAB INDEX TAB_INDEX.

TAB_INDEX = TAB_INDEX + 1.

READ TABLE CTAB INDEX TAB_INDEX.

REMAIN = REMAIN + CTAB-ROMS1.

CNTR = CNTR + 1.

ENDWHILE.

IF REMAIN = 0.

DELETE CTAB INDEX TAB_INDEX.

ELSEIF REMAIN > 0.

CTAB-ROMS1 = REMAIN.

MODIFY CTAB INDEX TAB_INDEX.

ENDIF.

ENDIF.

ENDFORM.

END-OF-REPORT.

Former Member
0 Kudos

As a test, try this:


SELECT VBAK~VBELN VBAP~POSNR VBAP~KWMENG
  INTO TABLE IT_VBAP
  FROM VBAP
    INNER JOIN VBAK ON VBAK~VBELN = VBAP~VBELN
    INNER JOIN VAPMA ON VAPMA~VBELN = VBAP~VBELN
                    AND VAPMA~POSNR = VBAP~POSNR
  INNER JOIN VBUP ON VBUP~VBELN = VBAP~VBELN
                 AND VBUP~POSNR = VBAP~POSNR
  WHERE VAPMA~MATNR = IT_OUTPUT-MATNR
    AND VAPMA~WERKS = IT_OUTPUT-WERKS.

Rob

SantoshKallem
Active Contributor
0 Kudos