-- 检查存储过程是否存在,存在则删除 P202502080013 IF OBJECT_ID('dbo.[PR_ResetSALORDERPLAN_MBBA_yuyubo]', 'P') IS NOT NULL BEGIN DROP PROCEDURE dbo.PR_ResetSALORDERPLAN_MBBA_yuyubo; PRINT '存储过程 dbo.[PR_ResetSALORDERPLAN_MBBA_yuyubo] 已删除'; END; GO -- 创建新的存储过程 CREATE PROCEDURE dbo.PR_ResetSALORDERPLAN_MBBA_yuyubo @saleOrderId INT = 0 AS BEGIN -- 1. 声明游标 DECLARE cursor_name CURSOR FOR SELECT a.F_AMOUNT, b.F_MBBA_DECIMAL_UKY, a.FBILLNO, a.FSALEORGID, a.F_CONTRACTNUMBER, a.FID, b.FENTRYID AS wfid, b.FRECADVANCEAMOUNT, a.F_EXPENSES,b.FRecAdvanceRate,a.F_TotalPositiveAmount,fin.FExchangeRate FROM dbo.T_SAL_ORDER a WITH (NOLOCK) LEFT JOIN dbo.T_SAL_ORDERPLAN b WITH (NOLOCK) ON a.FID = b.FID LEFT JOIN T_SAL_RETURNNOTICEFIN fin WITH (NOLOCK) ON a.fid=fin.FID --INNER JOIN --( -- SELECT DISTINCT -- [销售单主键ID], -- [整单累计退货金额], -- [整单正数订单总额] -- FROM [ZRP_YingShouMingXi_yuyubo] -- WHERE [整单正数订单总额] > 0 --) cc -- ON [销售单主键ID] = a.FID WHERE --( -- ISNULL(a.F_AMOUNT, 0) > 0 -- AND [整单正数订单总额] - ISNULL(a.F_AMOUNT, 0) - [整单累计退货金额] > 0 -- ) -- AND ( a.FID = @saleOrderId OR @saleOrderId = 0 ) --AND b.F_MBBA_DECIMAL_UKY < a.F_AMOUNT OR a.FID = @saleOrderId ORDER BY a.FID, wfid; -- 2. 打开游标 OPEN cursor_name; DECLARE @rowId INT = 0, @amount DECIMAL(18, 4) = 0; -- 3. 循环获取数据 DECLARE @F_AMOUNT DECIMAL(18, 2), @F_MBBA_Decimal_uky DECIMAL(18, 2), @FBILLNO NVARCHAR(200), @FSALEORGID INT, @F_contractnumber NVARCHAR(500), @fid INT, @wfid INT, @FRecAdvanceAmount DECIMAL(18, 2), @F_EXPENSES DECIMAL(18, 6), @FRecAdvanceRate DECIMAL(18, 6) , @F_TotalPositiveAmount DECIMAL(18, 6), @FExchangeRate DECIMAL(18, 4); FETCH NEXT FROM cursor_name INTO @F_AMOUNT, @F_MBBA_Decimal_uky, @FBILLNO, @FSALEORGID, @F_contractnumber, @fid, @wfid, @FRecAdvanceAmount, @F_EXPENSES, @FRecAdvanceRate, @F_TotalPositiveAmount , @FExchangeRate ; WHILE @@FETCH_STATUS = 0 BEGIN -- 数据处理逻辑(示例输出) --PRINT 'Column1: ' + CAST(@var1 AS VARCHAR) + ', Column2: ' + @var2; -- 处理收款核销金额 IF (@rowId != @fid) BEGIN SELECT @rowId = @fid,@amount = @F_AMOUNT; --@amount = @F_AMOUNT - @F_EXPENSES; SELECT @FRecAdvanceAmount=@F_TotalPositiveAmount/@FExchangeRate*@FRecAdvanceRate*0.01; END; PRINT @amount; IF (@amount >= @FRecAdvanceAmount and @FRecAdvanceAmount>0) BEGIN DECLARE @tempF_EXPENSES DECIMAL(18,2)=0;---临时运费变量 UPDATE T_SAL_ORDERPLAN SET F_MBBA_DECIMAL_UKY = @FRecAdvanceAmount+@F_EXPENSES*FRECADVANCERATE*0.01,@tempF_EXPENSES=@F_EXPENSES*FRECADVANCERATE*0.01 WHERE FENTRYID = @wfid; SELECT @amount = @amount - @FRecAdvanceAmount-@tempF_EXPENSES; END; ELSE BEGIN IF (@amount >= 0) BEGIN UPDATE T_SAL_ORDERPLAN SET F_MBBA_DECIMAL_UKY = @amount WHERE FENTRYID = @wfid; SELECT @amount = 0; END; ELSE BEGIN UPDATE T_SAL_ORDERPLAN SET F_MBBA_DECIMAL_UKY = 0 WHERE FENTRYID = @wfid; SELECT @amount = 0; END; END; -- 获取下一条记录 FETCH NEXT FROM cursor_name INTO @F_AMOUNT, @F_MBBA_Decimal_uky, @FBILLNO, @FSALEORGID, @F_contractnumber, @fid, @wfid, @FRecAdvanceAmount, @F_EXPENSES, @FRecAdvanceRate, @F_TotalPositiveAmount , @FExchangeRate ; END; -- 4. 关闭游标 CLOSE cursor_name; -- 5. 释放游标资源 DEALLOCATE cursor_name; END; --EXEC dbo.PR_ResetSALORDERPLAN_MBBA_yuyubo @saleOrderId = 0 -- int --UPDATE T_SAL_ORDERPLAN SET F_MBBA_Decimal_uky=0