The BOM Procedure

Bill of Material Explosion and Implosion

As described previously, the records (or observations) in the Indented BOM data set are organized in depth-first order (Aho, Hopcroft, and Ullman 1983). The order of observations in the Indented BOM data set and the presence of the _Level_ variable make it possible to perform bill of material explosion and implosion easily. In fact, the Indented BOM data set contains the quantity per product, total lead time, and total lead-time offset data already. The Summarized Parts data set lists the gross and net requirements for each item to fill a given production plan. Other calculations can be performed using a simple SAS DATA step. For example, the following SAS code creates a single-level bill of material for the item 'LA01' from the Indented BOM data set, IndBOM0, as displayed in Figure 3.3. The single-level bill of material is shown in Figure 3.6.

  /* Display the components that are directly used */
  /* in item LA01                                  */
proc print data=IndBOM0(where=(_Parent_='LA01')
                        rename=(_Part_=Component))
           noobs;
   var Component Desc QtyPer Unit;
   title 'ABC Lamp Company';
   title3 'Single-level Bill of Material Retrieval, Part LA01';
run;

Figure 3.6: Components Directly Used in Part LA01

ABC Lamp Company
 
Single-level Bill of Material Retrieval, Part LA01

Component Desc QtyPer Unit
B100 Base assembly 1 Each
S100 Black shade 1 Each
A100 Socket assembly 1 Each


The single-level where-used list for item '1400', displayed in Figure 3.7, is created with the following SAS code. PROC SQL is invoked to link the part master data to each parent item.

  /* Create the where-used data set */
data Used0a(keep=_Parent_ Paren_ID QtyPer Unit);
   set IndBOM0(where=(_Part_='1400'));
run;

  /* Get the part description from the IndBOM0 data set */
proc sql;
   create table Used0b as
      select Used0a._Parent_, IndBOM0.Desc, 
             Used0a.QtyPer, Used0a.Unit 
         from Used0a left join IndBOM0
            on Used0a.Paren_ID=IndBOM0.Part_ID;
quit;

  /* Display the where-used data set */
proc print data=Used0b noobs;
   var _Parent_ Desc QtyPer Unit;
   title 'ABC Lamp Company';
   title3 'Single-level Where-used Report, Part 1400';
run;

Figure 3.7: Parents in Which Part 1400 is Directly Used

ABC Lamp Company
 
Single-level Where-used Report, Part 1400

_Parent_ Desc QtyPer Unit
B100 Base assembly 4 Each
1500 Steel holder 2 Each


The section Reporting Macros in Chapter 4: Bill of Material Postprocessing Macros, describes six SAS autocall macros that can be used to create single-level, indented, and summarized bill of material and where-used lists for an item from the Indented BOM data set. Example 3.8 demonstrates a simple way to roll up costs using SAS DATA step code. Similar techniques can be used to aggregate lower level requirements up to the end items or to perform other bill of material explosion and implosion. See Example 3.9 and Example 3.10 for further examples.