======================================================================= BILL OF MATERIALS IN FORMS ======================================================================= PRODUCT: R:BASE VERSION : 3.1D & 4.0 ======================================================================= AREA : FORMS CATEGORY: APPLICATION DOCUMENT#: 666 ======================================================================= Bill of materials (BOM) applications are normally regarded as business and industry related; but they also extend their logic to agricultural and biological applications (tracking animal blood lines, for example) and to a variety of management applications. All require a method for managing what's called the exploding parts (population) problem. Products are made up of components made up of other parts, materials, or components. An animal produces offspring that produces their own offspring. In an office, employees are both employees and managers of other employees. All these situations can create explosion diagrams similar to the one below. The January 1989 R:BASE EXCHANGE showed you how to design a database and write an R:BASE for DOS program--using SET POINTER in a WHILE loop--to explode the parts in a bill of materials report. The January/February 1991 R:BASE EXCHANGE showed you how to do the same thing using SQL with the same database design. You see a single complex SELECT command do in R:BASE 3.1 what it took an entire program to do in R:BASE for DOS. Now, this article shows you how to do use an R:BASE 4.0 form to do what it took a long program to do in R:BASE for DOS and a complex SELECT command in R:BASE 3.1. The same database design is used. This technique is possible because R:BASE 4.0 allows forms to work on views. Diagram of an Explosion ----------------------- The diagram below shows a parts explosion. This example has four levels. The product (PROD1) explodes into its components, and each component explodes into the materials that comprise it, and one of the materials (M1) is made up of submaterials. Level One: Product ³ Level Two: Component ³ ³ Level Three: Material ³ ³ ³ Level Four: Submaterial ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÚÄÄÄ- Sub1 ³ ³ ÚÄÄÄÄÄ M1 ÄÄ´ ³ ³ ³ ÀÄÄÄÄ Sub2 ³ ÚÄÄÄÄÄ- A ÄÄÅÄÄÄÄ- M2 ³ ³ ÃÄÄÄÄ- M3 ³ ³ ÀÄÄÄÄ- M4 ³ ³ ³ ³ ÚÄÄÄ- Sub1 Prod1 ÄÄÄÄÄÙ ÃÄÄÄÄ- M1 ÄÄ´ ³ ³ ÃÄÄÄ- Sub2 ÃÄÄÄÄÄ- B ÄÄÅÄÄÄÄ- M2 ³ ÀÄÄÄÄ- M3 ³ ³ ÀÄÄÄÄÄÄ C ÄÄÄÄÄÄÄÄ M5 The Database Design ------------------- To produce an explosion diagram, you need a database design that accommodates any number of levels. The database needs to be flexible enough to adapt to many different kinds of explosions that use various components, materials, and submaterials. Microrim recommends that you use the parent-child concept to build the database. For example, look at the explosion diagram shown above. Think of each element in the diagram as being both a parent of zero, one, or more elements (children); and as a child of one or more parents. Design and Create the BOM ------------------------- To represent these relationships in your database, create a table (BOM) with two columns: PARENT (TEXT 10), and CHILD (TEXT 10). CREATE TABLE bom (parent TEXT 10 + NOT NULL, child TEXT 10 NOT NULL) This database design works with an unlimited number of levels. By having all the BOM relationships are in one table, it's easier to track a path through the explosion--relationship by relationship. Each path through the diagram is unique. There's only one PROD1-B-M3 path and only one PROD1-B-M1-SUB2 path. Load the BOM ------------ Load BOM with a row for every relationship. For example, enter the following lines at the R> prompt to load rows for the four-level BOM diagram shown above. LOAD bom USING parent, child PROD1 A PROD1 B PROD1 C A M1 A M2 A M3 A M4 B M1 B M2 B M3 C M5 M1 SUB1 M1 SUB2 M2 'The End' M3 'The End' M4 'The End' M5 'The End' SUB1 'The End' SUB2 'The End' END You need a row for every possible path, including the parents that have no children. The Form Explosion ------------------ Now with the database built and loaded, you can use a form to weave a path through the explosion. Two R:BASE 4.0 features allow the various levels of the parts explosion to display on a form: common columns and column names in views. R:BASE Forms automatically link tables based on common columns, columns that have the same name in two or more tables. When you add a table or view to a form, R:BASE looks to see which columns in the new table or view have the same name as columns in the preceeding tables on the form. Those columns are then used by the form to link the tables. When you edit data with the form, R:BASE then brings up rows in the lower tables where the common columns have matching data values. Naming the view columns with CREATE VIEW collist syntax allows you to specify the form's linking columns. The column names specified for the view do not need to match the column names in the SELECT part of the CREATE VIEW. It becomes easy to link child to parent, i.e. the form finds the rows where the child on the current level is a parent on the next level. Use the form with the Edit data option only. R:BASE displays up to five levels of exploding parts. Creating the views ------------------ Define the following views for the BOM database: CREATE VIEW bom1 (child,child2) AS SELECT parent,child FROM bom CREATE VIEW bom2 (child2,child3) AS SELECT parent,child FROM bom CREATE VIEW bom3 (child3,child4) AS SELECT parent,child FROM bom Creating the Form ----------------- A form can have up to five tables or views. Locate the table BOM as the first table, view BOM1 as the second table and so on. Make each of the views a region. As you scroll through the parent rows in the table, you'll see how the related parts change in the views. The form might look like this: ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ BOM: parent child BOM1: parent child ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ³ ³ ³ BOM2: parent child BOM3: parent child ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º º ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ How Does the form Work? ----------------------- To be able to customize your own application, you need to understand how the table and views interact on the form. Here's how the linking works between the table and the views: Table View View View BOM BOM1 BOM2 BOM3 common data common data common data common data column from column from column from column from ------------ ------------ ------------ ------------ parent parent child child ³ ÀÄÄÄÄÄÄÄÄÄÄ-> child parent child2 child ³ ÀÄÄÄÄÄÄÄÄÄ-> child2 parent child3 child ³ ÀÄÄÄÄÄÄÄÄÄÄ-> child3 parent child4 child Notice that there is no linking column throughout all the table/views on the form. Each is linked only to the immediately preceeding table/view. The form displays the data from the first row, the parent part is PROD1, the child is A. View BOM1 is linked to the table BOM through the common column CHILD. Rows are displayed from the view BOM1 where the data in this column matches that in the table BOM. In other words "A" is a value in the CHILD column in the table BOM and a value in the PARENT column (named CHILD) in the view BOM1. Remember that when we loaded the data, all parts are loaded into the PARENT column. The parts may or may not have child parts entered. If "A" is not a parent to other parts, the explosion ends - there are no more levels for the PROD1,A path through the data. But A is a parent to other parts so there are more levels to traverse. View BOM1 displays parent "A" and children "M1", "M2", "M3", "M4". Then view BOM2 is linked to the view BOM1 through the common column CHILD2 (data from CHILD in view BOM1 matching data from PARENT in view BOM2). Rows are displayed where any of "M1", "M2", "M3" or "M4" are parents to other parts. Each succeeding level is finding rows where the child on the previous level is also a parent. When a child part is no longer a parent part, the explosion ends. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Edit Go to Exit ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ BOM: parent child BOM1: parent child ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ PROD1 A º A M1 º ³ ³ º A M2 º ³ ³ º A M3 º ³ ³ º A M4 º ³ ³ º º ³ ³ º º ³ ³ º º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ³ ³ ³ BOM2: parent child BOM3: parent child ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ º M1 SUB1 º º SUB1 THE END º ³ ³ º M1 SUB2 º º º ³ ³ º º º º ³ ³ º º º º ³ ³ º º º º ³ ³ º º º º ³ ³ º º º º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ This diagram shows the linking through PROD1, A, M1 and SUB1. If we move to the view BOM1 and scroll through the rows there we can see the paths through PROD1, A and M2, PROD1, A and M3 and PROD1, A and M4. Because we have located regions, we only see the rows in the lower tables that are linked to the current row. This method assumes that for every parent part entered there is an entry in the child column. In other words, it assumes that there are no null values in either column. This is only the beginning. You have seen how to design a database and create views; and a demonstration of the basics of a form exploding a product into its component parts and materials. But remember that the exploding parts problem is complex. This database design and views on forms solution do not solve every exploding parts problem. Another example --------------- Consider an employee table with the following columns: employee name, department the employee works in, name of the employee's manager and other employee information. An employee can be both a manager and an employee. The goal to easily see each manager's employees. In this example, you are comparing the department the employee is in with the department the employee manages (if any). There is another column, employee_name, that will also be displayed. When you create the views you need to verify that this column has unique names to avoid being used as a linking column. The table: employee employee_name TEXT 20 department_in TEXT 10 dept_manages TEXT 20 . . . The views: CREATE VIEW level1 (empname1,depman,manage) AS + SELECT employee_name,department_in,dept_manages FROM employee CREATE VIEW level2 (empname2,manage,mngr) AS + SELECT employee_name,department_in,dept_manages FROM employee CREATE VIEW level3 (empname3,mngr,report) AS + SELECT employee_name,department_in,dept_manages FROM employee When using the form, you'll see data as shown below. Note that the tables display data and link based on the first row in each region. The Main level displays all employees. Level1 shows Lynn and Paul who are managed by David (first row in Main level). Level2 shows the employees Lynn manages, Roger and Mike R. Level3 shows the employees Roger manages. To see the employees that Paul manages, you would move to Level1 and position the cursor on the second row where Paul is the manager. Level2 and Level3 then display the rows that link back to Paul as a manager. Main Level 1 ÉÍemployeeÍÍdepartmentÍÍmanagesÍ» ÉÍemployeeÍÍdepartmentÍÍmanagesÍ» º David Exec Sales º º Lynn Sales Region1 ºÄ>¿ º Fred Exec Acctng º º Paul Sales Region2 º ³ º John Acctng -0- º º º ³ º Roger Region1 Area1 º º º ³ º Mike L. Persnl -0- º º º ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ Level 2 ³ ³ Level 3 ³ ÉÍemployeeÍÍdepartmentÍÍmanagesÍ» ÉÍemployeeÍÍdepartmentÍÍmanagesÍ» º Roger Region1 Area1 º º Frank Area1 -0- º º Mike R. Region1 Area2 º º Mike D. Area1 -0- º º º º Patsy Area1 -0- º º º º º º º º º º º º º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