[转]多级配方处理的简洁方式
多級(jí)配方處理的簡(jiǎn)潔方式
????在Mis開發(fā)中經(jīng)常會(huì)碰到配方(簡(jiǎn)易BOM):如進(jìn)銷存中的組裝單、拆卸單,MPR中的材料定額等均可以采用配方來解決。下邊是一個(gè)常規(guī)樹型配方的基本結(jié)構(gòu):
CREATE?TABLE?CL_CPPF(
?XH?varchar(30)?not?NULL,--型號(hào)
?CXH?varchar(30)?not?NULL,--子型號(hào)
?PFSM?varchar(30)?NULL,--說明
?SL?numeric(18,?3)?not?NULL?DEFAULT?(0),--子型號(hào)數(shù)量
?ID?int?IDENTITY(1,1)?NOT?NULL
)
????網(wǎng)上可以查到多個(gè)類似配方處理的代碼,大多是采用遞歸等方始處理的,代碼較為復(fù)雜,有些時(shí)候只需深度為一、二級(jí)的小配方,不需要多級(jí)深度的大配方。能否用一條SQL語句就可以處理類似一、二級(jí)的小配方的呢?
????通過努力,筆者終于找到了:
????深度為一級(jí)的小配方:
????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'
????從語句上可以看出,一級(jí)的小配方僅僅是個(gè)左連查詢。這真是大道至簡(jiǎn)呀。有了一級(jí)配方的語句,寫二級(jí)配方就非常容易了:
???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'
????下邊是見證奇計(jì)的時(shí)刻了,
????現(xiàn)隆重推出多級(jí)(無限級(jí))配方的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
???
??????非常簡(jiǎn)單吧,上述多級(jí)(無限級(jí))配方的SQL代碼也可為編寫其它復(fù)雜BOM時(shí)參考。
??????上述的代碼是從產(chǎn)品主型號(hào)查找子材料的代碼,作為問題的擴(kuò)展,我們能否用子材料找出改材料被哪些主型號(hào)使用?
??????這里特別提示一下,代碼中的XH?與?CXH?是對(duì)等。
??????上述觀點(diǎn)僅供參考,代碼上有疑問多聯(lián)系,我們共同探討。
??義烏科創(chuàng)計(jì)算機(jī)有限公司軟件部
???Dcopyboy
???Email:dcopyboy@tom.com
???QQ:445235526
轉(zhuǎn)載于:https://www.cnblogs.com/prtmon/archive/2013/02/22/2921726.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的[转]多级配方处理的简洁方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌鲁木齐中国铁建观澜府是毛坯房还是精装修
- 下一篇: 乌鲁木齐鑫天化中心是毛坯房还是精装修?