The BOM Procedure

Indented BOM Data Set

The Indented BOM data set produced by PROC BOM contains the indented bill of material for all final products in the Part Master data set, or for all end items specified in the ENDITEM= option. Each observation of this data set represents one indented BOM record. Information contained in each indented BOM record can be classified into three categories: part master data for the item identified by the _Part_ variable, product structure data for the relationship of the component identified by the _Part_ variable to its parent identified by the _Parent_ variable, and data that are dedicated to this record.

As discussed in the section Getting Started: BOM Procedure, each indented bill of material can be illustrated by a family tree. Each node in the family tree corresponds to a record in the Indented BOM data set. The indented BOM record that is associated with the root node of a family tree is distinguished as the root record of the indented bill of material. For a given indented BOM record and its corresponding node $j$, the parent record of record $j$ is the indented BOM record that is associated with the parent node of node $j$. If the indented BOM record $i$ is the parent record of record $j$, then record $j$ is a child record of record $i$. Every record in the Indented BOM data set has a parent record except for the root records. Alternatively, an indented BOM record can have zero, one, two, or more child records.

Like the product structure record in the Product Structure data set, each indented BOM record in the Indented BOM data set contains a relationship of one component to its immediate parent item. The _Part_ variable contains the part number or identification information of the component. The _Parent_ variable contains the part number for the immediate parent item. Each record also contains all other product structure data from the product structure record with the same parent item (identified by the Parent variable) and component (identified by the Component variable) as in this record. The BOM procedure uses the following convention for naming the variable identifying the product structure data.

If you specify exactly one Quantity variable, the procedure uses the same variable name as specified in the QUANTITY= option for the variable that contains the value of the quantity per assembly for the relationship. On the other hand, if you do not specify the QUANTITY= option, or if you specify more than one Quantity variable, the variable Qty_Per contains this value. If you do not specify the QUANTITY= option, the value of the quantity per assembly is 1 for all relationships. The procedure also uses the same variable name as specified in the FACTOR= option if only one Factor variable is specified, and uses the default name, S_Factor, if two or more Factor variables are specified, for the variable that contains the value of scrap factor. Similarly, if you specify more than one Offset variable, the default name, L_Offset, is used; if you specify only one Offset variable, the same variable name is used for the variable that contains the value of the lead-time offset. Note that if you do not specify the FACTOR= or OFFSET= options, the Indented BOM data set does not have variables that contain the values of scrap factor or lead-time offset, respectively. The Indented BOM data set has the same RID variables as in the Product Structure data set. The values of those variables for each record are copied from the product structure record with the same parent item and component. The values of the _Parent_, Factor, Offset, Quantity, and RID variables for any root records should be missing, if these variables are present.

Each record of the Indented BOM data set also contains part master data for the item identified by the _Part_ variable in this indented BOM record. For instance, the lead time information is contained in the variable with the same variable name as specified in the LEADTIME= option. The Indented BOM data set also has the same ID variables as specified in the ID= option. The values of these variables for the indented BOM record are copied from the corresponding variables in the part master record for the same item (identified by the _Part_ variable) in the Part Master data set.

In addition to the product structure and part master data, each record of the Indented BOM data set contains other data calculated by PROC BOM. The _Prod_ variable contains the part number for the final product or end item of the indented bill of material corresponding to this record. For any root records, the value of the _Prod_ variable is the same as the value of the _Part_ variable. The _Level_ variable contains the indenture level number of the record. The procedure assigns the value of the indenture level to each record as follows: Each root record has indenture level 0, and all child records corresponding to a root record have level 1. All subsequent child records of these records have the level number increased by 1. This process continues until there are no further child records. The Part_ID variable contains the sequence or ID number that uniquely identifies each record in this data set. PROC BOM assigns this sequence number to each record in the data set by using the depth-first numbering scheme (Aho, Hopcroft, and Ullman 1983). The Paren_ID variable contains the ID number for the immediate parent record. The value of the Paren_ID variable for a root record is missing. These two variables are useful when you use the Indented BOM data set as the input data set for other SAS/OR procedures, such as PROC NETDRAW and PROC CPM, which require unique identification of each node. Refer to The NETDRAW Procedure and The CPM Procedure chapters in the SAS/OR User’s Guide: Project Management for details.

The Qty_Prod variable denotes the quantity of the item (identified by the _Part_ variable) required to make one unit of the end item identified by the _Prod_ variable. This value is also known as quantity per product and can be determined as

\[  qp_{i} = \left\{  \begin{array}{ll} 1 &  \mbox{if $j$ is missing} \\ qp_{j} \times q_{i} &  \mbox{otherwise} \end{array} \right.  \]

where

$\displaystyle  i  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Part\_ ID} variable}  $
$\displaystyle j  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Paren\_ ID} variable}  $
$\displaystyle qp_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the quantity per product of record $i$}  $
$\displaystyle q_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the quantity per assembly of record $i$}  $

