SAP由2005B升级至2007B对收款的影响

本文介绍了一个使用B1内置存储过程监控收款动作的案例,并详细解释了如何根据收款总额更新订单状态的逻辑。文章还记录了从B1 2005升级到2007过程中遇到的问题及解决方案。

曾在一个项目中,使用B1内置的存储过程监控收款动作,如果针对于特定订单所做的收款总额符合指定条件后而进行相应的操作.我们知道在B1中,收款的ObjectType是24,因此,我们设定的条件是@ObjectType='24' AND @TransactionType='A'.

代码如下:

ContractedBlock.gifExpandedBlockStart.gifCode
/*****************************************************
  预收款达到超过预收款比例的,自动更新为已批准。
  收款达到全款,自动更新为已批准。
****************************************************
*/
DECLARE @PaymentCode NVARCHAR(255)
DECLARE @OrderDocNum NVARCHAR(255)
DECLARE @OrderPaymentCount NUMERIC(19,6)
DECLARE @SubsistProportion NUMERIC(19,6)
DECLARE @OrderDocTotal NUMERIC(19,6)
IF @object_type='24' AND @transaction_type='A'
BEGIN
    
SET @PaymentCode=@list_of_cols_val_tab_del
    
SET @OrderDocNum=(SELECT CounterRef FROM ORCT WHERE DocEntry=@PaymentCode)
    
SET @OrderPaymentCount=(SELECT SUM(NoDocSum) AS Total FROM ORCT WHERE CounterRef=@OrderDocNum)
    
SET @CardCode=(SELECT CardCode FROM ORDR WHERE DocNum=@OrderDocNum)
    
SET @SubsistProportion=(SELECT U_SubsistProportion FROM OCRD WHERE CardCode=@CardCode)
    
SET @SubsistProportion=@SubsistProportion/100
    
SET @OrderDocTotal=(SELECT DocTotal FROM ORDR WHERE DocNum=@OrderDocNum)
    
SET @CardGroupCode=(SELECT GroupCode FROM OCRD WHERE CardCode=@CardCode)  

    
-- 判断条件为预收款总金额大于订单总额*预收款比例并且客户组类型为'部分预付款'  
    IF @OrderPaymentCount>=@SubsistProportion*@OrderDocTotal AND @CardGroupCode='103'
    
BEGIN 
        
UPDATE ORDR SET Confirmed='Y' WHERE DocNum=@OrderDocNum
        
--SELECT @error_message=@OrderDocNum+'->'
    END
    
-- 判断条件为收款达到订单总额并且客户组类型为'现款现结'
    IF @OrderPaymentCount>=@OrderDocTotal AND @CardGroupCode='100'
    
BEGIN
        
UPDATE ORDR SET Confirmed='Y' WHERE DocNum=@OrderDocNum
        
--SELECT @error_message=@OrderDocNum+'->'
    END
END

 

    但是,在升级至2007之后,我们发现,在做收款时,这段代码始终没有执行,我们使用存储过程返回的对象代码变成了30,而30则应该是日记账分录的ObjectType.但是,通过我们对存储过程的全程跟踪,我们发现:

2009-4-8 14:27:58;INFO;company is: B1Plus_Demo Message is: dbName:B1Plus_Demo oType:30 xType:A nofc:1 cols:TransId vals:5
2009-4-8 14:27:58;INFO;company is: B1Plus_Demo Message is: dbName:B1Plus_Demo oType:241 xType:A nofc:1 cols:CFTId vals:4

当用户做收款时,在2007B版本中,会同时产生两条数据,第一条30是日记账分录,第二条241是2005B中所不具备的对象,在2007B中,表示现金流行项目,而在2005B中的24收款对象,则没有再使用.为此调整了代码,尽管最终也解决了问题,但仍然对此调整感到不解.新的代码如下:

ContractedBlock.gifExpandedBlockStart.gifCode
/*****************************************************
  预收款达到超过预收款比例的,自动更新为已批准。
  收款达到全款,自动更新为已批准。
  
  2009.04.08
  由于升级至2007,收款时对象不再使用24,而是使用30(日记
  账分录)和241(现金流相关行),因此调整代码.
****************************************************
*/
DECLARE @JDTCode NVARCHAR(255)
DECLARE @TransType NVARCHAR(255
DECLARE @PaymentCode NVARCHAR(255)
DECLARE @OrderDocNum NVARCHAR(255)
DECLARE @OrderPaymentCount NUMERIC(19,6)
DECLARE @SubsistProportion NUMERIC(19,6)
DECLARE @OrderDocTotal NUMERIC(19,6)
--select @error=1
select @error_message='@object_type: '+@object_type
IF @object_type='30' AND @transaction_type='A'
BEGIN
    
SET @JDTCode=@list_of_cols_val_tab_del
    
SET @TransType=(SELECT TransType FROM OJDT WHERE TransID=@JDTCode)
    
IF(@TransType='24')
    
BEGIN
        
SET @PaymentCode=(SELECT BaseRef FROM OJDT WHERE TransID=@JDTCode)
        
SET @OrderDocNum=(SELECT CounterRef FROM ORCT WHERE DocEntry=@PaymentCode)
        
SET @OrderPaymentCount=(SELECT SUM(NoDocSum) AS Total FROM ORCT WHERE CounterRef=@OrderDocNum)
        
SET @CardCode=(SELECT CardCode FROM ORDR WHERE DocNum=@OrderDocNum)
        
SET @SubsistProportion=(SELECT U_SubsistProportion FROM OCRD WHERE CardCode=@CardCode)
        
SET @SubsistProportion=@SubsistProportion/100
        
SET @OrderDocTotal=(SELECT DocTotal FROM ORDR WHERE DocNum=@OrderDocNum)
        
SET @CardGroupCode=(SELECT GroupCode FROM OCRD WHERE CardCode=@CardCode)  

        
-- 判断条件为预收款总金额大于订单总额*预收款比例并且客户组类型为'部分预付款'  
        IF @OrderPaymentCount>=@SubsistProportion*@OrderDocTotal AND @CardGroupCode='103'
        
BEGIN 
            
UPDATE ORDR SET Confirmed='Y' WHERE DocNum=@OrderDocNum
        
END
        
-- 判断条件为收款达到订单总额并且客户组类型为'现款现结'
        IF @OrderPaymentCount>=@OrderDocTotal AND @CardGroupCode='100'
        
BEGIN
            
UPDATE ORDR SET Confirmed='Y' WHERE DocNum=@OrderDocNum
        
END
    
END
END
基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值