急!急!求BOM递归算法(100分)

  • 主题发起人 主题发起人 cly888
  • 开始时间 开始时间
C

cly888

Unregistered / Unconfirmed
GUEST, unregistred user!
求BOM多层运算算法
 
说清楚点好不好,害得我还近来看了一看,不知所云
 
我有呀,一年前就做好的,我也找了很多网站,才从一个德国(还是澳大利亚)的网站找来的!
他是用access来做的,后来我用delphi该写了,再用treeview显示出来,效果不错! BOM的算法很难理解的,
 
richardho你好!我也有bom运算算法,不知你的算法是怎样。答案能否告诉我。我们互相交流
我的E-mail是chen_cry@sina.com
 
To ynhhr:
你好!不好意思!我讲得不清楚。bom运算是一种多层运算,
它的展开类似于资源管理器的目录树一样,一层一层展开,找到最后一层的.
谢谢!
 
其实就一个递归就好了,一切都在里面,注意每一个半成品及物料的用量就好了
到了MRP计算才会复杂一些
 
TO 吗啡!
我也是递归算法,不过我知道有两面种算法,一种是要用到oracle 的函数,我用的是sql
的数据库。找不到有此函数,这种算法要求建立bom很死。另一种是搜查目录树。不知你是否
相同,或有更好的算法。谢谢!
 
你是怎么样建树的呢?
首先在数据库中要形成一个树型的结构,然后出来了以后也要成为一个树型的结构。
(废话)

但是,你要问的问题我还不是很清楚丫
 
我做的BOM单中涉及的表有两个,一个是BOM主表,另一个是BOM的从表。
在BOM的从表中有一个字段是整型的,用它来指明它的父结点的ID号,这样就可以了。
最后,在读出数据的时候,所有的相关数据都要读出来,然后跟据ID号来建立连接关系即可
 
TO 吗啡!
你好!我做的BOM涉及的表是一个,所有的关连关系都分别在表的其它字段中.
 
TO 吗啡!
你好!我的BOM用的是一个表,所有的关联关系都存放在表的其它字段中。算法是在树中
搜索是否存在此节点。每一层的半成品及物料的用量你是怎么算的。能否告诉我你的E-mail
谢谢!
 
例子,结构:
BOM---
|------工序1
|------物品1
|------物品2
|------工序2
|------工序3
|------物品100
|------物品77
|------工序4
用TreeView做。
不用主从表(用一个字段保存其结构)
 
cly888:
狠可惜,找了一晚找不回原来的例子了,手上只有自己写的的代码,是有delphi写的,数据库为sqlserver
很难整理出来呀(因为有其他功能!如bom的显示(三种),增加,删除,查找等功能在一起呀!),毕竟花了一年多时间实践、完善的呀!
 
cly888:
刚才看了吗啡的方法,应该与我的一样,http://dbforums.com/showthread.php?threadid=131867
上有些零星的资料!
 
cly88:
先送上两个表的结构(MS SQL SERVER):

{此表用于储存model与part_num之间的结构和数量关系)
CREATE TABLE [dbo].[BOM_DETAIL] (
[PARENTID] [char] (12) NULL ,
[COMPONENTID] [char] (12) NULL ,
[NUMBERREQUIRED] [float] NULL ,
[LOCATION] [varchar] (256) NULL ,
) ON [PRIMARY]

{此表用于把model与part_num之间的结构和数量关系整理出来的结果储存起来)
CREATE TABLE [dbo].[OUTPUTTABLE] (
[leveled] [varchar] (256) NULL ,
[ComponentID] [char] (12) NULL ,
[NumberRequired] [float] NULL ,
[pid] [int] NULL ,
[comptype] [char] (1) NULL ,
[model_num] [char] (12) NULL ,
[location] [varchar] (256) NULL ,
) ON [PRIMARY]

by the way!
在实际工厂生产中有写零件(part_num)可能会用其他零件来代替,也要考虑进去哟!
(我是增加了一个表储存的确!)
 
呵呵,BOM有那么多人都做呀,看来我国的ERP还挺多人接触的呢。
我把我的BOM的建立代码给你吧:

procedure TsinBOM.Load;

procedure BuildByParent(const ParentItem: TsinBOMItem);
var
i: Integer;
ParentID: Integer;
begin
if Assigned(ParentItem) then ParentID := ParentItem.ID else ParentID := -1;
for i := 0 to FBOMItemList.Count - 1 do
begin
if not Assigned(FBOMItemList) then ShowMessage('Break while not assigned');
if FBOMItemList.ParentID = ParentID then
begin
FBOMItemList.ParentItem := ParentItem;
BuildByParent(FBOMItemList);
if Assigned(ParentItem) then ParentItem.SubItems.Add(FBOMItemList);
end;
end;
end;

var
Item: TsinBOMItem;
begin
{ Basic information }
with OpenSQL(Format('SELECT * FROM prj_main WHERE f01 = ''%s''', [FMateriel.Code])) do
begin
ID := FieldByName('f00').AsInteger;
FMateriel.Code := FieldByName('f01').AsString;
FMateriel.Name := FieldByName('f03').AsString;
FMateriel.Spec := FieldByName('f04').AsString;
FCustomer.Code := FieldByName('f20').AsString;
FCustomer.Load;
FEditor.Code := FieldByName('f09').AsString;
FEditor.Load;
FAudor.Code := FieldByName('f10').AsString;
FAudor.Load;
FEditTime := FieldByName('f11').AsDateTime;
FAudTime := FieldByName('f12').AsDateTime;
FFileNo := FieldByName('f21').AsString;
FEnableDate := FieldByName('f07').AsDateTime;
FDisableDate := FieldByName('f08').AsDateTime;
end;
{ Sub items information }
with OpenSQL(Format('SELECT * FROM prj_detail WHERE f10 = %d', [ID])) do
while not Eof do
begin
Item := TsinBOMItem.Create;
Item.ID := FieldByName('f00').AsInteger;
Item.Load;
FBOMItemList.Add(Item);
Next;
end;
{ Build relations }
BuildByParent(nil);
end;
 
我的EMAIL是:morphia@163.com
(不过网易的鬼信箱好慢的)
 
>>你好!我的BOM用的是一个表,所有的关联关系都存放在表的其它字段中。
>>算法是在树中搜索是否存在此节点。每一层的半成品及物料的用量你是
>>怎么算的。能否告诉我你的E-mail谢谢!

每一层的半成品及物料直接填入值就可以啦,不用算的,到了MRP计算
中才要算,不是这样子吗?还是我不清楚你的问题???

如果是算一个物料或半成品在整个产品中的用量的话,你可以这样子丫:
1、得到这个物料(半成品)在某一个BOM(产品)中的所有位置(因为可能
会有重复的使用丫);
2、然后,分别找出某一个物料(半成品)的用量(这个要用递归来找哦)
3、然后加上所有的分别找出的物料的量(这个量是当产品数量为一的时候的
使用量)
4、最后拿这个量乘以产品数量就可以了。

就这样子丫。
好运
 
后退
顶部