The previous example illustrated how the bill of material can be arranged in product modules or options in order to obtain better forecasting, master production scheduling, and planning. There are also a number of other reasons for using modular bill of material. One reason is that the task of maintaining modularized bill of material is much simpler. The only bill of material that have to be maintained are the modules; there is no need to maintain enormous numbers of unique product configurations (Landvater and Gray 1989). You can easily construct a bill of material for a particular product configuration from the modular bill of material, if necessary. This example shows how to build modular bill of material for the 48 product configurations as described in Example 3.4. It also demonstrates how to construct a final-product-oriented bill of material from the modularized bill of material.
The ParComp5 data set contains the new product structure information. In this data set, the phantom items 'A10X', 'B10X', and 'S10X' are used as place holders for product modules: 'A100', 'A101', 'B100', ..., 'S107'. The following code first creates the new Product Structure data set, ParComp5. It then invokes PROC BOM with the Part Master data set, PMaster4 (described in Example 3.4), and the new Product Structure data set, ParComp5, to construct modular bill of material for the production line of the company. It also displays the modularized indented bill of material.
/* Product Structure data */ data ParComp5; format Parent $8. Component $8. QtyPer 8.2 ; input Parent $ Component $ QtyPer; datalines; LAXX 4000 1.00 LAXX B10X 1.00 LAXX S10X 1.00 LAXX A10X 1.00 4000 1100 1.00 4000 1300 1.00 4000 1400 4.00 4000 1500 1.00 4000 1700 1.00 B100 1200 1.00 B101 1201 1.00 B102 1202 1.00 A100 1600 1.00 A101 1601 1.00 1100 2100 26.00 1500 1400 2.00 1700 2200 12.00 1700 2300 1.00 ;
/* Generate the indented BOM data set */ proc bom data=ParComp5 pmdata=PMaster4 out=IndBOM5; structure / part=Part leadtime=LeadTime parent=Parent component=Component quantity=QtyPer id=(Desc Unit); run;
The Indented BOM data set, IndBOM5, is shown in Output 3.5.1. This output data set contains a pseudo bill of material for the pseudo end item 'LAXX' and 13 modules (modular bill of material) for items 'A100', 'A101', 'B100', 'B101', 'B102', and 'S100' ..., 'S107', respectively.
ABC Lamp Company |
Indented Bill of Material |
_Level_ | _Parent_ | _Part_ | Desc | QtyPer | Qty_Prod | Unit | LeadTime | Tot_Lead | _Prod_ |
---|---|---|---|---|---|---|---|---|---|
0 | A100 | Socket assembly | . | 1.00 | Each | 1 | 1 | A100 | |
1 | A100 | 1600 | One-way socket | 1.00 | 1.00 | Each | 2 | 3 | A100 |
0 | A101 | Three-way socket assem. | . | 1.00 | Each | 1 | 1 | A101 | |
1 | A101 | 1601 | Three-way socket | 1.00 | 1.00 | Each | 2 | 3 | A101 |
0 | B100 | Base assembly | . | 1.00 | Each | 1 | 1 | B100 | |
1 | B100 | 1200 | 6-Diameter steel plate | 1.00 | 1.00 | Each | 3 | 4 | B100 |
0 | B101 | 7in Base assembly | . | 1.00 | Each | 1 | 1 | B101 | |
1 | B101 | 1201 | 7-Diameter steel plate | 1.00 | 1.00 | Each | 3 | 4 | B101 |
0 | B102 | 8in Base assembly | . | 1.00 | Each | 1 | 1 | B102 | |
1 | B102 | 1202 | 8-Diameter steel plate | 1.00 | 1.00 | Each | 3 | 4 | B102 |
0 | LAXX | Lamp LA | . | 1.00 | Each | 3 | 3 | LAXX | |
1 | LAXX | 4000 | Common parts | 1.00 | 1.00 | Each | 0 | 3 | LAXX |
2 | 4000 | 1100 | Finished shaft | 1.00 | 1.00 | Each | 2 | 5 | LAXX |
3 | 1100 | 2100 | 3/8 Steel tubing | 26.00 | 26.00 | Inches | 3 | 8 | LAXX |
2 | 4000 | 1300 | Hub | 1.00 | 1.00 | Each | 2 | 5 | LAXX |
2 | 4000 | 1400 | 1/4-20 Screw | 4.00 | 4.00 | Each | 1 | 4 | LAXX |
2 | 4000 | 1500 | Steel holder | 1.00 | 1.00 | Each | 2 | 5 | LAXX |
3 | 1500 | 1400 | 1/4-20 Screw | 2.00 | 2.00 | Each | 1 | 6 | LAXX |
2 | 4000 | 1700 | Wiring assembly | 1.00 | 1.00 | Each | 1 | 4 | LAXX |
3 | 1700 | 2200 | 16-Gauge lamp cord | 12.00 | 12.00 | Feet | 2 | 6 | LAXX |
3 | 1700 | 2300 | Standard plug terminal | 1.00 | 1.00 | Each | 1 | 5 | LAXX |
1 | LAXX | B10X | Base assembly options | 1.00 | 1.00 | Each | 0 | 3 | LAXX |
1 | LAXX | S10X | Shade options | 1.00 | 1.00 | Each | 0 | 3 | LAXX |
1 | LAXX | A10X | Socket assembly options | 1.00 | 1.00 | Each | 0 | 3 | LAXX |
0 | S100 | Black shade | . | 1.00 | Each | 2 | 2 | S100 | |
0 | S101 | 14in White shade | . | 1.00 | Each | 2 | 2 | S101 | |
0 | S102 | 14in Cream shade | . | 1.00 | Each | 2 | 2 | S102 | |
0 | S103 | 14in Yellow shade | . | 1.00 | Each | 2 | 2 | S103 | |
0 | S104 | 15in Black shade | . | 1.00 | Each | 2 | 2 | S104 | |
0 | S105 | 15in White shade | . | 1.00 | Each | 2 | 2 | S105 | |
0 | S106 | 15in Cream shade | . | 1.00 | Each | 2 | 2 | S106 | |
0 | S107 | 15in Yellow shade | . | 1.00 | Each | 2 | 2 | S107 |
The following SAS code constructs an indented bill of material for the product
'LA01', which is configured with 'A100' (One-way socket assembly), 'B100' (6in Base assembly), and 'S100' (14in Black shade). It first uses the %BOMTSAE SAS macro to create a bill of material that is the same as the bill for the item 'LAXX', except the pseudo item 'B10X' is replaced by the modular bill for the item 'B100'. It then uses the %BOMTREP SAS macro to replace the pseudo items 'S10X' and 'A10X' with the bill of material for 'S100' and 'A100'. Note that the %BOMTSAE macro refers to the part master file PMaster3 (shown in Output 3.3.1) for the master data of the item 'LA01'. See the section Transactional Macros for details about these SAS macros.
/* Copy LAXX to LA01 with B10X replaced by B100 */ %bomtsae(root='LA01', sameas='LAXX', except='B10X', repby='B100', in=IndBOM5, pmdata=PMaster3, part=Part, quantity=QtyPer, leadtime=LeadTime, id=Desc Unit, out=BomOut5); /* Merge the bill of material for S100 to the new BOM */ data BomOut51; set BomOut5 IndBOM5(where=(_Prod_='S100')); run; /* Replace S10X with S100 */ %bomtrep(root='S10X', repby='S100', in=BomOut51, quantity=QtyPer, leadtime=LeadTime, id=Desc Unit, del=1, out=BomOut52); /* Merge the bill of material for A100 to the new BOM */ data BomOut53; set BomOut52 IndBOM5(where=(_Prod_='A100')); run; /* Replace A10X with A100 */ %bomtrep(root='A10X', repby='A100', in=BomOut53, quantity=QtyPer, leadtime=LeadTime, id=Desc Unit, del=1, out=BomOut5);
The indented bill of material for item 'LA01' is displayed in Output 3.5.2. It is the same as the bill of material displayed in Output 3.2.2 (which is created directly by PROC BOM), except for the common items such as '1100', '1300', '1400', '1500', and '1700', which are regrouped under the phantom item '4000'.
ABC Lamp Company |
Indented Bill of Material, Part LA01 |
_Level_ | _Parent_ | _Part_ | Desc | QtyPer | Qty_Prod | Unit | LeadTime | Tot_Lead | _Prod_ |
---|---|---|---|---|---|---|---|---|---|
0 | LA01 | Lamp LA | . | 1.00 | Each | 2 | 2 | LA01 | |
1 | LA01 | 4000 | Common parts | 1.00 | 1.00 | Each | 0 | 2 | LA01 |
2 | 4000 | 1100 | Finished shaft | 1.00 | 1.00 | Each | 2 | 4 | LA01 |
3 | 1100 | 2100 | 3/8 Steel tubing | 26.00 | 26.00 | Inches | 3 | 7 | LA01 |
2 | 4000 | 1300 | Hub | 1.00 | 1.00 | Each | 2 | 4 | LA01 |
2 | 4000 | 1400 | 1/4-20 Screw | 4.00 | 4.00 | Each | 1 | 3 | LA01 |
2 | 4000 | 1500 | Steel holder | 1.00 | 1.00 | Each | 2 | 4 | LA01 |
3 | 1500 | 1400 | 1/4-20 Screw | 2.00 | 2.00 | Each | 1 | 5 | LA01 |
2 | 4000 | 1700 | Wiring assembly | 1.00 | 1.00 | Each | 1 | 3 | LA01 |
3 | 1700 | 2200 | 16-Gauge lamp cord | 12.00 | 12.00 | Feet | 2 | 5 | LA01 |
3 | 1700 | 2300 | Standard plug terminal | 1.00 | 1.00 | Each | 1 | 4 | LA01 |
1 | LA01 | A100 | Socket assembly | 1.00 | 1.00 | Each | 1 | 3 | LA01 |
2 | A100 | 1600 | One-way socket | 1.00 | 1.00 | Each | 2 | 5 | LA01 |
1 | LA01 | B100 | Base assembly | 1.00 | 1.00 | Each | 1 | 3 | LA01 |
2 | B100 | 1200 | 6-Diameter steel plate | 1.00 | 1.00 | Each | 3 | 6 | LA01 |
1 | LA01 | S100 | Black shade | 1.00 | 1.00 | Each | 2 | 4 | LA01 |