Make your own free website on Tripod.com
SAP ABAP Programming, Functional and Basis Components Books


Multi-Level Bom with Location Balance

REPORT ZMULTIBOM NO STANDARD PAGE HEADING LINE-SIZE 195
                LINE-COUNT 60(2) MESSAGE-ID Z1.

TABLES: MBEW,           "Material Valuation
        MSLB,           "Special stocks with vendor
        MARA,           "Material Master
        MAKT,           "Material Descriptions
        MARD,           "Material Master: Storage Location/Batch Segment
        MAST,           "BOM Header
        STKO,           "BOM Detail
        STPO,           "Bom Components
        STAS.           "BOM Alternative

* Text Elements
* Plant
SELECT-OPTIONS: S_WERKS FOR MAST-WERKS DEFAULT 'CA',
* Material
                S_MATNR FOR MAST-MATNR,
* Material Type
                S_MTART FOR MARA-MTART.
* Base Quantity
PARAMETERS: S_BASE TYPE I DEFAULT '1'.
* Display up to Level
PARAMETERS: S_LVL  TYPE I DEFAULT '99'.
SELECTION-SCREEN SKIP.
* Include Vendor Stock
PARAMETERS: X_MSLB  AS CHECKBOX.

DATA: W_MATNR LIKE MAPL-MATNR.

DATA: PARENT-MATNR LIKE MAST-MATNR,
      CHILD-MATNR LIKE STPO-IDNRK,
      CHILD-WERKS LIKE MAST-WERKS,
      CHILD-STLAL LIKE MAST-STLAL,
      W_MAKTX LIKE MAKT-MAKTX,
      W_STD TYPE P DECIMALS 5,
      W_MAV TYPE P DECIMALS 5,
      W_MENGE TYPE P DECIMALS 3,
      W_LEVEL TYPE I,
      W_DOT(1),
      W_LVL(12),
      W_LVL1(12),
      W_LVL2(2),
      W_COL TYPE I,
      W_LFLAG,
      W_TTL LIKE MARD-LABST.

DATA: BEGIN OF INT1 OCCURS 50,
        LGORT(6),
        LABST LIKE MARD-LABST,
      END OF INT1.

IF S_BASE EQ 0.
  S_BASE = 1.
ENDIF.

** append multi level routing
SELECT * FROM MAST WHERE WERKS IN S_WERKS AND
     MATNR IN S_MATNR.
  SELECT SINGLE * FROM MARA WHERE MATNR = MAST-MATNR AND
       MTART IN S_MTART.
  IF SY-SUBRC NE 0.
    CONTINUE.
  ENDIF.
  IF MARA-LVORM <> 'X'.
    PARENT-MATNR = MAST-MATNR.
    CHILD-MATNR  = MAST-MATNR.
    CHILD-WERKS  = MAST-WERKS.
    CHILD-STLAL  = MAST-STLAL.
    SELECT SINGLE * FROM MAKT WHERE MATNR = MAST-MATNR AND
         SPRAS = 'E'.
    W_MAKTX = MAKT-MAKTX.
    REFRESH INT1.
    SELECT * FROM MARD WHERE MATNR = MAST-MATNR AND
         WERKS = MAST-WERKS AND
         LABST NE 0.
      MOVE MARD-LGORT TO INT1-LGORT.
      MOVE MARD-LABST TO INT1-LABST.
      APPEND INT1.
    ENDSELECT.
    IF X_MSLB EQ 'X'.
      SELECT * FROM MSLB WHERE MATNR EQ MAST-MATNR AND
           WERKS EQ MAST-WERKS AND
           LBLAB NE 0.
        MOVE MSLB-LIFNR TO INT1-LGORT.
        MOVE MSLB-LBLAB TO INT1-LABST.
        APPEND INT1.
      ENDSELECT.
    ENDIF.
    W_LEVEL = 1.
    NEW-PAGE.
    PERFORM GETCHILD.
  ENDIF.
ENDSELECT.

** get child parts
FORM GETCHILD.
  SELECT * FROM STPO WHERE STLNR = MAST-STLNR
        ORDER BY POSNR.
    SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR
          AND STLAL = MAST-STLAL.
    SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
          STLKN = STPO-STLKN AND
          STLAL = MAST-STLAL.
    IF SY-SUBRC EQ 0.
      CLEAR: W_DOT, W_LVL, W_LVL1.
      PERFORM WRT_DTL.
      CHILD-MATNR = STPO-IDNRK.
      W_LEVEL = W_LEVEL + 1.
      IF W_LEVEL <= S_LVL.
        PERFORM SUBCHILD.
      ENDIF.
      W_LEVEL = W_LEVEL - 1.
    ENDIF.
  ENDSELECT.
ENDFORM.

