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 11th 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 11th 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 |
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.
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 ' |
|
Quantity on hand |
|
Net requirement |
1 |
---|---|
'1100' Finished shaft (1 per base assembly) |
|
Gross requirement |
|
(= net requirement of ' |
|
Quantity on hand |
|
Net requirement |
1 |
'2100' 3/8 Steel tubing (26 inches per shaft) |
|
Gross requirement |
|
(= net requirement of ' |
|
Quantity on hand |
|
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.