[转]多级配方处理的简洁方式
多級配方處理的簡潔方式
????在Mis開發(fā)中經常會碰到配方(簡易BOM):如進銷存中的組裝單、拆卸單,MPR中的材料定額等均可以采用配方來解決。下邊是一個常規(guī)樹型配方的基本結構:
CREATE?TABLE?CL_CPPF(
?XH?varchar(30)?not?NULL,--型號
?CXH?varchar(30)?not?NULL,--子型號
?PFSM?varchar(30)?NULL,--說明
?SL?numeric(18,?3)?not?NULL?DEFAULT?(0),--子型號數(shù)量
?ID?int?IDENTITY(1,1)?NOT?NULL
)
????網上可以查到多個類似配方處理的代碼,大多是采用遞歸等方始處理的,代碼較為復雜,有些時候只需深度為一、二級的小配方,不需要多級深度的大配方。能否用一條SQL語句就可以處理類似一、二級的小配方的呢?
????通過努力,筆者終于找到了:
????深度為一級的小配方:
????Select?case?when?a.sl?is?null?then?b.cxh?else?a.CXH?end?cxh,b.SL*isnull(a.sl,1)?as?sl?From?CL_CPPF?as?b
left?JOIN?CL_CPPF?as?a?on?a.xh=b.cxh?where?b.xh='DJ-001'
????從語句上可以看出,一級的小配方僅僅是個左連查詢。這真是大道至簡呀。有了一級配方的語句,寫二級配方就非常容易了:
???Select?case?when?a.sl?is?null?then?b.cxh?else?a.CXH?end?cxh,b.SL*isnull(a.sl,1)?as?sl?From
(Select?'DJ-001'?as?xh,case?when?a.sl?is?null?then?b.cxh?else?a.CXH?end?cxh,b.SL*isnull(a.sl,1)?as?sl?From?CL_CPPF?as?b
left?JOIN?CL_CPPF?as?a?on?a.xh=b.cxh?where?b.xh='DJ-001'?)?as?b
left?JOIN?CL_CPPF?as?a?on?a.xh=b.cxh?where?b.xh='DJ-001'
????下邊是見證奇計的時刻了,
????現(xiàn)隆重推出多級(無限級)配方的SQL代碼:
declare?@XH?varchar(30)
declare?@ID?int,@ID1?int
CREATE?TABLE?#tmp?(
?XH?varchar(30)?NULL,
?CXH?varchar(30)?NULL,
?SL?numeric(18,?3)?NULL?DEFAULT?(0),
????????LVL?Int?NULL?DEFAULT?(0),--深度
?ID?int?IDENTITY(1,1)?NOT?NULL
)?
set?@XH?='DJ-001'
insert?into?#tmp?(xh,cxh,sl)?select?a.xh,a.cxh,a.sl?from?cl_CPPF?as?a?where?a.xh=?@XH?
set?@id=0
while?exists(select?b.xh?from?#tmp?as?b,?CL_CPPF?as?a?where?a.xh=b.cxh?and?b.xh=@XH?and?b.id>@id)
begin
??select?@id1=max(id)?from?#tmp
??insert?into?#tmp?(xh,cxh,sl,LVL)
??Select?@XH?as?xh,case?when?a.sl?is?null?then?b.cxh?else?a.CXH?end?cxh,b.SL*isnull(a.sl,1)?as?sl,b.LVL+1
??From?#tmp?as?b,?CL_CPPF?as?a?where?a.xh=b.cxh?and?b.xh=@XH?and?b.id>@id
??set?@id=@id1
end
select?*?from?#tmp?as?a?where?not?exists(?select?xh?from?cl_CPPF?as?b?where?b.xh=a.cxh)
drop?table?#tmp
???
??????非常簡單吧,上述多級(無限級)配方的SQL代碼也可為編寫其它復雜BOM時參考。
??????上述的代碼是從產品主型號查找子材料的代碼,作為問題的擴展,我們能否用子材料找出改材料被哪些主型號使用?
??????這里特別提示一下,代碼中的XH?與?CXH?是對等。
??????上述觀點僅供參考,代碼上有疑問多聯(lián)系,我們共同探討。
??義烏科創(chuàng)計算機有限公司軟件部
???Dcopyboy
???Email:dcopyboy@tom.com
???QQ:445235526
轉載于:https://www.cnblogs.com/prtmon/archive/2013/02/22/2921726.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[转]多级配方处理的简洁方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌鲁木齐中国铁建观澜府是毛坯房还是精装修
- 下一篇: SVN 版本服务器搭配全过程详解(服务端