** get grand children parts
FORM SUBCHILD.
  SELECT SINGLE * FROM MAST WHERE MATNR = CHILD-MATNR
     AND WERKS = CHILD-WERKS.
  IF SY-SUBRC NE 0.
    EXIT.
  ENDIF.
  SELECT * FROM STPO WHERE STLNR = MAST-STLNR
        ORDER BY POSNR.
    SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR AND
      STLAL = MAST-STLAL.
    SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
        STLKN = STPO-STLKN AND
        STLAL = STKO-STLAL.
      IF SY-SUBRC EQ 0.
        W_DOT = '.'.
        PERFORM WRT_DTL.
        CHILD-MATNR = STPO-IDNRK.
        W_LEVEL = W_LEVEL + 1.
        IF W_LEVEL <= S_LVL.
          PERFORM SUBCHILD.
        ENDIF.
        W_LEVEL = W_LEVEL - 1.
        SHIFT W_LVL.
      ENDIF.
    ENDSELECT.
ENDFORM.

TOP-OF-PAGE.
WRITE:/ SY-DATUM,SY-UZEIT,
       85 'ABC PTE LTD',
      182 'Page', SY-PAGNO.
WRITE: / SY-REPID,
         75 'BOM STRUCTURE  (WITH LOCATION BALANCES)',
         182 SY-UNAME.
SKIP.
CLEAR W_LFLAG.
WRITE:/ 'Material No.:', PARENT-MATNR,
        60 'Plant    :', MAST-WERKS.
W_COL = 90.
CLEAR W_TTL.
LOOP AT INT1.
  IF W_COL > 195.
    IF W_LFLAG IS INITIAL.
      WRITE:/ 'Description :', W_MAKTX,
           60 'Base Qty :', S_BASE LEFT-JUSTIFIED.
      W_LFLAG = 'X'.
      W_COL = 90.
    ELSE.
      W_COL = 90.
      SKIP.
    ENDIF.
  ENDIF.
  WRITE AT W_COL 'Loc :'.
  W_COL = W_COL + 6.
  WRITE AT W_COL INT1-LGORT.
  W_COL = W_COL + 7.
  WRITE AT W_COL(12) INT1-LABST LEFT-JUSTIFIED.
  W_COL = W_COL + 16.
  W_TTL = W_TTL + INT1-LABST.
ENDLOOP.
IF W_LFLAG IS INITIAL.
  WRITE:/ 'Description :', W_MAKTX,
       60 'Base Qty :', S_BASE LEFT-JUSTIFIED,
       90 'Total :', W_TTL LEFT-JUSTIFIED.
ELSE.
  WRITE AT W_COL 'Total :'.
  W_COL = W_COL + 8.
  WRITE AT W_COL W_TTL LEFT-JUSTIFIED.
ENDIF.
SKIP.
ULINE.
WRITE: /001 'Level',
        011 'Item',
        017 'Component',
        037 'Description',
        079 '    Per',
        089 'UOM',
        094 ' Std Price',
        106 'Moving Avg',
        119 'Location',
        128 ' Balance',
        139 'Location',
        148 ' Balance',
        159 'Location',
        168 ' Balance',
        179 'Total Quantity'.
ULINE.

FORM WRT_DTL.
  CLEAR: MAKT-MAKTX, W_MAV, W_STD.
  SELECT SINGLE * FROM MAKT WHERE MATNR = STPO-IDNRK AND
       SPRAS = 'E'.
  SELECT SINGLE * FROM MBEW WHERE MATNR = STPO-IDNRK AND
       BWKEY = MAST-WERKS.
  IF SY-SUBRC = 0.
    W_MAV = MBEW-VERPR / MBEW-PEINH.
    W_STD = MBEW-STPRS / MBEW-PEINH.
  ENDIF.
  W_MENGE = ( STPO-MENGE / STKO-BMENG ) * S_BASE.
  W_LVL2 = W_LEVEL.
  CONCATENATE W_DOT W_LVL INTO W_LVL.
  CONCATENATE W_LVL W_LVL2 INTO W_LVL1.
  WRITE: /001 W_LVL1,
          011 STPO-POSNR,
          017 STPO-IDNRK,
          037 MAKT-MAKTX,
          079(8) W_MENGE,
          089 STPO-MEINS,
          094(10) W_STD,
          106(10) W_MAV.
  W_COL = 119.
  CLEAR W_TTL.
  SELECT * FROM MARD WHERE MATNR = STPO-IDNRK AND
       WERKS = MAST-WERKS AND
       LABST NE 0.
    IF W_COL > 166.
      W_COL = 119.
      WRITE AT /W_COL ' '.
    ENDIF.
    WRITE AT W_COL MARD-LGORT.
    W_COL = W_COL + 5.
    WRITE AT W_COL(13) MARD-LABST.
    W_COL = W_COL + 15.
    W_TTL = W_TTL + MARD-LABST.
  ENDSELECT.
  IF X_MSLB EQ 'X'.
    SELECT * FROM MSLB WHERE MATNR = STPO-IDNRK AND
         WERKS = MAST-WERKS AND
         LBLAB NE 0.
      IF W_COL > 166.
        W_COL = 119.
        WRITE AT /W_COL ' '.
      ENDIF.
      WRITE AT W_COL(6) MSLB-LIFNR.
      W_COL = W_COL + 6.
      WRITE AT W_COL(12) MSLB-LBLAB.
      W_COL = W_COL + 14.
      W_TTL = W_TTL + MSLB-LBLAB.
    ENDSELECT.
  ENDIF.
  WRITE AT 179(15) W_TTL.
ENDFORM.

Back to Previous

Return to SAP Hints and Tips on Configuration and ABAP/4 Programming