Example 3.8 illustrated using the Indented BOM data set to roll up costs assigned at the leaf nodes of the BOM family tree to obtain the cost of the final product. Similarly, the same data set can also be used to "explode" (or "propagate") requirements along the tree, based on requirements specified for the root nodes. The "explosion" can be performed with or without taking into account the quantities on hand or the scrap factors. This example demonstrates a few of these explosions.
Note that the BOM procedure automatically performs the requirement explosion in the calculation of the gross and net requirements of each item when producing the summarized parts list. In the Summarized Parts data set produced by PROC BOM, the gross and net requirements are calculated taking into account both the quantities on hand and the scrap factors. See the section Summarized Parts Data Set for details about calculating the gross and net requirements for each item.
The following SAS code uses the data set SlBOM2
(displayed in Output 3.2.1) with additional specifications of scrap factors (20 percent for the relationship between the parent item '1100
' and its component '2100
', and 10 percent for the relationship of the component '2200
' and its parent '1700
') to produce the indented bill of material for 'LA01
' and the summarized parts list for the requirement of 50 units of item 'LA01
'. The indented BOM, IndBom9
, is shown in Output 3.9.1, and the summarized parts list, SumBOM9
, is shown in Output 3.9.2.
/* Product structure and part master data */ data SlBOM9; set SlBOM2(drop=LeadTime); /* Specify scrap factors for 2100 and 2200 */ if (Component="2100" and Parent="1100") then Scrap=0.2; else if (Component="2200" and Parent="1700") then Scrap=0.1; run;
/* Create the indented BOM and the summarized parts list */ proc bom data=SlBOM9 out=IndBOM9 summaryout=SumBOM9; structure / part=Component parent=Parent component=Component quantity=QtyPer id=(Desc Unit) requirement=Gros_Req qtyonhand=On_Hand factor=Scrap; run;
Output 3.9.1: Indented Bill of Material for 'LA01'
ABC Lamp Company |
Indented Bill of Material, Part LA01 |
_Level_ | _Parent_ | _Part_ | Desc | QtyPer | Qty_Prod | Unit | Scrap |
---|---|---|---|---|---|---|---|
0 | LA01 | Lamp LA | . | 1 | Each | . | |
1 | LA01 | B100 | Base assembly | 1 | 1 | Each | 0.0 |
2 | B100 | 1100 | Finished shaft | 1 | 1 | Each | 0.0 |
3 | 1100 | 2100 | 3/8 Steel tubing | 26 | 26 | Inches | 0.2 |
2 | B100 | 1200 | 6-Diameter steel plate | 1 | 1 | Each | 0.0 |
2 | B100 | 1300 | Hub | 1 | 1 | Each | 0.0 |
2 | B100 | 1400 | 1/4-20 Screw | 4 | 4 | Each | 0.0 |
1 | LA01 | S100 | Black shade | 1 | 1 | Each | 0.0 |
1 | LA01 | A100 | Socket assembly | 1 | 1 | Each | 0.0 |
2 | A100 | 1500 | Steel holder | 1 | 1 | Each | 0.0 |
3 | 1500 | 1400 | 1/4-20 Screw | 2 | 2 | Each | 0.0 |
2 | A100 | 1600 | One-way socket | 1 | 1 | Each | 0.0 |
2 | A100 | 1700 | Wiring assembly | 1 | 1 | Each | 0.0 |
3 | 1700 | 2200 | 16-Gauge lamp cord | 12 | 12 | Feet | 0.1 |
3 | 1700 | 2300 | Standard plug terminal | 1 | 1 | Each | 0.0 |
Output 3.9.2: Item Requirements for a Planned Order of 50 Units of 'LA01'
ABC Lamp Company |
Summarized Parts List, Part LA01: Requirement=50 |
_Part_ | Low_Code | Gros_Req | On_Hand | Net_Req | Desc | Unit |
---|---|---|---|---|---|---|
1100 | 2 | 0 | 0 | 0 | Finished shaft | Each |
1200 | 2 | 0 | 0 | 0 | 6-Diameter steel plate | Each |
1300 | 2 | 0 | 0 | 0 | Hub | Each |
1400 | 3 | 60 | 0 | 60 | 1/4-20 Screw | Each |
1500 | 2 | 30 | 0 | 30 | Steel holder | Each |
1600 | 2 | 30 | 0 | 30 | One-way socket | Each |
1700 | 2 | 30 | 0 | 30 | Wiring assembly | Each |
2100 | 3 | 0 | 0 | 0 | 3/8 Steel tubing | Inches |
2200 | 3 | 396 | 0 | 396 | 16-Gauge lamp cord | Feet |
2300 | 3 | 30 | 0 | 30 | Standard plug terminal | Each |
A100 | 1 | 30 | 0 | 30 | Socket assembly | Each |
B100 | 1 | 30 | 50 | 0 | Base assembly | Each |
LA01 | 0 | 50 | 20 | 30 | Lamp LA | Each |
S100 | 1 | 30 | 0 | 30 | Black shade | Each |
The summarized parts list displayed in Output 3.9.2 lists all items and their quantities required to be made or ordered in order to fill the requirement of 50 units for 'LA01
'. The requirements in this list are calculated taking into account each item’s quantity on hand and each relationship’s scrap
factor. However, if you want to analyze how future orders for end items will impact inventory levels, a gross requirements report that lists all items and their total requirements to make the pre-specified amount of end items, without any regard for quantities
on hand, will be helpful. The gross requirements report can be determined by a top-down calculation through indented bill
of material, taking into account only the scrap factors. In other words, once you have an Indented BOM
data set available, you can use it to calculate the gross requirements report for any specified quantity of any end item,
as shown below. It is not necessary to invoke the BOM procedure for each value.
The following code performs the top-down calculation, as discussed above, through the Indented BOM data set as displayed in
Output 3.9.1 to produce a gross requirements report for an additional order of 50 units of 'LA01
'. The gross requirements report, SumReq9
, is displayed in Output 3.9.3; this data set has been sorted by the _Part_
variable.
/* Explode the gross requirement to low-level components */ data IndBOM9a; set IndBOM9; array reqs[4] req1 req2 req3 req4; retain req1 req2 req3 req4 0; drop req1 req2 req3 req4; /* Calculate the gross requirement */ if _Level_=0 then Req=50; else Req=reqs[_Level_]*QtyPer*(1.0+Scrap); /* keep the requirement of the current level */ reqs[_Level_+1]=Req; output; run;
/* Calculate the total requirement for each item */ proc sql; create table SumReq9 as select _Part_, Desc, Unit, sum(Req) as Gros_Req from IndBOM9a group by _Part_, Desc, Unit; quit;
Output 3.9.3: Total Requirements for Ordering 50 Units of 'LA01'
ABC Lamp Company |
Gross Requirements Report, Part LA01: Requirement=50 |
_Part_ | Desc | Unit | Gros_Req |
---|---|---|---|
1100 | Finished shaft | Each | 50 |
1200 | 6-Diameter steel plate | Each | 50 |
1300 | Hub | Each | 50 |
1400 | 1/4-20 Screw | Each | 300 |
1500 | Steel holder | Each | 50 |
1600 | One-way socket | Each | 50 |
1700 | Wiring assembly | Each | 50 |
2100 | 3/8 Steel tubing | Inches | 1560 |
2200 | 16-Gauge lamp cord | Feet | 660 |
2300 | Standard plug terminal | Each | 50 |
A100 | Socket assembly | Each | 50 |
B100 | Base assembly | Each | 50 |
LA01 | Lamp LA | Each | 50 |
S100 | Black shade | Each | 50 |
In another situation, you may like to know the quantity of each component used in making a certain amount of the end item,
without any regard for items on hand and scrap factors. A similar calculation as described above can be used to determine
the total usage for each item. In fact, the quantities of lower-level components that are used to make 1 unit of the end item
are already contained in the variable Qty_Prod
of the Indented BOM
data set. You only need to multiply those quantities by the specified amount of the end item and then add the values for
the same item together for each one. The following codes performs this task to create a report of the total usage for each
item in making 50 units of 'LA01
'. This usage report, SumUse9
, has been sorted by the _Part_
variable and is shown in Output 3.9.4.
/* Calculate the total usage for each item */ proc sql; create table SumUse9 as select _Part_, Desc, Unit, sum(Qty_Prod * 50) as Qty_Use from IndBOM9 group by _Part_, Desc, Unit; quit;
Output 3.9.4: Total Usages for Making 50 Units of 'LA01'
ABC Lamp Company |
Summarized Bill of Material, Part LA01: Requirment=50 |
_Part_ | Desc | Unit | Qty_Use |
---|---|---|---|
1100 | Finished shaft | Each | 50 |
1200 | 6-Diameter steel plate | Each | 50 |
1300 | Hub | Each | 50 |
1400 | 1/4-20 Screw | Each | 300 |
1500 | Steel holder | Each | 50 |
1600 | One-way socket | Each | 50 |
1700 | Wiring assembly | Each | 50 |
2100 | 3/8 Steel tubing | Inches | 1300 |
2200 | 16-Gauge lamp cord | Feet | 600 |
2300 | Standard plug terminal | Each | 50 |
A100 | Socket assembly | Each | 50 |
B100 | Base assembly | Each | 50 |
LA01 | Lamp LA | Each | 50 |
S100 | Black shade | Each | 50 |
As discussed in Example 3.7, you can also use the %BOMRSUB
SAS macro described in Chapter 4: Bill of Material Postprocessing Macros, to create the same report as that shown in Output 3.9.4.