The BOM Procedure

Getting Started: BOM Procedure

The ABC Lamp Company product line example from Fogarty, Blackstone, and Hoffmann (1991) illustrates the basic features of PROC BOM. The Part Master data set, PMaster0, displayed in Figure 3.1, contains the part master records for all items in the company. Each master record contains the part number (denoted by the Part variable) and the part description (denoted by the Desc variable) for an item. It also contains data on unit of measure (denoted by the Unit variable) for the item. The Product Structure data set, ParComp0, displayed in Figure 3.2, contains all product structure records in the company. Each product structure defines a parent-component relationship. The Parent variable contains the part number for the parent item and the Component variable contains the part number for the component. The QtyPer variable contains the quantity per assembly for the parent-component relationship.

The values for the Parent and Component variables are linked by the value of the Part variable in the Part Master data set to define the parent-component relationship. For example, in the $11$th observation of the data set ParComp0 (as displayed in Figure 3.2), the value '1100' for the Parent variable is linked to the first observation of the data set PMaster0 (as displayed in Figure 3.1), which provides the part description and unit of measure for the parent item. Similarly, the value of '2100' for the Component variable is linked to the eighth observation of the part master file providing the master data for the component. Therefore, the parent-component relationship that is represented in the $11$th observation of the product structure data set, ParComp0, should be interpreted as: each finished shaft uses $26$ inches of 3/8 steel tubing.

Figure 3.1: Part Master File (PMaster0)

ABC Lamp Company
 
Part Master Data Set

Obs Part Desc Unit
1 1100 Finished shaft Each
2 1200 6-Diameter steel plate Each
3 1300 Hub Each
4 1400 1/4-20 Screw Each
5 1500 Steel holder Each
6 1600 One-way socket Each
7 1700 Wiring assembly Each
8 2100 3/8 Steel tubing Inches
9 2200 16-Gauge lamp cord Feet
10 2300 Standard plug terminal Each
11 A100 Socket assembly Each
12 B100 Base assembly Each
13 LA01 Lamp LA Each
14 S100 Black shade Each


Figure 3.2: Product Structure File (ParComp0)

ABC Lamp Company
 
Product Structure Data Set

Obs Parent Component QtyPer
1 LA01 B100 1
2 LA01 S100 1
3 LA01 A100 1
4 B100 1100 1
5 B100 1200 1
6 B100 1300 1
7 B100 1400 4
8 A100 1500 1
9 A100 1600 1
10 A100 1700 1
11 1100 2100 26
12 1500 1400 2
13 1700 2200 12
14 1700 2300 1


The following code invokes PROC BOM to produce the indented bill of material for the product 'LA01' and the summarized parts list for the production plan in which 1 unit of 'LA01' is planned in the current planning period (period 1).

  /* Create the indented BOM and summarized parts list */
proc bom data=ParComp0 pmdata=PMaster0 
         out=IndBOM0 summaryout=SumBOM0; 
   structure / part=Part 
               parent=Parent
               component=Component
               quantity=QtyPer
               id=(Desc Unit);
run;

The Indented BOM data set, IndBOM0, is displayed in Figure 3.3. This data set contains the indented bill of material for the product 'LA01'. Each record or observation in this data set contains product structure data: the part number for the parent item is contained in the _Parent_ variable, the part number for the component is contained in the _Part_ variable, and the quantity per assembly is contained in the QtyPer variable. It also contains the part master data (Desc and Unit variables) from the Part Master data set for the component identified by the _Part_ variable. If a component is used in more than one parent item, it appears in multiple records. For example, the item 1/4-20 Screw (part number '1400') is used in both Base assembly (part number 'B100') and Steel holder (part number '1500'); this item occurs in records identified by the values 6 and 10 for the variable Part_ID.

Figure 3.3: Indented Bill of Material (IndBOM0)

ABC Lamp Company
 
Indented Bill of Material, Part LA01

_Level_ _Parent_ _Part_ Desc QtyPer Qty_Prod Unit Paren_ID Part_ID _Prod_
0   LA01 Lamp LA . 1 Each . 0 LA01
1 LA01 B100 Base assembly 1 1 Each 0 1 LA01
2 B100 1100 Finished shaft 1 1 Each 1 2 LA01
3 1100 2100 3/8 Steel tubing 26 26 Inches 2 3 LA01
2 B100 1200 6-Diameter steel plate 1 1 Each 1 4 LA01
2 B100 1300 Hub 1 1 Each 1 5 LA01
2 B100 1400 1/4-20 Screw 4 4 Each 1 6 LA01
1 LA01 S100 Black shade 1 1 Each 0 7 LA01
1 LA01 A100 Socket assembly 1 1 Each 0 8 LA01
2 A100 1500 Steel holder 1 1 Each 8 9 LA01
3 1500 1400 1/4-20 Screw 2 2 Each 9 10 LA01
2 A100 1600 One-way socket 1 1 Each 8 11 LA01
2 A100 1700 Wiring assembly 1 1 Each 8 12 LA01
3 1700 2200 16-Gauge lamp cord 12 12 Feet 12 13 LA01
3 1700 2300 Standard plug terminal 1 1 Each 12 14 LA01


