[易飛]關於內部備料訂單動態跟蹤庫存和銷貨量的統計
一 需求
各位銷售總:
關於年度會議上提到,希望銷售關註備料訂單數量動態維護問題。 和IT溝通過。 我們能夠在OA提供例如以下數據, 供各位參考。推斷是否有必要調整備料訂單的數量。 同一時候也請提出你們希望還要體現那些信息方便你們推斷是否要做備料調整。
客戶 料號 品名或規格 備料總數 近期2個月的銷量 最新備料時間 公司庫存 VMI庫存 在制數量
合肥XXX 123 xzm-16187 10000 5000 2015.12.01 10000 10000 3000
數據內容:
1. 客戶。品號,產品品名,該產品全部備料訂單的合計備料數量。最後一次備料訂單的下單時間。
2. 該客戶近期2個月的出貨數量。(VMI客戶按銷售對賬數量統計)—客戶的銷售數量時間段。 1個月。2個月還是3個月?請銷售確認一下多長比較合適。比較能貼近客戶的近期需求。
3. 備料訂單產品在公司和VMI倉的實時庫存數量。 在途生產工單的數量。
以上信息。希望對你們評估備料數量是否合理有幫助。請在這兩天回復一下, 以便IT能夠著手做程序設計。
另:
一旦你們確認要減低或取消備料訂單數量。 若這些備料訂單是我們銷售內部申請的, 發出通知後。讓銷售助理第一時間取消或降低。 同一時候讓物控確認在途相關材料,生產計劃。庫存等情況, 能調整的及時調整, 造成庫存的那也沒辦法。 做個庫存報備,秋後再算。這樣能及時將全部庫存,含材料庫存釋放出來。 供其它訂單使用, 降低呆滯風險, 同一時候也減產產能擠壓。
若是客戶下的備料訂單, 不論什麽的數量變動, 必須嚴格按公司的訂單變更流程走。
可用庫存函數:
-- =============================================
-- Author: <David Gong>
-- Create date: <>
-- Description: <可用庫存>
-- =============================================
ALTER function [dbo].[GetCurrentInvQty](
@ITEM AS VARCHAR(20)
)returns decimal(15,2)
as
begin
declare @qty decimal(15,2), --固定倉庫現有庫存
@qty1 as decimal(15,2), --未審核銷貨單據數量
@qty2 as decimal(15,2), --未審核領料單數量
@MB025 AS char(1) --品號屬性
set @qty1=0
set @qty2=0
select @MB025=MB025 from INVMB WHERE MB001=@ITEM
select @qty=sum(MC007) from INVMC
where MC001=@ITEM and MC002 in(‘01‘,‘02‘,‘03‘,‘04‘,‘05‘)
group by MC001
select @qty1=isnull(sum(TH008),0) from COPTH WITH(NOLOCK) INNER JOIN COPTG ON TH001=TG001 AND TG002=TH002
where TH004=@ITEM AND TG023=‘N‘
--if (@MB025=‘P‘) --採購件,則計入未審核領料單數量
--BEGIN
select @qty2=isnull(sum(TE005),0) from MOCTE WITH(NOLOCK) inner join MOCTC ON TE001=TC001 AND TE002=TC002
where TE004=@ITEM AND TC009=‘N‘
--END
return @qty-@qty1-@qty2
end
WIP數量
-- =============================================
-- Author: <David Gong>
-- Create date: <2016-01-22>
-- Description: <WIP Qty>
-- =============================================
ALTER function [dbo].[WIPQty](
@Item AS VARCHAR(20)
)returns decimal(18,4)
as
begin
declare @qty as decimal(18,4)
SELECT @qty=SUM(TA015-TA017) from MOCTA
WHERE TA013=‘Y‘ AND TA011 IN (‘2‘,‘3‘) AND TA006=@Item
return @qty
end
VMI倉數量
– =============================================
– Author:
– Create date: <2016-01-22>
– Description:
– =============================================
ALTER function [dbo].[VMIQty](
@CustomerNo as nvarchar(20),
@Item AS VARCHAR(20)
)returns decimal(18,4)
as
begin
declare @qty as decimal(18,4)
select @qty=sum(INVMC.MC007) from INVMC inner join CMSMC ON INVMC.MC002=CMSMC.MC001
where INVMC.MC001=@Item and CMSMC.UDF01=@CustomerNo
group by INVMC.MC001
return @qty
end
近期銷貨數量函數:
-- =============================================
-- Author: <David Gong>
-- Create date: <2016-01-22>
-- Description: <指定客戶 品號 近期 銷貨數量>
-- =============================================
ALTER function [dbo].[RecentlyDaySaleQty](
@CustomerNo as nvarchar(10),
@Item AS VARCHAR(20),
@Day as int
)returns decimal(18,4)
as
begin
declare @qty as decimal(18,4)
SELECT @qty=sum(TH008) FROM COPTG INNER JOIN COPTH ON TG001=TH001 AND TG002=TH002
WHERE TG023=‘Y‘ AND TG004=@CustomerNo AND TH004=@Item
AND DATEDIFF(DAY,TG003,GETDATE())<=@Day AND DATEDIFF(DAY,TG003,GETDATE())>=0
return @qty
end
近期備料日期
-- =============================================
-- Author: <David Gong>
-- Create date: <2016-01-22>
-- Description: <近期一次備料時間>
-- =============================================
ALTER function [dbo].[RecentlyBLDate](
@CustomerNo as nvarchar(20),
@Item AS VARCHAR(20)
)returns nvarchar(10)
as
begin
declare @TC003 as nvarchar(10)
select @TC003=TC003 from (
SELECT TOP 1 TC003 FROM COPTC INNER JOIN COPTD ON TC001=TD001 AND TC002=TD002
WHERE TC027=‘Y‘ and TC004=@CustomerNo and TD004=@Item
order by TC003 DESC ) as A
return @TC003
end
SQL:
with 備料訂單 as(
SELECT TC004 客戶編碼,MA002 客戶簡稱,TD004 品號,MB002 品名,MB003 規格,sum(TD008-TD009) 備料數量
FROM COPTC WITH(NOLOCK) INNER JOIN COPTD ON TC001=TD001 AND TC002=TD002
left join INVMB ON TD004=MB001
left join COPMA ON TC004=MA001
WHERE TC027=‘Y‘ and TC001=‘2207‘ and (TD008-TD009)<>0
GROUP BY TC004,TD004,MB002,MB003,MA002)
SELECT 客戶編碼,客戶簡稱,品號,品名,規格,備料數量,
dbo.[RecentlyDaySaleQty](客戶編碼,品號,60) as 近期2月銷量,[dbo].[RecentlyBLDate](客戶編碼,品號) as 近期備料日期,
dbo.GetCurrentInvQty(品號) as 可用庫存,[dbo].[WIPQty](品號) as 在制數量,[dbo].[VMIQty](客戶編碼,品號) as VMI數量
FROM 備料訂單
9秒鐘的執行速度:
可用庫存開銷占用79%。
若備料比較多。執行速度會高速下降
可用庫存改進成視圖,表與表關聯,降低可用庫存的全掃描的次數。
Create View [dbo].[AvailableQty]
as
with A as
(
select MC001 as Item,sum(MC007) InvQty from INVMC WITH(NOLOCK)
where MC002 in(‘01‘,‘02‘,‘03‘,‘04‘,‘05‘)
group by MC001
),
B as (
select TH004 as Item,isnull(sum(TH008),0) ShippedQty from COPTH WITH(NOLOCK) INNER JOIN COPTG ON TH001=TG001 AND TG002=TH002
where TG023=‘N‘
GROUP BY TH004
),
C as (
select TE004 as Item,sum(isnull(TE005,0)) requisitionQty from MOCTE WITH(NOLOCK) inner join MOCTC ON TE001=TC001 AND TE002=TC002
where TC009=‘N‘
Group by TE004)
select * from (
select A.Item,A.InvQty-isnull(B.ShippedQty,0)-isnull(C.requisitionQty,0) as AvailableQty from A LEFT JOIN B ON A.Item=B.Item
LEFT JOIN C ON A.Item=C.Item) AS D
WHERE D.AvailableQty<>0
GO
改進後SQL:
with 備料訂單 as(
SELECT TC004 客戶編碼,MA002 客戶簡稱,TD004 品號,MB002 品名,MB003 規格,sum(TD008-TD009) 備料數量
FROM COPTC WITH(NOLOCK) INNER JOIN COPTD ON TC001=TD001 AND TC002=TD002
left join INVMB ON TD004=MB001
left join COPMA ON TC004=MA001
WHERE TC027=‘Y‘ and TC001=‘2207‘ and (TD008-TD009)<>0
GROUP BY TC004,TD004,MB002,MB003,MA002)
SELECT 客戶編碼,客戶簡稱,品號,品名,規格,備料數量,
dbo.[RecentlyDaySaleQty](客戶編碼,品號,60) as 近期2月銷量,[dbo].[RecentlyBLDate](客戶編碼,品號) as 近期備料日期,
AvailableQty 可用庫存,
[dbo].[WIPQty](品號) as 在制數量,[dbo].[VMIQty](客戶編碼,品號) as VMI數量,b.區域
FROM 備料訂單 left join AvailableQty ON 品號=Item
left join COPMA ON 客戶編碼=MA001
left join (select MR002,ltrim(MR003) as 區域 from CMSMR where MR001=‘2‘) AS b on COPMA.MA076=b.MR002
速度下降到1秒內完畢:
在實際開發過程中,函數若涉及到多表的全掃描,數據量大的時候,資源開銷會占用比較大,若能改成一次性獲取結果集,最後關聯的方式會提高執行效率。
[易飛]關於內部備料訂單動態跟蹤庫存和銷貨量的統計