USE [TDG.Normal]
GO
/****** Object: StoredProcedure [dbo].[sp_SaveForCurrentStockSNBarcode] Script Date: 2020/12/02 13:07:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_SaveForCurrentStockSNBarcode]
@cVouchType VARCHAR(50),
@RDID INT
AS
BEGIN
DECLARE @AUTOID BIGINT, @BRDFLAG INT;
DECLARE @CWHCODE VARCHAR(50),@CINVCODE VARCHAR(50), @CBATCH VARCHAR(50), @CPOSITION VARCHAR(50), @CBARCODE VARCHAR(50), @CMADANBARCODE VARCHAR(50);
DECLARE @CFREE1 VARCHAR(50),@CFREE2 VARCHAR(50), @CFREE3 VARCHAR(50), @CFREE4 VARCHAR(50), @CFREE5 VARCHAR(50);
DECLARE @CFREE6 VARCHAR(50),@CFREE7 VARCHAR(50), @CFREE8 VARCHAR(50), @CFREE9 VARCHAR(50), @CFREE10 VARCHAR(50);
DECLARE @IQUANTITY decimal(10,3), @INUM decimal, @IBOXQUANTITY decimal(10,3);
DECLARE @INTIME DateTime, @OUTTIME DateTime, @UPSTATUS SMALLINT, @CURSTATUS SMALLINT;
DECLARE @cunitname VARCHAR(50), @cassitunit VARCHAR(50);
DECLARE @vdef1 VARCHAR(50),@vdef2 VARCHAR(50), @vdef3 VARCHAR(50), @vdef4 VARCHAR(50), @vdef5 VARCHAR(50);
DECLARE @vdef6 VARCHAR(50),@vdef7 VARCHAR(50), @vdef8 VARCHAR(50), @vdef9 VARCHAR(50), @vdef10 VARCHAR(50);
DECLARE @COUNT INT; --用于檢查現存量記錄數
DECLARE @errorSun INT --定義錯誤計數器
SET @errorSun=0 --沒錯為0
-----------------------------------------START--------------------------------------------
--取要處理的條碼串列
SELECT *
INTO #RdRecordBufferBB
FROM RdRecordBufferBB
WHERE 1=0
INSERT #RdRecordBufferBB([cVouchType],[bRdFlag],[Rdsid],[Rdid],[cBarcode],[cInvCode],[cWhCode],[cPosition],[cBatch],[cFree1],[cFree2],[cFree3],[cFree4],[cFree5],[cFree6],[cFree7],[cFree8],[cFree9],[cFree10],[upStatus],[curStatus],[cMadanBarcode],[cunitname],[cassitunit],[iQuantity],[iBoxQuantity],[iNum],[vdef1],[vdef2],[vdef3],[vdef4],[vdef5],[vdef6],[vdef7],[vdef8],[vdef9],[vdef10],[InTime],[OutTime])
SELECT [cVouchType],[bRdFlag],[Rdsid],[Rdid],[cBarcode],[cInvCode],[cWhCode],[cPosition],[cBatch],[cFree1],[cFree2],[cFree3],[cFree4],[cFree5],[cFree6],[cFree7],[cFree8],[cFree9],[cFree10],[upStatus],[curStatus],[cMadanBarcode],[cunitname],[cassitunit],[iQuantity],[iBoxQuantity],[iNum],[vdef1],[vdef2],[vdef3],[vdef4],[vdef5],[vdef6],[vdef7],[vdef8],[vdef9],[vdef10],[InTime],[OutTime]
FROM RdRecordBufferBB
WHERE cVouchType=@cVouchType AND Rdid=@RDID
ORDER BY AutoID
--取要處理的條碼庫存清單
SELECT DISTINCT T1.*
INTO #T_STOCK_L
FROM T_STOCK T1 INNER JOIN #RdRecordBufferBB T2
ON T1.cWhCode=T2.cWhCode AND T1.cBarcode = T2.cBarcode AND ISNULL(T1.CFREE1, '')=ISNULL(T2.CFREE1,'') AND ISNULL(T1.CFREE2, '')=ISNULL(T2.CFREE2,'') AND ISNULL(T1.CFREE3, '')=ISNULL(T2.CFREE3,'') AND ISNULL(T1.CFREE4, '')=ISNULL(T2.CFREE4,'') AND ISNULL(T1.CFREE5, '')=ISNULL(T2.CFREE5,'') AND ISNULL(T1.CBATCH, '')=ISNULL(T2.CBATCH,'');
--AND ISNULL(T1.CPOSITION, '')=ISNULL(T2.CPOSITION,'') --貨位暫不考慮
--條碼收發處理
DECLARE curOrderReq CURSOR FOR SELECT BRDFLAG, CWHCODE, CINVCODE, CBARCODE, ISNULL(CFREE1, N''), ISNULL(CFREE2, N''), ISNULL(CFREE3, N''), ISNULL(CFREE4, N''), ISNULL(CFREE5, N''),
ISNULL(CFREE6, N''), ISNULL(CFREE7, N''), ISNULL(CFREE8, N''), ISNULL(CFREE9, N''), ISNULL(CFREE10, N''),
ISNULL(CBATCH,N''), ISNULL(CPOSITION,N''),
ISNULL(CMADANBARCODE,N''), ISNULL(IQUANTITY,0), ISNULL(INUM,0), ISNULL(IBOXQUANTITY,0), ISNULL(cunitname, N''), ISNULL(cassitunit, N''), InTime, OutTime, UPSTATUS, CURSTATUS,
ISNULL(vdef1, N''), ISNULL(vdef2, N''), ISNULL(vdef3, N''), ISNULL(vdef4, N''), ISNULL(vdef5, N''), ISNULL(vdef6, N''), ISNULL(vdef7, N''), ISNULL(vdef8, N''), ISNULL(vdef9, N''), ISNULL(vdef10, N'')
FROM #RdRecordBufferBB ; --待處理條碼串列游標
OPEN curOrderReq;
BEGIN tran --開始事務
FETCH NEXT FROM curOrderReq INTO @BRDFLAG, @CWHCODE, @CINVCODE, @CBARCODE, @CFREE1, @CFREE2, @CFREE3, @CFREE4, @CFREE5,
@CFREE6, @CFREE7, @CFREE8, @CFREE9, @CFREE10,
@CBATCH, @CPOSITION,
@CMADANBARCODE, @IQUANTITY, @INUM, @IBOXQUANTITY, @cunitname, @cassitunit, @INTIME, @OUTTIME, @UPSTATUS, @CURSTATUS,
@vdef1, @vdef2, @vdef3, @vdef4, @vdef5, @vdef6, @vdef7, @vdef8, @vdef9, @vdef10
--insert into b_log(c1,c2) values(@BRDFLAG, @@FETCH_STATUS);
WHILE @@FETCH_STATUS =0
BEGIN
--
---->>>>----------------------------------------
IF(@BRDFLAG=0) --出
BEGIN
SET @COUNT = 0;
DECLARE curCurrentStock1 CURSOR FOR SELECT AUTOID
FROM #T_STOCK_L WHERE CWHCODE=@CWHCODE AND CINVCODE=@CINVCODE AND CBARCODE=@CBARCODE AND ISNULL(CFREE1, N'')=@CFREE1 AND ISNULL(CFREE2, N'')=@CFREE2 AND ISNULL(CFREE3, N'')=@CFREE3 AND ISNULL(CFREE4, N'')=@CFREE4 AND ISNULL(CFREE5, N'')=@CFREE5 AND ISNULL(CBATCH, N'')=@CBATCH ; --條碼現存量游標 --AND ISNULL(CPOSITION, N'')=@CPOSITION 貨位暫不考慮
OPEN curCurrentStock1;
FETCH NEXT FROM curCurrentStock1 INTO @AUTOID
WHILE @@FETCH_STATUS =0
BEGIN
SET @COUNT = @COUNT + 1;
if(@COUNT = 1) --只對找到的第一條條碼進行操作
BEGIN
IF(@cVouchType='01') --采購入庫
BEGIN
UPDATE T_STOCK SET FSTATUS='0' WHERE AutoID=@AUTOID; --還原為列印狀態
END
IF(@cVouchType='08') --其他入庫
BEGIN
UPDATE T_STOCK SET FSTATUS='0' WHERE AutoID=@AUTOID; --應還原為原狀態@UPSTATUS, 需改進
END
IF(@cVouchType='09') --其他出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='2' WHERE AutoID=@AUTOID; --已出庫
END
IF(@cVouchType='10') --成品入庫
BEGIN
DELETE FROM T_STOCK WHERE AutoID=@AUTOID; --洗掉,重新入
END
IF(@cVouchType='11') --材料出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='2' WHERE AutoID=@AUTOID; --已出庫
END
IF(@cVouchType='32') --銷售出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='2' WHERE AutoID=@AUTOID; --已出庫
END
--IF(@cVouchType='AD') --貨位調整
-- BEGIN
-- UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID;
-- END
IF(@cVouchType='34') --期初
BEGIN
UPDATE T_STOCK SET FSTATUS='2' WHERE AutoID=@AUTOID; --還原為列印狀態
END
--IF(@cVouchType='26') --這里做轉庫處理
-- BEGIN
-- UPDATE T_STOCK SET FSTATUS='1',CWHCODE = @CWHCODE WHERE AutoID=@AUTOID; --洗掉,重新入
-- END
END
FETCH NEXT FROM curCurrentStock1 INTO @AUTOID; --下一條現存量
END
CLOSE curCurrentStock1; --///關閉游標@curCurrentStock
DEALLOCATE curCurrentStock1; --///釋放資源
if(@COUNT = 0) SET @errorSun=@errorSun+1; --未找到則回滾事務
END
ELSE --入
BEGIN
SET @COUNT = 0;
DECLARE curCurrentStock2 CURSOR FOR SELECT AUTOID FROM #T_STOCK_L
WHERE CWHCODE=@CWHCODE AND CINVCODE=@CINVCODE AND CBARCODE=@CBARCODE AND ISNULL(CFREE1, N'')=@CFREE1 AND ISNULL(CFREE2, N'')=@CFREE2 AND ISNULL(CFREE3, N'')=@CFREE3 AND ISNULL(CFREE4, N'')=@CFREE4 AND ISNULL(CFREE5, N'')=@CFREE5
--AND ISNULL(CFREE6, N'')=@CFREE6 AND ISNULL(CFREE7, N'')=@CFREE7 AND ISNULL(CFREE8, N'')=@CFREE8 AND ISNULL(CFREE9, N'')=@CFREE9 AND ISNULL(CFREE10, N'')=@CFREE10
AND ISNULL(CBATCH, N'')=@CBATCH; --條碼現存量游標 --AND ISNULL(CPOSITION, N'')=@CPOSITION 貨位暫不考慮
OPEN curCurrentStock2;
FETCH NEXT FROM curCurrentStock2 INTO @AUTOID
WHILE @@FETCH_STATUS =0
BEGIN
SET @COUNT = @COUNT + 1;
if(@COUNT = 1) --只對找到的第一條條碼進行操作
BEGIN
IF(@cVouchType='01') --采購入庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='08') --其他入庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='09') --其他出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='10') --成品入庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='11') --材料出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='32') --銷售出庫
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='AD') --貨位調整
BEGIN
UPDATE T_STOCK SET CPOSITION = @CPOSITION WHERE AutoID=@AUTOID;
END
IF(@cVouchType='34') --期初
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
IF(@cVouchType='26') --
BEGIN
UPDATE T_STOCK SET FSTATUS='1' WHERE AutoID=@AUTOID; --在庫
END
--IF(@cVouchType='26') --這里做轉庫處理 主要是t_stock不進資料
-- BEGIN
-- UPDATE T_STOCK SET FSTATUS='1',CWHCODE = @CWHCODE WHERE AutoID=@AUTOID;
-- --UPDATE SFC_STOCK SET FSTATUS='1' WHERE CBARCODE=@CBARCODE; --在庫
-- END
END
FETCH NEXT FROM curCurrentStock2 INTO @AUTOID; --下一條現存量
END
CLOSE curCurrentStock2; --///關閉游標@curCurrentStock
DEALLOCATE curCurrentStock2; --///釋放資源
if(@COUNT = 0) --未找到則插入一條
BEGIN
IF(@cVouchType='01' OR @cVouchType='08' OR @cVouchType='10' OR @cVouchType='34' OR @cVouchType='20') --入庫
BEGIN
INSERT INTO T_STOCK(CWHCODE, CINVCODE,CBATCH, CFREE1, CFREE2, CFREE3, CFREE4, CFREE5, CFREE6, CFREE7, CFREE8, CFREE9, CFREE10, cPosition, CBARCODE,
CMADANBARCODE, IQUANTITY, INUM, IBOXQUANTITY, cunitname, cassitunit, InTime, OutTime, FSTATUS,
vdef1, vdef2, vdef3, vdef4, vdef5, vdef6, vdef7, vdef8, vdef9, vdef10 , InDate)
VALUES(@CWHCODE, @CINVCODE, @CBATCH, @CFREE1, @CFREE2, @CFREE3, @CFREE4, @CFREE5, @CFREE6, @CFREE7, @CFREE8, @CFREE9, @CFREE10, @CPOSITION, @CBARCODE,
@CMADANBARCODE, @IQUANTITY, @INUM, @IBOXQUANTITY, @cunitname, @cassitunit, GETDATE(), Null, '1' ,
@vdef1, @vdef2, @vdef3, @vdef4, @vdef5, @vdef6, @vdef7, @vdef8, @vdef9, @vdef10, CONVERT(varchar(20), GETDATE(), 23));
END
IF(@cVouchType='09' OR @cVouchType='11' OR @cVouchType='32' OR @cVouchType='26')
SET @errorSun=@errorSun+1; --其他出庫、材料出庫、銷售出庫,則回滾
END
END
uj5u.com熱心網友回復:
---->>>>----------------------------------------
FETCH NEXT FROM curOrderReq INTO @BRDFLAG, @CWHCODE, @CINVCODE, @CBARCODE, @CFREE1, @CFREE2, @CFREE3, @CFREE4, @CFREE5,
@CFREE6, @CFREE7, @CFREE8, @CFREE9, @CFREE10,
@CBATCH, @CPOSITION,
@CMADANBARCODE, @IQUANTITY, @INUM, @IBOXQUANTITY, @cunitname, @cassitunit, @INTIME, @OUTTIME, @UPSTATUS, @CURSTATUS,
@vdef1, @vdef2, @vdef3, @vdef4, @vdef5, @vdef6, @vdef7, @vdef8, @vdef9, @vdef10;
END
CLOSE curOrderReq; --///關閉游標
DEALLOCATE curOrderReq; --///釋放資源
DROP TABLE #RdRecordBufferBB;
DROP TABLE #T_STOCK_L;
DELETE FROM RdRecordBufferBB WHERE cVouchType=@cVouchType AND Rdid=@RDID ;
IF @errorSun<>0
BEGIN
ROLLBACK tran--事務回滾陳述句
END
ELSE
BEGIN
COMMIT tran--事務提交陳述句
END
END
這個接上面的存盤程序,單獨運行沒有什么問題,但是一到程式中運行就瘋狂報錯:
EXECUTE 后的事務計數指示 BEGIN 和 COMMIT 陳述句的數目不匹配。上一計數 = 1,當前計數 = 0。
EXECUTE 后的事務計數指示 BEGIN 和 COMMIT 陳述句的數目不匹配。上一計數 = 1,當前計數 = 0。
EXECUTE 后的事務計數指示 BEGIN 和 COMMIT 陳述句的數目不匹配。上一計數 = 1,當前計數 = 0。
是在沒看懂哪里有問題
uj5u.com熱心網友回復:
回圈是一整個陳述句,除非遇到break return 等正常退出,否則應該視為一個原子性整體。所以事務,要么把整個回圈包裹進去,要么是把每一次回圈包裹進去
整改案例如下:
BEGIN tran
它所對應的 commit/rollback
不應該被包裹在 回圈中。
如果你要包裹在回圈中,請把begin tran 放到回圈內
WHILE @@FETCH_STATUS =0
BEGIN
begin tran
.........
commit/rollback
END
否則你目前這個代碼,commit/rollback 應該放到回圈的 begin end 之外,如下圖
begin tran
WHILE @@FETCH_STATUS =0
BEGIN
.........
END
commit/rollback
uj5u.com熱心網友回復:
我是放在回圈之外的

而且很奇怪的是,這個有時候報錯,有時候不報錯
uj5u.com熱心網友回復:
在進儲存程序的時候加了輸出declare @trancount int;
set @trancount = @@trancount;
PRINT('事務計數1:'+convert(varchar(11),@@trancount));
輸出結果為1,這個咋解決,都不知道這個1的事務從哪里來的
uj5u.com熱心網友回復:
你呼叫存盤程序的代碼里有事務?如果有多個陳述句/存盤程序一起呼叫,建議把事務放在程式里處理,不要在存盤程序里處理
uj5u.com熱心網友回復:
我剛才把存盤程序里面的去掉了,不報錯了,但是之前我也是這么寫的,一直沒有任何問題,這個是什么情況?
uj5u.com熱心網友回復:
我把儲存程序內的事務去掉后,儲存程序里面執行SQL沒有提交,這個?
uj5u.com熱心網友回復:
在呼叫的程式里面去提交或者回滾uj5u.com熱心網友回復:
呼叫的代碼要有例外處理轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/228639.html
標籤:疑難問題