As discussed in the section Overview: BOM Procedure, each indented bill of material can be illustrated by a family tree. In fact, each record in the Indented BOM data set corresponds to a node in this tree. Figure 3.4 displays the tree diagram for the indented bill of material in the IndBOM0 data set. Each tree node or record is uniquely identified by a sequence or ID number that is assigned to it by the procedure. The Part_ID variable contains this ID number for each record. The Paren_ID variable contains the sequence number for the parent node or parent record. A parent record for a given record is the record that defines the parent node of the node defined by the given record. For example, the parent record of record 6 in the data set IndBOM0 is record 1, while record 9 is the parent record of record 10. Record 0 has no parent record.

Figure 3.4: Tree Diagram for the Bill of Material for LA01

Tree Diagram for the Bill of Material for LA01


The IndBOM0 data set contains other data: The _Level_ variable denotes the indenture level number for each node or record. The root node with the sequence number 0 is at level 0, and the level numbers increase as you look down the tree. The _Prod_ variable contains the part number of the end item. The Qty_Prod variable contains the quantity per product, that is, the quantity of the component identified by the _Part_ variable required to make one unit of the end item 'LA01'. Note that in this particular example, the values of the Qty_Prod variable are identical to the values of the QtyPer variable. This is because the quantities per assembly for all the parent-component relationships are 1, except for relationships 'B100'-'1400', '1100'-'2100', '1500'-'1400', '1700'-'2200'. The components ('1400', '2100', and '2200') of these parent-component relationships do not have any subcomponents themselves.

Figure 3.3, as well as Figure 3.4, shows that the Indented BOM data set lists all the records in depth-first order. This scheme lists tree nodes from top to bottom and from left to right. For example, item '1100' is listed directly after its parent, 'B100', and before items 'S100' and 'A100' (the right siblings of item 'B100'). Similarly, item '2100' is listed directly after item '1100' and before items '1200', '1300', and '1400'. Refer to Aho, Hopcroft, and Ullman (1983) for details about depth-first ordering. See the section Indented BOM Data Set for details regarding the records in this data set.

Figure 3.5: Summarized Parts List (SumBOM0)

ABC Lamp Company
 
Summarized Parts List, Period 1

_Part_ Low_Code Gros_Req On_Hand Net_Req Desc Unit
1100 2 1 0 1 Finished shaft Each
1200 2 1 0 1 6-Diameter steel plate Each
1300 2 1 0 1 Hub Each
1400 3 6 0 6 1/4-20 Screw Each
1500 2 1 0 1 Steel holder Each
1600 2 1 0 1 One-way socket Each
1700 2 1 0 1 Wiring assembly Each
2100 3 26 0 26 3/8 Steel tubing Inches
2200 3 12 0 12 16-Gauge lamp cord Feet
2300 3 1 0 1 Standard plug terminal Each
A100 1 1 0 1 Socket assembly Each
B100 1 1 0 1 Base assembly Each
LA01 0 1 0 1 Lamp LA Each
S100 1 1 0 1 Black shade Each


The Summarized Parts data set, SumBOM0, is displayed in Figure 3.5. This data set, which has been sorted by the _Part_ variable, has a record for each item in the ABC Lamp Company’s product line. Each record contains the part master data from the Part Master data set, PMaster0. The _Part_, Desc, and Unit variables contain the part number, part description, and unit of measure, respectively, for each item. It also contains some other data: The Low_Code variable denotes the low-level code of the item. The low-level code for an item is a number that indicates the lowest level in any bill of material at which this item appears. For example, item '1400' appears at levels 2 and 3 in this example; thus, its low-level code is 3. The low-level codes are necessary to make sure that the net requirement for a given item is not calculated until all the gross requirements have been calculated down to that level. The On_Hand variable contains the quantity of the item currently on hand. Since the part master file (as shown in Figure 3.1) does not contain any quantity on hand information, the procedure assumes that this variable is 0 for all items. The Gros_Req and Net_Req variables contain the gross and net requirements, respectively. Again, since the PMaster0 data set does not provide any production plan information, PROC BOM assumes that the final product, 'LA01', is the only master schedule item and the gross requirement for this item is 1 unit. The net requirement for item 'LA01' is the gross requirement (1) minus the quantity on hand (0). The gross and net requirements of the other items are then calculated sequentially:

'B100' Base assembly (1 per lamp)

Gross requirement

 

(= net requirement of 'LA01' $\times $ quantity per assembly)

$1 \times 1 = 1$

Quantity on hand

   $- 0$

Net requirement

$1$

'1100' Finished shaft (1 per base assembly)

Gross requirement

 

(= net requirement of 'B100' $\times $ quantity per assembly)

$1 \times 1 = 1$

Quantity on hand

   $- 0$

Net requirement

$1$

'2100' 3/8 Steel tubing (26 inches per shaft)

Gross requirement

 

(= net requirement of '1100' $\times $ quantity per assembly)

$1 \times 26 = 26$

Quantity on hand

   $- 0$

Net requirement

$26$

If an item (such as item '1400' in this example) is used in more than one assembly, the gross requirement is the total needed in all assemblies where it is used. See the section Summarized Parts Data Set for details about determining the gross and net requirements.

Recall that the Part Master data set (as shown in Figure 3.1) does not contain any quantity on hand and requirement information, and item 'LA01' is the only final product. Thus, in this example, the summarized parts list (as displayed in Figure 3.5) is actually the same as the summarized bill of material for item 'LA01', with the gross (or net) requirement representing the total usage of each item.