create table [dbo].[bom_detail] (
[pkid] [int] ,--identity (1, 1) not null ,
[bom_head_pkid] [int] not null ,
[children_item] [int] not null ,
[qty] [decimal](10, 0) not null
) on [primary]
create table [dbo].[bom_head] (
[pkid] [int] ,--identity (1, 1) not null ,
[master_item] [int] not null ,
[qty] [int] not null ,
[ver] [char] (20) collate chinese_prc_ci_as not null ,
[status] [nvarchar] (10) collate chinese_prc_ci_as not null ,
) on [primary]
create table [dbo].[item] (
[item] [int] ,--identity (1, 1) not null ,
[brand] [nvarchar] (10) ,
[part_no] [nvarchar] (10)
) on [primary]
insert item select 1 ,'a' ,'a1'
union all select 2 ,'b' ,'aaaaa'
union all select 3 ,'a' ,'ad'
union all select 4 ,'a' ,'ss'
union all select 5 ,'c' ,'123'
union all select 6 ,'c' ,'aaadsfd'
union all select 7 ,'d' ,'d22'
union all select 8 ,'c' ,'dddd512'
union all select 9 ,'a' ,'aa3223'
union all select 10,'dd','356'
insert bom_head select 1,1,1,1,'使用中'
union all select 2,3,1,1,'使用中'
union all select 3,1,1,2,'停用'
union all select 4,6,1,1,'使用中'
union all select 5,8,1,1,'使用中'
union all select 6,2,1,1,'使用中'
insert bom_detail select 1, 1,2 ,1
union all select 2, 1,6 ,2
union all select 3, 2,1 ,1
union all select 4, 3,4 ,1
union all select 5, 3,5 ,1
union all select 6, 4,7 ,1
union all select 7, 4,8 ,1
union all select 8, 5,9 ,1
union all select 9, 5,10,1
union all select 10,6,6, 1
go
/*--表間關係說明
bom_head表中pkid為一唯一值,同一master_item的status只有一行為"使用中",別的都為"停用"(注:是同一master_item),通過master_item與表item的item相關聯
bom_detail表中通過bom_head_pkid與bom_head表相關聯,通過chidern_item與item表的item相關聯
--*/
/*--展開bom的說明
item為1的物料的bom組成情況:
到bom_head表中查詢master_item=1 and status='使用中'
這樣可以找到bom_head表中的pkid=1的記錄
我可以從bom_detail表中根據bom_head_pkid=1可以得到master_item這個物料需要用到
childern_item分別為2 和 6 的物料;
在bom_head中master_item值為6並且status='使用中'
這樣可以到到bom_head的pkid為4
然後再到bom_detail中找到bom_head_pkid=4的記錄,這樣就可以發現master_item為6的物料需要用到childern_item分別為7和8的物料;
在bom_head中master_item值為8並且status='使用中'
這樣可以到到bom_head的pkid為45
然後再到bom_detail中找到bom_head_pkid=5的記錄,這樣就可以發現master_item為8的物料需要用到childern_item為9和10的物料;
這樣依次類推
最後要得到乙個類示樹狀的結構
如下圖所示
第一層 1 brand,part_no
第二層 2 brand,part_no,qty 6 brand,part_no,qty
第三層 7 brand,part_no,qty 8 brand,part_no,qty
第四層 9 brand,part_no,qty 10 brand,part_no,qty
--*/
--展開bom查詢的函式
create function f_bom(
@item int
)returns @r table(
item int,
brand nvarchar(10),
part_no nvarchar(10),
qty decimal(10,0), --取自bom_detail
level int, --層次
sid varchar(8000) --排序字段,通過這個來排序,可以體現出樹形的層次
)asbegin
declare @l int
set @l=0
insert @r select @item,brand,part_no,0,@l,right(10000+item,4)
from item
where item=@item
while @@rowcount>0
begin
set @l=@l+1
insert @r select i.item,i.brand,i.part_no,d.qty,@l,r.sid+','+right(10000+i.item,4)
from item i,bom_head h,bom_detail d,@r r
where r.level=@l-1
and r.item=h.master_item
and h.status='使用中'
and h.pkid=d.bom_head_pkid
and d.children_item=i.item
endreturn
endgo
--呼叫函式得到查詢結果
select 層次=space(level*2)+'├─' ,item,brand,part_no,qty from f_bom(1) order by sid
go--刪除測試
drop table item,bom_head,bom_detail
drop function f_bom
/*--測試結果
select * from f_bom(1)
select 層次=space(level*2)+'├─' ,item,brand,part_no,qty from f_bom(1) order by sid
----------------------------------
--相關知識點
----------------------------------
--1.
--這個函式的原型是right ( character_expression , integer_expression )
--意思是從character_expression 這個字元轉右邊其返回integer_expression 個字元
select right(10000+1,4)
--2.
--@@表示的是呼叫系統的值,返回的是上一句執行的影響的行數
--返回受上一語句影響的行數
select @@rowcount
--3.
--填充空格
select space(1) + 'a'
select space(15) + 'b'
K3 二次開發 常用資料表
select from icclasstype where fname chs like 供貨 用此表基本上可以查詢到所有的表 select from porequest 採購申請單表頭 select from porequestentry 採購申請單表體 表頭與表體用finterid關聯 sele...
K3老單二次開發學習記錄
重點內容 一 老單相關表 select from t thirdpartycomponent 老單外掛程式表 select from ictransactiontype 單據型別表 select from ictemplate select from ictemplateentry 單據模版表12 ...
K3Cloud二次開發規範 1
2.開發環境及命名空間規範 3.bos 設計器規範 4.資料庫物件命名總體規則 繼承體系 1.簡介 1.1.目的 規範k 3cloud產品二次開發規則,遵循過程改進 優化和管理的機制,特制定此工作指引。1.2.範圍 本工作指引適用於金蝶k 3cloud產品二次開發研發過程開發活動。1.3.物件導向 ...