If the LEADTIME= option is specified, PROC BOM measures the total lead time accumulated from the root record to the current record and stores it in the Tot_Lead variable. The formula to determine the total lead time for each record is

\[  tl_{i} = \left\{  \begin{array}{ll} t_{i} &  \mbox{if $j$ is missing} \\ tl_{j} + t_{i} &  \mbox{otherwise} \end{array} \right.  \]

where

$\displaystyle  i  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Part\_ ID} variable}  $
$\displaystyle j  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Paren\_ ID} variable}  $
$\displaystyle t_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the lead time of record $i$}  $
$\displaystyle tl_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the total lead time of record $i$}  $

Similarly, if the OFFSET= option is specified, the procedure computes the total offset from the root record to the current record and stores it in the Tot_Off variable. The total offset for each record can be determined as

\[  to_{i} = \left\{  \begin{array}{ll} o_{i} &  \mbox{if $j$ is missing} \\ to_{j} + o_{i} &  \mbox{otherwise} \end{array} \right.  \]

where

$\displaystyle  i  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Part\_ ID} variable}  $
$\displaystyle j  $
$\displaystyle  =  $
$\displaystyle  \mbox{the value for the \Variable{Paren\_ ID} variable}  $
$\displaystyle o_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the lead-time offset of record $i$}  $
$\displaystyle to_{i}  $
$\displaystyle  =  $
$\displaystyle  \mbox{the total offset of record $i$}  $

Note that the lead-time offset and the total offset may be expressed in a unit that is different from the lead time and the total lead time in this data set.

Table 3.4 lists all the variables in the Indented BOM data set. It also lists the type and a brief description of these variables.

Table 3.4: Indented BOM Data Set and Associated Variables

Product Structure Data (for the parent-component relationship)

Variable

Type

Interpretation

Factor

Numeric

Scrap factor

Offset

Numeric

Lead-time offset

_Parent_

Same as _Part_

Part number for the parent item

_Part_

Character or numeric

Part number for the component

Quantity

Numeric

Quantity per assembly

RID

Character or numeric

Additional product structure data

Part Master Data (for the component)

Variable

Type

Interpretation

ID

Character or numeric

Additional part master data

LeadTime

Numeric

Lead time

Indented BOM Data (for the record)

Variable

Type

Interpretation

_Level_

Numeric

Indenture level number

Paren_ID

Numeric

ID number of the parent record

Part_ID

Numeric

ID number

_Prod_

Same as _Part_

Part number for the end item

Qty_Prod

Numeric

Quantity per product

Tot_Lead

Numeric

Total lead time

Tot_Off

Numeric

Total lead-time offset


The indented BOM records in this data set are organized so that the bill of material contained in the data set are listed one by one. In each bill of material, the root record is always listed first. In addition, the left-most (oldest) component of each parent item is listed directly after its parent and before any right siblings of the parent item. For example, from the Indented BOM data shown in Figure 3.3, you can easily see that the final product 'LA01' is the first record of the Indented BOM data set. Moreover, item '1100' is listed directly after its parent, 'B100', and before the items 'S100' and 'A100' (the right siblings of the item 'B100'). The item '1100' is followed immediately by its first component '2100' (the only component in this case), and so on.

By organizing indented BOM records in such a manner and using the indenture level information, the single-level and multilevel relationships are quite clear. Let us use the indented BOM data set displayed in Figure 3.3 as an example. The three components, 'B100', 'S100', and 'A100', that go into 'LA01' are easily determined by the level 1 identifiers. It is also easy to see that item 'A100' takes three components at level 2, and one of them, item '1500', has a level 3 component (item '1400') and another item, '1700', has two level 3 components (items '2200' and '2300'). In fact, record 1 to record 6 of this data set contain the indented bill of material for item 'B100' because record 7 is the first record to have the same level as record 1. The single-level where-used and indented where-used lists can also be done in the same manner but by retrieving records in reversed order. For example, items 'B100' and '1500' that directly use component '1400' can be detected either by looking at the values of the _Parent_ variable directly in record 6 and record 10, or by looking up at the first records with level numbers that are 1 less than record 6 and record 10, respectively. By continuing to look upward, you see that item '1500' is used in 'A100' and item 'A100' is used in 'LA01'. As discussed previously, you can also find the parent record (the first record with one level up while retrieving the data in reversed order) information in the Paren_ID variable. The Indented BOM data set can also be used to propagate gross requirements, determine a schedule of lower-level items needed, aggregate lower-level demands, roll up material costs, and so on. See the section Bill of Material Explosion and Implosion for details.