(写于07年9月)
因为项目的原因,最近研究了一下SBO系统SBO_SP_TransactionNotification 存储过程的应用(不了解SBO_SP_TransactionNotification 存储过程的朋友可以看这里:[url]http://www.itpub.net/780713.html[/url])。在项目实施过程中遇到了一个难题,生产订单在下达后,由于库管员未能在产成品入库前完成材料发货的处理,引起了生产订单成本的巨大变动,这也对管理造成了非常不良的影响,也可以直接说是管理的一个漏洞。在建议客户方从管理制度上进行约束和控制未果的情况下,首先想到使用SBO的这个存储过程进行强制控制。
强制控制的好处是明显的:一、生产订单成本会相对准确;二、有效控制生产过程,实现对生产成本的严格管理和准确核算;三、可以防止库管员违规操作,养成库管员遵循管理规则工作的良好习惯;四、堵住了库房管的漏洞,减少人为差错的可能性。
但是,强制控制也有缺点:一是钢性的管理控制不利于优良企业文化的形成,企业管理层将会以技术手段来代替管理的各项规章和制度;二是强制控制不灵活,如在实际生产过程中的确可以出现在标准生产用量的情况下多加工产成品的情况,在这种情况下将不能进行产成品入库;……

以下是原代码,有兴趣的朋友可以拿去用,有什么意见欢迎来踩一下。在代码里各关键点有相关注释,有SQL经验的朋友应该一看就明白,如果有想转载的朋友,请注明出处!谢谢!!!

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER proc SBO_SP_TransactionNotification
@object_type nvarchar(25), -- SBO Object Type
@transaction_type nchar(1), -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)
AS
begin
-- Return values
declare @error int -- Result (0 for no error)
declare @error_message nvarchar (200) -- Error string to be displayed
select @error = 0
select @error_message = N'Ok'
--------------------------------------------------------------------------------------------------------------------------------
-- ADD YOUR CODE HERE
declare @ItemCode nvarchar(20) --用于处理过程中涉及到的物料编码
declare @ItemName nvarchar(200) --用于存储物料名称
declare @outWhsCode nvarchar(10) --用于存储调出仓库编码
declare @inWhsCode nvarchar(10) --用于存储调入仓库编码
declare @DocNum nvarchar(10) --用于存储单据编号

--============================= 生产收货库存控制 ===============================
--使用说明:在生产收货时核对已发原材料数量是否满足生产需要,如不满足则不允许生产收货处理。
--设计时间:20070924
--版 本:V1.0
--设 计 者:盛普科技 蒋晓冬

if @object_type='59' and @transaction_type in ( N'A',N'U')
--收货单类型代码为'59'(注意:库存交易收货对象代码也为59),控制类型为'A'添加类型、'U'更新类型
begin
declare @CmpltQty numeric --完工数量
declare @BaseQty numeric --基本数量
declare @IssuedQty numeric --已发货数量
declare @chdItemcode nvarchar(20) --子件物料编码
/* --如需在制作收货单时严格控制收货数量,可使用本段代码
if exists( --判断当前入库数量是否大于生产计划中未入库数量
SELECT T0.DocEntry, T0.BaseRef, T0.BaseType, T0.BaseEntry, T0.BaseLine, T0.ItemCode, T0.Dscription, T0.Quantity,
T1.DocNum, T1.DocEntry, T1.ItemCode, T1.PlannedQty, T1.CmpltQty, T1.Warehouse
FROM IGN1 T0
inner join OWOR T1 ON T0.BaseEntry = T1.DocEntry and T0.ItemCode=T1.Itemcode
WHERE T0.BaseType ='202' and T0.DocEntry = cast(@list_of_cols_val_tab_del as int) and T0.Quantity >(T1.PlannedQty-T1.CmpltQty)
)
begin
select @error = 1
select @error_message = '添加生产收货单出错,所收产品数量大于生产订单未入库数量!'
end
else
*/
if ( --判断当前收货成品是否已发出足额原材料,否则不允许保存
SELECT count(*)
FROM OWOR T0
INNER JOIN IGN1 T1 ON T1.BaseEntry = T0.DocEntry and T0.ItemCode=T1.Itemcode
INNER JOIN WOR1 T2 ON T0.DocEntry = T2.DocEntry
WHERE T1.DocEntry = cast(@list_of_cols_val_tab_del as int)
AND T1.BaseType = '202' --生产收货单代码为'202'
AND T0.Status <> 'L' --生产订单单据状态:'L'为未清,'C'为已清
AND T2.IssueType = 'M' --生产订单中发货类型:'M'为手动方式
AND (T0.CmpltQty * T2.BaseQty ) > T2.IssuedQty --此行为关键判断条件:生产订单完成数量×订单基本数量 > 生产订单中材料已发货数量
) > 0
begin
/* --本段用于调试程序,有不明错误发生时,可打开本段代码,在SBO系统信息栏内将显示相关单据信息
-- SELECT top 1 @Itemcode=T0.Itemcode,@chdItemcode=T2.itemcode,@CmpltQty = T0.CmpltQty, @BaseQty = abs((T0.CmpltQty * T2.BaseQty ) - T2.IssuedQty), @IssuedQty = T2.IssuedQty
-- SELECT T1.DocEntry,T0.Itemcode,T0.DocEntry,T2.itemcode,T0.CmpltQty, T2.BaseQty, (T0.CmpltQty * T2.BaseQty ), T2.IssuedQty
FROM OWOR T0
INNER JOIN IGN1 T1 ON T1.BaseEntry = T0.DocEntry and T0.ItemCode=T1.Itemcode
INNER JOIN WOR1 T2 ON T0.DocEntry = T2.DocEntry
WHERE T1.DocEntry =cast(isnull(@list_of_cols_val_tab_del,0) as int)
AND T1.BaseType = '202'
AND T0.Status <> 'L'
AND T2.IssueType = 'M'
AND (T0.CmpltQty * T2.BaseQty ) > T2.IssuedQty
-- select @error_message ='收货单号:'+ISNULL(@list_of_cols_val_tab_del,'0') +'__母件编码:'+@Itemcode +'__子件编码:'+@chdItemcode +'__入库数量:'+ ltrim(cast(ISNULL(@CmpltQty,0) as nvarchar(20)))+ '__基本数量:'+ltrim(cast(isNULL(@BaseQty,0) as nvarchar(20)))+ '__已发货数量:'+ltrim(cast(isnull(@IssuedQty,0) as nvarchar(20)))
*/
select @error_message = '添加生产收货单出错,所发原料不能满足生产需求!' --如需使用调试程序段,请将本行进行注释!!
select @error = 1
end
end
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
-- Select the return values
select @error, @error_message
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO