一個BOM樹的問題,有經驗者請進(100)(100分)

  • 主题发起人 主题发起人 rk_kitty
  • 开始时间 开始时间
R

rk_kitty

Unregistered / Unconfirmed
GUEST, unregistred user!
如圖,是兩個產品的Bom(不能發圖!-!只好用表)
a
|
-------------
| |
b*2 c*3
-------
| |
d *2 e*1

==============================================
h
|
i *2
|
e 3*
================================


如今,我想要在 e下新增子物料,很明顯,不能為b,a,i.
但是也不能為h,否則會造成死循環,怎樣做到不能新增h,如果採用一層一層的查物料,將e的上層物料,上上層物料,上上層物料的上層物料………..全找出來,那太慢了.
有甚麼好辦法沒有,快點告訴我,
急!!!!!!















 
這個e是指在產品a下的e
 
冒泡排序或折中法,看看算法分析吧,好像书上的例子。
 
如果採用一層一層的查物料,將e的上層物料,上上層物料,上上層物料的上層物料………..
全找出來,那太慢了.
>岂止是慢的问题,这本身会有漏洞
如果有 f
|
a * 2

那么e下面连f都不能都不能挂,可你的BOM表却反映不出

我用的是存储过程,将要储存的BOM子项现有的所有子项抓出来,如果里面有父项,那么表
示将会产生循环,否则可以加入
 
我使用的是ibm db2数据库。SQL Server我不熟

//保存工艺料单明细记录的循环结构检查。举例说明:在 A 的工艺料单下,添加物料项目 B 。
// 一、首先 ,B 不等于 A 。
// 二、找出 A 的所有直接或间接上级级项目集合 X 。
// 三、B 必须不在 X 中
if Table_GYLDMX.FieldByName('ZCXM').AsString=Table_GYLD.FieldByName('xmbh').AsString then
begin
Application.MessageBox('该组成项目将产生循环结构,请重新录入组成项目。',
'提示信息',mb_OK or mb_ICONEXCLAMATION);
DBGrid_GYLDMX01.SetFocus;
Abort;
end;
Query.SQL.Clear;
Query.SQL.Add('with tmp(xmbh) as(select xmbh from t_gyldmx where zcxm='''
+Table_GYLD.FieldByName('xmbh').AsString
+''' union all select t_gyldmx.xmbh from t_GYLDmx,tmp where t_gyldmx.zcxm=tmp.xmbh) '
+'select distinct xmbh from tmp');
Query.Active:=True;
if Query.Locate('xmbh',Table_GYLDMX.FieldByName('ZCXM').AsString,[loCaseInsensitive]) then
begin
Application.MessageBox('该组成项目将产生循环结构,请重新录入组成项目。',
'提示信息',mb_OK or mb_ICONEXCLAMATION);
DBGrid_GYLDMX01.SetFocus;
Abort;
end;
 
建议你多研究一下数据结构(特别是图中关于回路的查找)
 
多人接受答案了。
 
后退
顶部