The BOM Procedure

Example 3.2 Bill of Material with Lead Time Information

(View the complete code for this example.)

As in Example 3.1, this example also uses a single input data set with each observation containing product structure data and part master data. Unlike the SlBOM1 data set (shown in Output 3.1.1) in which each observation contains three product structure records, each observation in the input data set SlBOM2, as depicted in Output 3.2.1, contains only one product structure record. The observations in both input data sets also contain one part master record. However, in the previous example, the variable Parent contains the part number for the part master record, whereas in the current example, the part number for the part master record is contained in the variable Component. In addition, in this example, each part master record also contains requirement (contained in the Gros_Req variable) and quantity on hand (contained in the On_Hand variable) information.

Output 3.2.1: The Input Data Set (SlBOM2)

ABC Lamp Company
 
PROC BOM Input Data Set

ParentComponentDescUnitLeadTimeQtyPerGros_ReqOn_Hand
 LA01Lamp LAEach2.5020
LA01B100Base assemblyEach11.50
LA01S100Black shadeEach21..
LA01A100Socket assemblyEach11..
B1001100Finished shaftEach21..
B10012006-Diameter steel plateEach31..
B1001300HubEach21..
B10014001/4-20 ScrewEach14..
A1001500Steel holderEach21..
A1001600One-way socketEach21..
A1001700Wiring assemblyEach11..
110021003/8 Steel tubingInches326..
150014001/4-20 ScrewEach12..
1700220016-Gauge lamp cordFeet212..
17002300Standard plug terminalEach11..


The following code produces the Indented BOM data set and the Summarized Parts data set. The Indented BOM data set, IndBOM2, is displayed in Output 3.2.2. The "PART=Component" specification in the STRUCTURE statement indicates that the Component variable contains the part number for the part master record in each observation. Since the LEADTIME= option is specified, a new variable, Tot_Lead, has been added to the Indented BOM data set. This variable denotes the total lead time accumulated from the root record (the top-most record) to the record identified by the value of the Part_ID variable.

  /* Create the indented BOM and the summarized parts list */
proc bom data=SlBOM2 out=IndBOM2 summaryout=SumBOM2;
   structure / part=Component
               leadtime=LeadTime
               parent=Parent
               component=Component
               quantity=QtyPer
               qtyonhand=On_hand
               requirement=Gros_Req
               id=(Desc Unit);
run;

Output 3.2.2: Indented Bill of Material with Lead Time (IndBOM2)

ABC Lamp Company
 
Indented Bill of Material, Part LA01

_Level__Parent__Part_DescQtyPerQty_ProdUnitLeadTimeTot_Lead_Prod_
0 LA01Lamp LA.1Each22LA01
1LA01B100Base assembly11Each13LA01
2B1001100Finished shaft11Each25LA01
3110021003/8 Steel tubing2626Inches38LA01
2B10012006-Diameter steel plate11Each36LA01
2B1001300Hub11Each25LA01
2B10014001/4-20 Screw44Each14LA01
1LA01S100Black shade11Each24LA01
1LA01A100Socket assembly11Each13LA01
2A1001500Steel holder11Each25LA01
3150014001/4-20 Screw22Each16LA01
2A1001600One-way socket11Each25LA01
2A1001700Wiring assembly11Each14LA01
31700220016-Gauge lamp cord1212Feet26LA01
317002300Standard plug terminal11Each15LA01


Output 3.2.3: Summarized Parts List (SumBOM2)

ABC Lamp Company
 
Summarized Parts List, Period 2

_Part_Low_CodeGros_ReqOn_HandNet_ReqLeadTimeDescUnit
110020002Finished shaftEach
1200200036-Diameter steel plateEach
130020002HubEach
140036006011/4-20 ScrewEach
15002300302Steel holderEach
16002300302One-way socketEach
17002300301Wiring assemblyEach
2100300033/8 Steel tubingInches
220033600360216-Gauge lamp cordFeet
23003300301Standard plug terminalEach
A1001300301Socket assemblyEach
B1001305001Base assemblyEach
LA0105020302Lamp LAEach
S1001300302Black shadeEach


The data set SumBOM2 displayed in Output 3.2.3 contains the sorted summarized parts list for the production plan, in which 50 units of 'Lamp LA' are planned (say, in period 2). Based on the input data, 'Lamp LA' has 20 units and 'Base assembly' has 50 units currently on hand. The gross requirements of 30 units for 'B100', 'S100', and 'A100' are from the net requirement of 'LA01' (computed as Gros_Req minus On_Hand). Since item 'B100' has 50 units on hand, which is more than its gross requirement, the net requirement of this item is 0. This implies that the gross requirements for '1100', '1200', and '1300' (components of the item 'B100') are all 0. However, the gross requirement for item '1400', which is also a component of 'B100', is not 0 but 60. This is due to the fact that item '1400' is also used in item '1500'.

The following code uses the Indented BOM data set produced in the previous invocation of PROC BOM to create a data set that can be used by the NETDRAW procedure.

     /* Prepare the data set for running NETDRAW */
   data IndBOM2a(drop=Part_ID);
      set IndBOM2;
      Paren_ID=Part_ID;
   run;

   data IndBOM2b;
      set IndBOM2(keep=Paren_ID Part_ID);
   run;

   data TreBOM2;
      set IndBOM2a IndBOM2b;
      LTnQP = put(LeadTime, f3.)||"  "||put(QtyPer, f3.);
   run;

PROC NETDRAW is invoked with the NODISPLAY option to create a data set (Layout2) that contains all the layout information for the tree structure. The OUT= option specifies the name of the layout data set:

  /* Specify graphics options */
title h=4pct j=c 'Multilevel Bill of Material with Lead-time Offsetting';
footnote h=3pct j=l
         'Node shows Part Number, Lead-time, and Quantity Required';
pattern1 v=e c=blue;

  /* Get the layout information for the BOM tree */
proc netdraw data=TreBOM2( where=(Paren_ID NE .) )
             out=Layout2 nodisplay;
   actnet / act=Paren_ID succ=Part_ID id=(_Part_ LTnQP Tot_Lead)
            ybetween=3 xbetween=15 tree
            rectilinear nodefid nolabel;
run;

In the next invocation, PROC NETDRAW uses a modified layout of the nodes to produce a diagram where the nodes are aligned according to the total lead time. The resulting tree diagram is shown in Output 3.2.4. Refer to Chapter 9, The NETDRAW Procedure (SAS/OR 15.2 User's Guide: Project Management), for details about the NETDRAW procedure.

  /* Lead time offset the X coordinate of each node */
data TreBOM2a;
   set Layout2;
   if _seq_ = 0;
   drop _seq_;
   _x_ = Tot_Lead;
run;
  /* Display the BOM tree with lead-time offsetting */
proc netdraw data=TreBOM2a out=NetOUT;;
   actnet / id=(_Part_ LTnQP)
            ctext=black htext=3 carcs=black
            align=Tot_Lead frame pcompress
            xbetween=15 ybetween=3
            arrowhead=0 rectilinear nodefid nolabel;
run;

Output 3.2.4: Bill of Material Diagram with Lead-time Offsetting

Bill of Material Diagram with Lead-time Offsetting


Last updated: August 11, 2020