Did anyone have any thoughts?

On Mon, 2006-09-18 at 00:02 -0400, THO wrote:
> In need of suggestions to get correct part multiplier factor.
> (apologies up front for message length)
> 
> I have an parts/assemblies table.
> 
> mysql> describe assycard;
> +----------+-----------------+------+-----+---------+-------+
> | Field    | Type            | Null | Key | Default | Extra |
> +----------+-----------------+------+-----+---------+-------+
> | part_id  | int(7) unsigned | NO   | PRI | 0       |       |
> | assy     | int(7)          | NO   | PRI | 0       |       |
> | qty_assy | int(7) unsigned | NO   |     | 0       |       |
> | unit     | char(10)        | NO   |     | EA      |       |
> +----------+-----------------+------+-----+---------+-------+
> 
> This table forms an assembly tree and parts list resource.  qty_assy is
> the qty of each part (part_id) that belongs to an assembly (assy).
> Assembly number assy can also be a part_id and in that case is called a
> sub-assembly and has a qty_assy value for how many sub-assemblies belong
> to its parent assembly.
> 
> I have a procedure that eventually, properly generates the tree...
> Thanks to info from
> http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
> 
> What I have been unable to get right is the qty_assy multipliers up the
> tree.
> 
> truncated example;
> 
> +---------+--------------------------------+-------------+
> | part_id | assy                           | qty_assy    |
> +---------+--------------------------------+-------------+
> | 8100028 | 8100030                        |           8 |
> | 8100029 | 8100028                        |           6 |
> | 1000100 | 8100029                        |           1 |
> | 2100050 | 8100029                        |           4 |
> +---------+--------------------------------+-------------+
> 
> parts 1000100 and 2100050 belong to assembly 8100029 which is a child of
> 8100028, 8100028 is a child of the top assembly 810030.  In this example
> there are 6 8100029's in 8100028 and 8 8100028's in 8100030 therefore
> every part in 8100029 should be multiplied by 48 to account for all
> parts from 8100029 included in 1 8100030 (48 1000100's and 192
> 2100050's). Parts in 8100028 should only be multiplied by 8 to account
> for parts in 8100028 included in 8100030.  The actual depth of the tree
> is in principal unknown so I need to walk the tree and correctly collect
> the multipliers for each assembly.
> 
> The heart of the assembly tree procedure that works, with some cleaning
> up of the result, is below but carrying the qty factors along the way
> did not work...
> 
> DROP PROCEDURE IF EXISTS ListDescendants;
> DELIMITER |
> CREATE PROCEDURE scanner.ListDescendants( IN ancestor int(7) )
> BEGIN
>   DECLARE rows INT DEFAULT 0;
>   -- CREATE NEEDED TABLES
>   DROP TABLE IF EXISTS descendants;
>   CREATE TABLE IF NOT EXISTS descendants ( d_part_id int(7), d_assy
> int(7), d_qty int(5) ) ENGINE=MEMORY;
>   DROP TABLE IF EXISTS nextparents;
>   CREATE TABLE IF NOT EXISTS nextparents ( assy int(7), np_qty_assy
> int(5) ) ENGINE=MEMORY;
>   DROP TABLE IF EXISTS prevparents;
>   CREATE TABLE prevparents LIKE nextparents;
>   
>   -- SEED NEXTPARENTS
>   INSERT INTO nextparents
>     SELECT assy, qty_assy FROM assycard WHERE assy=ancestor and
> qty_assy!=0;
>   SET rows = ROW_COUNT();
>    
>   WHILE rows > 0 DO
>     -- ADD CHILDREN OF NEXTPARENTS
>     INSERT INTO descendants
>       SELECT t.part_id, t.assy, t.qty_assy
>       FROM assycard AS t
>       INNER JOIN nextparents USING(assy) where t.part_id!=0;
>     SET rows = ROW_COUNT();
>     -- SAVE COPY OF NEXTPARENTS
>     TRUNCATE prevparents;
>     INSERT INTO prevparents
>       SELECT * FROM nextparents;
>     -- NEXT PARENTS ARE CHILDREN OF THESE PARENTS:
>     TRUNCATE nextparents;
>     INSERT INTO nextparents
>       SELECT part_id, qty_assy FROM assycard
>       INNER JOIN prevparents USING (assy) where assycard.part_id!=0;
>     SET rows = rows + ROW_COUNT();
>   END WHILE;
> ...
> cleanup of resulting descendants table, joining with part and cost
> information from other tables...
> 

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to