ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » SAP R/3 » SAP Business One开发与快速实施 » SBO_SP_TransactionNotification存储过程实例研究一例

标题: [精华] SBO_SP_TransactionNotification存储过程实例研究一例
  本主题由 charles6222 于 2008-3-26 19:08 设置高亮 
离线 Arraymachine123
初级会员



精华贴数 1
个人空间 0
技术积分 169 (10904)
社区积分 0 (484406)
注册日期 2005-6-26
论坛徽章:1
ITPUB新首页上线纪念徽章     
      

发表于 2007-9-30 23:47 
SBO_SP_TransactionNotification存储过程实例研究一例

因为项目的原因,最近研究了一下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


只看该作者    顶部
离线 akun
中级会员



精华贴数 0
个人空间 0
技术积分 370 (5250)
社区积分 5 (15064)
注册日期 2002-9-4
论坛徽章:0
      
      

发表于 2007-10-8 14:37 
很不错
很多企业都有控制生产收发货顺序的需求

有些时候,很郁闷SAP为什么不加个控制开关


只看该作者    顶部
离线 Arraymachine123
初级会员



精华贴数 1
个人空间 0
技术积分 169 (10904)
社区积分 0 (484406)
注册日期 2005-6-26
论坛徽章:1
ITPUB新首页上线纪念徽章     
      

发表于 2007-10-18 10:39 
贴子都置顶了,就再给个精华吧!!!!



只看该作者    顶部
离线 ferryfu
版主



精华贴数 1
个人空间 0
技术积分 960 (1947)
社区积分 6 (13937)
注册日期 2004-4-11
论坛徽章:6
现任管理团队成员管理团队2006纪念徽章2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:足球生肖徽章2007版:鸡ITPUB新首页上线纪念徽章
      

发表于 2007-11-13 20:59 
应该授个精华。


__________________
有志于Sap b1的人都是我的朋友。
只看该作者    顶部
离线 cuixinhua


来自 江苏
精华贴数 0
个人空间 0
技术积分 295 (6640)
社区积分 0 (1643708)
注册日期 2007-11-29
论坛徽章:0
      
      

发表于 2007-12-3 21:27 
真的不错,我在实施过程中,早就有这样的需求了,嘿嘿!谢谢了!顶了!!


__________________
~!一直以为自己是个天才,
现在才发现自己是个天生的蠢材!~
QQ:270787599
MSN:cui_xin_hua@hotmail.com
EMAIL:coda-21@163.com
            coda@unisap.com.cn
深圳市优尼赛普科技有限公司
SAP专业合作伙伴,提供专业的SBO咨询和实施服务
www.unisap.com.cn
只看该作者    顶部
离线 hhl_2008
一般会员



精华贴数 0
个人空间 0
技术积分 182 (10246)
社区积分 0 (1075801)
注册日期 2006-8-17
论坛徽章:0
      
      

发表于 2007-12-11 13:51 
好东西!!


只看该作者    顶部
离线 eneni
Jerry


精华贴数 2
个人空间 0
技术积分 800 (2357)
社区积分 0 (650875)
注册日期 2005-10-11
论坛徽章:0
      
      

发表于 2008-1-17 11:44 
帮版主纠错

感谢版主提供这段代码! 但我在测试中发现一点逻辑问题,不知道是不是BO版本的原因。

有问题代码(红色下划线部分):
/*           --如需在制作收货单时严格控制收货数量,可使用本段代码
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

--==条件判断有点问题,BO在触发这个存储过程前已将这张单据的收货数量加入到了OWOR表中。
WHERE T0.BaseType ='202' and T0.DocEntry = cast(@list_of_cols_val_tab_del as int) and T0.Quantity >(T1.PlannedQty-T1.CmpltQty))
--==应改为=======================
--WHERE T0.BaseType ='202' and T0.DocEntry = cast(@list_of_cols_val_tab_del as int) and T1.PlannedQty<T1.CmpltQty))
--===============================


begin
  select @error = 1
  select @error_message = '添加生产收货单出错,所收产品数量大于生产订单未入库数量!'
end
else
*/

另外,在实际生产中,有可能会产生发购原料但多生产出产品的情况,可能的原因有:原料来料包装中本来就多了数量、仓库发料时未点清数量多发了、以及特点行业如注塑加工就很常见多生产出几个或几十个产品。所以要用这段代码钢性控制,可以考滤在这里加个允许范围,如: T1.PlannedQty<T1.CmpltQty-10


只看该作者    顶部
离线 dored
初级会员



精华贴数 0
个人空间 0
技术积分 72 (21189)
社区积分 0 (672164)
注册日期 2005-10-29
论坛徽章:0
      
      

发表于 2008-1-17 19:08 
该方法只是 SBO 众多客户化定制方法中的一个,SBO 是极其灵活的。只要技术水平足够,几乎任何需求都能实现。


__________________
Juway Addon for SBO 下载(客户数据权限管理等功能)
九维软件工作室 http://blog.vsharing.com/juwaysoft/
Email: waysoft2@gmail.com
只看该作者    顶部
离线 cicizz
野狼


精华贴数 0
个人空间 0
技术积分 1347 (1258)
社区积分 17 (8242)
注册日期 2006-1-15
论坛徽章:2
会员2007贡献徽章授权会员    
      

发表于 2008-2-26 21:56 
配套的!


__________________
直销安溪铁观音,有意者请跟我联系,价格从优!MSN:HDL03DATA@HOTMAIL.COMEMAIL:hdl03data@163.com
只看该作者    顶部
离线 hy_athlon



精华贴数 0
个人空间 0
技术积分 28 (43302)
社区积分 0 (1705618)
注册日期 2008-2-21
论坛徽章:0
      
      

发表于 2008-3-26 10:57 
强烈建议授个精华!
这个控制过程对于按订单生产的装配型企业极为有用.
谢谢!


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问