壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1640|回复: 0

SBO_SP_TransactionNotification存储过程实例研究一例

[复制链接]
发表于 2008/7/25 15:40:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
因为项目的原因,最近研究了一下SBO系统SBO_SP_TransactionNotification 存储过程的应用(不了解SBO_SP_TransactionNotification 存储过程的朋友可以看这里:http://www.itpub.net/780713.html)。在项目实施过程中遇到了一个难题,生产订单在下达后,由于库管员未能在产成品入库前完成材料发货的处理,引起了生产订单成本的巨大变动,这也对管理造成了非常不良的影响,也可以直接说是管理的一个漏洞。在建议客户方从管理制度上进行约束和控制未果的情况下,首先想到使用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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 17:46 , Processed in 0.014713 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表