Mis多級配方處理的簡潔方式

2021-09-20 08:34:36 字數 4402 閱讀 8758

mis多級配方處理的簡潔方式

在mis開發中經常會碰到配方(簡易bom):如進銷存中的組裝單、拆卸單,mpr中的材料定額等均可以採用配方來解決。下邊是乙個常規樹型配方的基本結構:

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),--子型號數量

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'

下邊是見證奇計的時刻了,

現隆重推出多級(無限級)配方的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

endselect * 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 是對等。

上述觀點僅供參考,**上有疑問多聯絡,我們共同**。

在mis開發中經常會碰到配方(簡易bom):如進銷存中的組裝單、拆卸單,mpr中的材料定額等均可以採用配方來解決。下邊是乙個常規樹型配方的基本結構:

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),--子型號數量

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'

下邊是見證奇計的時刻了,

現隆重推出多級(無限級)配方的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

endselect * from #tmp as a where not exists( select xh from cl_cppf as b where b.xh=a.cxh)

drop table #tmp

非常簡單吧,上述多級(無限級)配方的sql**也可為編寫其它複雜bom時參考。

記憶體的分配方式

對於我們初學者來說,記憶體是個神秘的空間。程式的絕大部分錯誤,也是在於記憶體的使用不當造成的,而且這些錯誤有些都是隱藏很深的。所以,如何掌握記憶體的使用,通曉系統對記憶體的管理手段,將是軟體成功的乙個非常關鍵的因素。首先我們要了解記憶體的分配方式。一般來說,記憶體的分配方式有三種 1 從靜態儲存區域...

nginx upstream的分配方式

原始出處 作者資訊和本宣告。否則將追究法律責任。1 輪詢 預設 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。2 weight 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。例如 upstream bakend 3 ip hash 每...

記憶體的分配方式

關於記憶體的分配方式 靜態儲存區 自由儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料,全域性資料。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式...