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.

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.

Similar Messages

  • How to get the back order quantity for sales Order

    Hi Friends,
    I want to get the back order quantity for sales order . in MD04 t-code,
    there is a field(MDEZ-MNG01) for Received Qty/ Required qty.  But MDEZ is a structure.
    I tried from MDTB table, but the table is not updated with the values in MD04.
    Please guide me from which table I can get the back order Qty for sales Order
    (ref: t-code  MD04, MRP element = CusOrd).
    Thanks,
    Sagar

    >
    VIdya Sagar wrote:
    > Hi,
    >
    > Isn't  there any difference b/n Open Sales Order and Back order??
    Yes Quite Difference.
    Read:
    http://www.sap-img.com/sap-sd/explain-the-meaning-of-an-open-sales-order.htm
    http://help.sap.com/saphelp_sbo2005asp1/helpdata/en/b6/bdb9b2f02842348c9edbe78af863c4/content.htm

  • Is ther a FM to get the open order qty for a particular material &salesorg?

    Hi experts,
                    I have requirement to find the open order qty for a given sales org (plant will be even better ) and material in my report. I do not want to use the standard tables as i need to fetch all records without any time restriction.So it is takin a lot of time.
    I know i can find it in va05 but i want to know if ther is  some standard function module which can serve this purpose.
    Kindly help.
    regards
    Ashwin

    Thanks for the reply,
    Can you kindly elaborate what i need to pass to the function module ?
    What do I have to pass in the tables LVBMTV and LSELTAB ?
    In which field will i get the open quantity for the material and salesorg ?
    Kindly help,
    Regards
    Ashwin

  • How to get the Open Order Qty value from Transaction Code RWBE?

    Hello,
    Recently I have a program that needs to extract the value of Open Order Qty value from RWBE.
    My specific steps are as follows:
    - I go to tcode <b>RWBE</b>
    - I select the <b>material and plant</b>
    - I tick the checbox for <b>"Also select special stocks"</b> and <b>"Also select stock commitments"</b>
    - I execute the program double click one of the rows for the <b>Unrestricted Use coulmn</b> and view the <b>Open Order Qty</b>.
    My question is how is this particlar variable attained? I tried Ekbe and the ELIKZ feild from EKPO and I still cant seem to get the right value.
    Hope to hear from you soon.
    Thank you and good day.

    check with FM :
    CALL FUNCTION 'MB_ADD_PURCHASE_ORDER_QUANTITY'
           EXPORTING
              x_matnr = t_matnr-matnr         " TGA/4.6 Erw. Lot
              x_meins = t_matnr-basme         " TGA/4.6 Erw. Lot
                x_matnr = prt_matnr-matnr  " TGA/4.6 Erw. Lot
                x_meins = prt_matnr-basme  " TGA/4.6 Erw. Lot
                x_elikz = space
                x_loekz = space
           TABLES
                xtab    = xtab
                xwerks  = r_werks.
    above fm will get open order qty for given material in po

  • To get open order quantity for list of materials

    Hi Gurus,
    I have a typical requirement for development of 1 function module and below are the details for it:
    I want to have the open order quantity (pending for delivery & PGI) for materials by entering sold-to-party, ship-to-party and sales organisation.
    Can i get list of all the materials when are open with the quantity of that materials which are yet to be delivered. And I have only ship-to-party and sales organisation as input parameter.
    I would prefer if standard function module is available or I would also like to have some code or logic to ful fill the above requirement. And also I would like to inform you that I have check VA05 transaction and it is not useful to me as it does not take into consideration partial delivery. I have also check backorder list transaction V_05 and it is not useful too.
    Please reply me fast as I am in urgent requirement of this.
    If you are not clear in requirement then please let me know.
    Regards,
    Sagar

    Rich,
    No.
    This is for creating custom VA01 transaction.
    Before creating the SO, I need to validate the minimum order quantity for each material for that customer.
    Thanks
    Sundar

  • FM or logic to retrieve Open order quantity for below parameter

    Hi Gurus,
    I have a typical requirement for development of 1 function module and below are the details for it:
    I want to have the open order quantity for materials by entering ship-to-party and sales organisation.
    Can i get list of all the materials when are open with the quantity of that materials which are yet to be delivered. And I have only ship-to-party and sales organisation as input parameter.
    I would prefer if standard function module is available or I would also like to have some code or logic to ful fill the above requirement.
    Please reply me fast as I am in urgent requirement of this.
    If you are not clear in requirement then please let me know.
    Regards,
    Sagar

    Hi,
    I specifically want the Function module and in VA05 i do not getting the actual open order quantity for material.
    Eample: If i do partial delivery then VA05 shows the total order quantity and not actual open quantity. So could let me know how I get the above detial.
    Regards,
    Sagar

  • Open Order Quantity for open sales orders

    Is there a standard SAP Report that gives the open order quantity for every open sales order.   "Open" is defined as any order quantity that has not shipped.  Delivery creation is not the same as shipment.   VA05 Report does not contain enough information to calculate the open order quantity for an ERP-based backlog report.

    Try VA05 schedule lines standar variant...include status fields and both ordered qty and confirmed qty. In SAP standard system order status, status A means open orders fully (Nothing shipped, everything opened). Status B means in process orders (Partially processed - shipped). Status C means complete orders (Nothing opened). As there is no delivered qty in VA05,  you need to download to excel the file and calculate the difference between both qty fields for each A and B status. That is a way to get the missing qty to be delivered or open qty as you stated.
    Hope it helps.
    Jorge Fernandez

  • Table and Field for Open Order Quantity for a Customer and Material

    Hi
    I created two sales orders 3 and 5 quantities, and delivered 1 qty in the second order.
    when I checked the table VBBE or VA05, I am able to see 3 and 4 qantities open.
    but I want to see the total 7 as open order qty, i.e, 3+4=7
    because both the orders are placed by the same customer and same material
    can u please tell me in which table exactly the total open order quantity for a customer and total open order quantity for a material is stored
    Madhu
    Edited by: madhubabu rao on Jul 1, 2008 1:49 PM

    HI,
    U can get the information in VA05 as there are columns like confirmed quantity and order quantty and status. U can use  summation button (add upto values) to get required information.
    Thx,
    Pramod

  • How To Get The Total Delivered Quantity of a Sales Order

    Hello All,
    I have a requirement of getting the total delivery quantity of the sales order .I have checked it in LIps table but I am getting partially delivered quantity for a schedule line item.Can any one tell me how to get the total delivered quantity.
    Regards,
    Pavani.

    Hi
    Check the Table:
    VBEP  - Sales Document: Schedule Line Data.
    Inside the table check the Quantity Fields.
    Regards,
    Sreeram

  • Open order quantity for mrp run

    hi
    for x material i was made a subcontracting PO
    ORDER uantity was say 2000
    deliverd quantity was 1500
    rest of the 500 nos tobe deliverad on 30th agust
    ie, OPEN ORDER QATNTIY OF 500 NOS WHITH delivery date
    on 30th agust.
    for the same materail there was an dependent requirement of say 1500 in the month of MAY2008
    while MRP RUN for the dependent  reqirement of 1500
    i got a purchase requistion of 1000nos
    and for  the 500 nos saytem taken fron the purchase order
    which was made as subcontracting
    and throughs an expetion message which says  needs the rescheduling
    my requirement here is it should not consider the open order quantity which was there for sub contracting
    it sholud create purchase requirement of 2000nos
    plz suggest how to achive it
    regards
    sasikanth/vst

    I wanted to the same as you where getting in subcontract po but in a std po
    hi
    for x material i was made a subcontracting PO
    ORDER uantity was say 2000
    deliverd quantity was 1500
    rest of the 500 nos tobe deliverad on 30th agust
    ie, OPEN ORDER QATNTIY OF 500 NOS WHITH delivery date
    on 30th agust."
    guide me in terms of configuration
    i think i am missing some configurations

  • How to get the Purchase order Qty in the object dependency

    Hi,
    We are using variant pricing in the purchase order. I have condition type say u201CZVBPu201D for Pallet cost. I defined Pallet cost as 5 USD per each (pallet). I have to calculate Number of pallets = Purchase order Qty/ 5. The number of pallets should be rounded to nearest integer.
    My question is how to get the Purchase order Qty in the object dependency?
    Is there any reference table and field can be used to get Purchase order Qty just like we use MMCOM-VKOND for variant pricing.
    Appreciate your help
    Thanks,
    Srini

    Hi,
    1. I do not have system now so I can not conclusively tell about table field .
    2. Since I did it long back so I also do not exactly remember it, there are more than one place where PO qty appears for example Item overview and Item details - one of the PO qty when used in the characteristic do pull the PO qty which can be used for variant pricing (so request to please update the forum with the correct table and field once you find it - in the meantime if I get opportunity to get to system I will also try and find out ).

  • Display Totol Stock & Open Order Quantity for line item while creating SO

    Dear Experts,
    We have requiremet that while creating SO (VA01) for each item it sould show the message (Popup Screen) about Total Stock & Total Open Oder quantity for that material when user enters the material, plant & storage location in line item.
    Please let me know your ideas in detail if anyone knows about this....
    Thanks in Advance
    Best Regards
    Venkatesh

    Dear Venkatesh
    It is a standard if you create sale order, whatever stock is available in MMBE, it will show during availability check but additionally if you want to see open orders, then you have to go for additional enhancement.
    thanks
    G. Lakshmipathi

  • How to get the "last changed by" for a set of function modules?

    How to get the "last changed by" for a set of function modules?
    is there any table to get it??

    See [this|Re: Date of creation of function module] I posted earlier.
    >TFDIR will give you the name of the function group program and the include number.
    >E.g. SAPLZFUNCGROUP Include 01.
    >From this you can construct the include name: LZFUNCGROUPU01.
    >You can look this up in TRDIR to find the creation date (CDAT) of the function module.
    In your case, you need unam and udat.
    matt

  • How to get the Open qty. in JIT Schedule in VA33 txn.

    How to get the Open qty. in JIT Schedule in VA33 txn.
    The F1 Helps says Structure VBEPD field name is OLFMNG.

    any clues ??

  • How to get the current month value for a customer exit variable?

    How to get the current month value for a customer exit variable? 
    And also if we have an InfoObject with date value (including date, month, year), then how to derive the month value from this date type of Char.?
    Thanks!

    Hi Kevin,
    Check here........
    Re: Customer Exist for "From Current Date To Month End"
    https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/25d98cf6-0d01-0010-0e9b-edcd4597335a
    Cal month
    Regards,
    Vijay.

Maybe you are looking for

  • Problem in Solaris Installation

    Hi, I'm trying to use one Netra T1 105 which we are using for long. I have tried to install Solaris 2.8 2/02 version on that. The problem is, when the system is coming up I am not able to send the break signal to get it to the OK prompt, so that I ca

  • Right clicking causing spinning beach ball

    I am having trouble with accessing contextual menus via right clicking in several applications. I use Pathfinder and every time I right click on a file/folder the program hangs and need to force quit. I searched their forums/support site and saw seve

  • How to omit unused fields while import from delimited file

    I have a problem to select and load to table only needed fields from delimited free-format file. How to do it ? Anybody know ?

  • Finding Process Code for a message Type

    Hi, Is there any way to find process code for a specific message type. Message Type WFRESOURCE_CHANGEAVAILABILITY

  • How to add a datatype into IDOC in production

    Hi.. How to add a an extra feild (Customized IDOC) into IDOC when it is in Production.. Message was edited by:         Raghavesh Reddy