Skip to Content
author's profile photo Former Member
Former Member

How to get the open order quantity for a material

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.

Add a comment
10|10000 characters needed characters exceeded

Assigned Tags

Related questions

4 Answers

  • Best Answer
    Posted on Jan 08, 2007 at 07:41 PM

    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.

    Add a comment
    10|10000 characters needed characters exceeded

  • author's profile photo Former Member
    Former Member
    Posted on Jan 08, 2007 at 07:53 PM

    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

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on Jan 08, 2007 at 07:19 PM

    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

    Add a comment
    10|10000 characters needed characters exceeded

    • Former Member

      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

  • Posted on Jan 08, 2007 at 07:58 PM
    Add a comment
    10|10000 characters needed characters exceeded

Before answering

You should only submit an answer when you are proposing a solution to the poster's problem. If you want the poster to clarify the question or provide more information, please leave a comment instead, requesting additional details. When answering, please include specifics, such as step-by-step instructions, context for the solution, and links to useful resources. Also, please make sure that you answer complies with our Rules of Engagement.
You must be Logged in to submit an answer.

Up to 10 attachments (including images) can be used with a maximum of 1.0 MB each and 10.5 MB total.