一个存储过程,折腾了我半天
/***************************************************************************
功能:价格管理--调价
作者:XX
日期:2006-06-26
***************************************************************************/
CREATE PROCEDURE WG_TJ
@YHDLM VARCHAR(50), --用户登陆名
@IP VARCHAR(20), --IP地址
@TJYJ NVARCHAR(50), --调价依据
@SFSQ VARCHAR(1), --是否申请标记
@XJHJ DECIMAL(12,2), --新计划价
@QCDM VARCHAR(18), --器材代码
@PC VARCHAR(8), --批次
@RE VARCHAR(10) OUTPUT --返回操作结果
AS
DECLARE @YHXM VARCHAR(10)
SELECT @YHXM=XM FROM WG_YHML WHERE YHDLM=@YHDLM AND ZTFW='N'
DECLARE @TJQJHJ DECIMAL(12,2)
SELECT @TJQJHJ=JHDJ FROM WG_BZDM WHERE QCDM=@QCDM
IF(@SFSQ='Y') --以前是申请过的
BEGIN
BEGIN TRAN --事务开始
DECLARE @KCSL DECIMAL(12,3)
DECLARE @DWDM VARCHAR(6)
DECLARE @QCDM_TEMP VARCHAR(18)
DECLARE @BJ VARCHAR(1)
DECLARE @ZXKCSL DECIMAL(12,3)
SELECT @ZXKCSL=KCSL FROM CXX_KC WHERE QCDM=@QCDM
SELECT @QCDM_TEMP=QCDM FROM WG_KCJC WHERE QCDM=@QCDM AND PC=@PC
IF(@@ROWCOUNT>0) BEGIN --检测库存价差表中是否已经存在此批次此物资
SET @BJ='1' --存在此物资,则从WG_TJJL 中查询出原计划价
SELECT @TJQJHJ=YJHDJ FROM WG_TJJL WHERE SUBSTRING(SQPH,1,8)=@PC AND QCDM=@QCDM
--库存价差中存在此物资并且此次价格与原计划价不相同则先删除再增加,以防止此段时间库存发生变化
IF(@XJHJ<>@TJQJHJ AND @XJHJ<>0) BEGIN
DELETE FROM WG_KCJC WHERE PC=@PC AND QCDM=@QCDM
END
END
ELSE
SET @BJ='0' --不存在此物资
DECLARE OUTER_SURSOR_TJ CURSOR FOR --定义游标
--从库存明细中查询
SELECT KCSL,LSDWDM
FROM WG_KCMX
WHERE QCDM=@QCDM
OPEN OUTER_SURSOR_TJ --打开游标
FETCH NEXT FROM OUTER_SURSOR_TJ --读取游标
INTO @KCSL,@DWDM
WHILE @@FETCH_STATUS=0 --游标中数据处理
BEGIN
IF(@BJ='0') --库存价差中不存在此批次此物资
BEGIN --2-0 BEGIN
IF(@XJHJ<>@TJQJHJ AND @XJHJ<>0) --库存价差中不存在此批次此物资、执行计划价和原计划价不相同时则增加库存价差
BEGIN -- 1 BEGIN
--添加WG_KCJC
INSERT INTO WG_KCJC
(
QCDM,
KCSL,
TJQJHJ,
TJHJHJ,
LSDWDM,
KCJC,
TJR,
TJRQ,
TJYJ,
PC
)
VALUES
(
@QCDM,
@KCSL,
@TJQJHJ,
@XJHJ,
@DWDM,
@KCSL*(@XJHJ-@TJQJHJ),
@YHDLM,
GETDATE(),
@TJYJ,
@PC
)
INSERT INTO WG_YHCZJL
(
YHDLM,
CZBM,
CZLX,
JLGJZ,
CZNR,
CZSJ,
IPDZ
)
VALUES
(
@YHDLM,
'WG_KCJC',
'新增记录',
@QCDM,
'新增库存价差记录:器材代码:'+@QCDM+ ',批次:' + @PC +';操作人:'+@YHXM,
GETDATE(),
@IP--@IP
)
END -- 1 END
END -- 2-0 BEGIN
ELSE
BEGIN --3-0 BEGIN --库存中已经存在此批次的此物资
IF(@XJHJ<>@TJQJHJ AND @XJHJ<>0) --库存价差中不存在此批次此物资、执行计划价和原计划价不相同时则增加库存价差
BEGIN -- 4 BEGIN
--添加WG_KCJC
INSERT INTO WG_KCJC
(
QCDM,
KCSL,
TJQJHJ,
TJHJHJ,
LSDWDM,
KCJC,
TJR,
TJRQ,
TJYJ,
PC
)
VALUES
(
@QCDM,
@KCSL,
@TJQJHJ,
@XJHJ,
@DWDM,
@KCSL*(@XJHJ-@TJQJHJ),
@YHDLM,
GETDATE(),
@TJYJ,
@PC
)
略……
END -- 4 END
END-- 3-0 END
--PRINT(@KCSL)
--PRINT(@DWDM)
--读取游标下一条记录
FETCH NEXT FROM OUTER_SURSOR_TJ INTO @KCSL,@DWDM
END
--关闭游标
CLOSE OUTER_SURSOR_TJ
DEALLOCATE OUTER_SURSOR_TJ
--修改WG_TJJL ,若新价格与原价格不相同则修改WG_TJJL的多个字段
IF(@XJHJ<>@TJQJHJ AND @XJHJ<>0) BEGIN
UPDATE WG_TJJL SET TJYJ=@TJYJ,ZXJHDJ=@XJHJ, ZXKCSL=@ZXKCSL,ZXRQ=GETDATE(),TJR=@YHDLM,ZXBZ='Y' ,SHBZ='Z'
WHERE QCDM=@QCDM AND SUBSTRING(SQPH,1,8)=@PC
END
ELSE BEGIN ---修改WG_TJJL ,若新价格与原价格相同则不修改WG_TJJL中的执行计划单价
UPDATE WG_TJJL SET TJYJ=@TJYJ,ZXJHDJ=@TJQJHJ, ZXKCSL=@ZXKCSL,ZXRQ=GETDATE(),TJR=@YHDLM,ZXBZ='Y' ,SHBZ='Z'
WHERE QCDM=@QCDM AND SUBSTRING(SQPH,1,8)=@PC
END
IF(@@ROWCOUNT>0 AND @@ERROR<=0)
BEGIN
-- 以下定义更新申请表中用到的变量
DECLARE @ZXKCSL_TJSQ DECIMAL(12,3)
DECLARE @SQDWDM_TJSQ VARCHAR(5)
DECLARE @QCDM_TJSQ VARCHAR(18)
DECLARE @SHPC_TJSQ VARCHAR(18)
DECLARE @DWMC_TJSQ VARCHAR(50)
DECLARE @SQR_TJSQ VARCHAR(50)
--若新计划价与原计划价不相同则更新WG_BZDM中的计划价
IF(@TJQJHJ<>@XJHJ AND @XJHJ<>0)
BEGIN
--修改WG_BZDM中计划价
UPDATE WG_BZDM SET JHDJ=@XJHJ,TJRQ=GETDATE(),GXSJ=GETDATE() WHERE QCDM=@QCDM
IF(@@ROWCOUNT>0)
BEGIN
略……
IF(@@ROWCOUNT>0)
BEGIN
SET @RE='成功'
--最后修改 WG_TJSQ 中的信息
--(由于没有申请过的可能要用零星再次调价,并且想放在此批次中,顾找不到他的申请项,放在最后修改不会出错)
--为修改调价申请打开一个游标,怕库存中不存在此单位的物资(此时库存应为0),不用游标不能实现
--*********************************************** 游标区 ****************************************-------
DECLARE OUTER_SURSOR_TJSQ CURSOR FOR
SELECT DWDM,QCDM,SHPC,SQR FROM CXX_TJSQ_Simple WHERE QCDM=@QCDM AND SHPC=@PC
OPEN OUTER_SURSOR_TJSQ
FETCH NEXT FROM OUTER_SURSOR_TJSQ
INTO @SQDWDM_TJSQ,@QCDM_TJSQ,@SHPC_TJSQ,@SQR_TJSQ
WHILE @@FETCH_STATUS=0 BEGIN
SET @SQR_TJSQ=LTRIM(RTRIM(@SQR_TJSQ))
EXEC WG_KC_Select_BY_YHDLMandQCDM @YHDLM=@SQR_TJSQ,@QCDM=@QCDM,@KCSL=@ZXKCSL_TJSQ OUTPUT
IF(@XJHJ<>0) BEGIN
UPDATE WG_TJSQ SET ZXJHDJ=@XJHJ,ZXKCSL=@ZXKCSL_TJSQ,ZXR=@YHDLM,ZXRQ=GETDATE(),SHBZ='Z',ZJXGSJ=GETDATE()
WHERE QCDM=@QCDM AND SHPC=@PC AND LTRIM(RTRIM(SQR))=@SQR_TJSQ
END
ELSE BEGIN
UPDATE WG_TJSQ SET ZXJHDJ=@TJQJHJ,ZXKCSL=@ZXKCSL_TJSQ,ZXR=@YHDLM,ZXRQ=GETDATE(),SHBZ='Z',ZJXGSJ=GETDATE()
WHERE QCDM=@QCDM AND SHPC=@PC AND LTRIM(RTRIM(SQR))=@SQR_TJSQ
END
FETCH NEXT FROM OUTER_SURSOR_TJSQ INTO @SQDWDM_TJSQ,@QCDM_TJSQ,@SHPC_TJSQ,@SQR_TJSQ
END
CLOSE OUTER_SURSOR_TJSQ
DEALLOCATE OUTER_SURSOR_TJSQ
--*********************************************** 游标区 ****************************************-------
END
ELSE
SET @RE='失败'
END
END
ELSE BEGIN --调价的价格不改变的话只修改调价申请中的信息
SET @RE='成功'
--为修改调价申请打开一个游标,怕库存中不存在此单位的物资(此时库存应为0),不用游标不能实现
--*********************************************** 游标区 ****************************************-------
DECLARE OUTER_SURSOR_TJSQ_ CURSOR FOR
SELECT DWDM,QCDM,SHPC,SQR FROM CXX_TJSQ_Simple WHERE QCDM=@QCDM AND SHPC=@PC
OPEN OUTER_SURSOR_TJSQ_
FETCH NEXT FROM OUTER_SURSOR_TJSQ_
INTO @SQDWDM_TJSQ,@QCDM_TJSQ,@SHPC_TJSQ,@SQR_TJSQ
WHILE @@FETCH_STATUS=0 BEGIN
SET @SQR_TJSQ=LTRIM(RTRIM(@SQR_TJSQ))
--SELECT @ZXKCSL_TJSQ=KCSL FROM WG_KCMX WHERE QCDM=@QCDM AND LSDWDM=@SQDWDM_TJSQ
EXEC WG_KC_Select_BY_YHDLMandQCDM @YHDLM=@SQR_TJSQ,@QCDM=@QCDM,@KCSL=@ZXKCSL_TJSQ OUTPUT
IF(@XJHJ<>0) BEGIN
UPDATE WG_TJSQ SET ZXJHDJ=@XJHJ,ZXKCSL=@ZXKCSL_TJSQ,ZXR=@YHDLM,ZXRQ=GETDATE(),SHBZ='Z',ZJXGSJ=GETDATE()
WHERE QCDM=@QCDM AND SHPC=@PC AND LTRIM(RTRIM(SQR))=@SQR_TJSQ
END
ELSE BEGIN
UPDATE WG_TJSQ SET ZXJHDJ=@TJQJHJ,ZXKCSL=@ZXKCSL_TJSQ,ZXR=@YHDLM,ZXRQ=GETDATE(),SHBZ='Z',ZJXGSJ=GETDATE()
WHERE QCDM=@QCDM AND SHPC=@PC AND LTRIM(RTRIM(SQR))=@SQR_TJSQ
END
FETCH NEXT FROM OUTER_SURSOR_TJSQ_ INTO @SQDWDM_TJSQ,@QCDM_TJSQ,@SHPC_TJSQ,@SQR_TJSQ
END
CLOSE OUTER_SURSOR_TJSQ_
DEALLOCATE OUTER_SURSOR_TJSQ_
--*********************************************** 游标区 ****************************************-------
END
END
COMMIT
PRINT(@RE)
RETURN
END
ELSE --没有申请的
BEGIN
BEGIN TRANSACTION
DECLARE @MC VARCHAR(40)
DECLARE @GG NVARCHAR(60)
DECLARE @JLDW NVARCHAR(4)
DECLARE @YJHDJ DECIMAL(12,2) --原计划单价(调价记录中存在此批次此物资,从调价记录中读取;否则从标准代码中读取)
DECLARE @KCSL1 DECIMAL(12,3) --总库存数量
DECLARE @YHDW VARCHAR(30) --用户单位
DECLARE @YBJ VARCHAR(1) --原来是否存在此记录的标记(存在:Y;不存在:N)
SELECT @KCSL1=KCSL FROM CXX_KC WHERE QCDM=@QCDM --读取总库存
SELECT @MC=MC,@GG=GG,@JLDW=JLDW,@YJHDJ=JHDJ FROM WG_BZDM WHERE QCDM=@QCDM
SELECT @YHDW=DWMC FROM WG_DWML,WG_YHML WHERE WG_DWML.DWDM=WG_YHML.DWDM AND ZTFW='N' AND YHDLM=@YHDLM
DECLARE @SQPH_Temp VARCHAR(15)
SELECT @SQPH_Temp=SQPH FROM WG_TJJL WHERE SUBSTRING(SQPH,1,8)=@PC AND QCDM=@QCDM
IF(@@ROWCOUNT>0) BEGIN --调价记录中存在此批次此物资
SET @YBJ='Y' --调价记录中存在此批次此记录,(存在:Y)
UPDATE WG_TJJL SET ZXJHDJ=@XJHJ,ZXRQ=GETDATE(),TJR=@YHDLM,TJYJ=@TJYJ WHERE QCDM=@QCDM AND SUBSTRING(SQPH,1,8)=@PC
IF @@ROWCOUNT>0 BEGIN --若原来就存在记录,则原计划价不从标准代码中读取而从调价记录中读取
SELECT @YJHDJ=YJHDJ FROM WG_TJJL WHERE SUBSTRING(SQPH,1,8)=@PC AND QCDM=@QCDM
--DELETE FROM WG_KCJC WHERE QCDM=@QCDM AND PC=@PC
SET @RE='成功'
--PRINT(@PC)
END
ELSE BEGIN
SET @RE='失败'
END
END
ELSE BEGIN --若没有找到这条记录,则新增
-- 1 BEGIN
SET @YBJ='N' --调价记录中不存在此批次此记录,(不存在:N)
DECLARE @MAX_LSH INT
DECLARE @LSH VARCHAR(4)
SET @MAX_LSH=CAST((SELECT MAX(SUBSTRING(SQPH,10,4)) FROM WG_TJJL WHERE SUBSTRING(SQPH,1,9)=@PC+'-') AS INT)
IF(@MAX_LSH=NULL)
SET @MAX_LSH=0
SET @MAX_LSH=@MAX_LSH+1
IF(@MAX_LSH<10)
SET @LSH='000' + CAST(@MAX_LSH AS VARCHAR(1))
ELSE IF(@MAX_LSH<100)
SET @LSH='00' + CAST(@MAX_LSH AS VARCHAR(2))
ELSE IF(@MAX_LSH<1000)
SET @LSH='0' + CAST(@MAX_LSH AS VARCHAR(3))
ELSE IF(@MAX_LSH<10000)
SET @LSH=CAST(@MAX_LSH AS VARCHAR(4))
--增加WG_TJJL记录
INSERT INTO WG_TJJL
(
SQPH,
QCDM,
MC,
GG,
JLDW,
YJHDJ,
BPJHDJ,
BPKCSL,
SHR,
PZSJ, --批准时间
ZXKCSL,--执行库存数量
ZXRQ, --执行日期
ZXJHDJ,--执行计划价
GLJPFJHJ, --管理局批复计划价
GLJPFR,--管理局批复人
GLJPFSJ, --管理局批复时间
TJR, --调价人
TJYJ, --调价依据
ZXBZ, --执行标志
SQBZ, --申请标志
SHBZ
)
VALUES
(
@PC+'-'+@LSH,
@QCDM,
@MC,
@GG,
@JLDW,
@YJHDJ,
@XJHJ,
@KCSL1,
@YHDLM,
GETDATE(), --批准时间
@KCSL1, --执行库存数量 --总库存
GETDATE(), --执行日期
@XJHJ, --执行计划单价
@XJHJ, --管理局批复计划价
@YHDLM, --管理局批复人(用户登陆名)
GETDATE(), --管理局批复时间
@YHDLM, --执行人(用户登陆名)
@TJYJ,
'Y',
'N',
'Z'
)
--增加操作记录
略……
-- 1 END
END --增加调价记录
DECLARE @XKCSL DECIMAL(12,3)
DECLARE @LSDWDM VARCHAR(6)
DECLARE @QCDM_TEMP1 VARCHAR(18)
--SELECT @QCDM_TEMP1=QCDM FROM WG_KCJC WHERE QCDM=@QCDM AND PC=@PC
IF(@YBJ='Y') BEGIN --若调价记录中存在此批次此物资,则先删除库存价差中的记录,因为此批次此物资再次调价的话,库存会发生变化
DELETE FROM WG_KCJC WHERE PC=@PC AND QCDM=@QCDM
END
DECLARE OUTER_CURSOR2 CURSOR FOR --定义游标
SELECT KCSL,LSDWDM --查询
FROM WG_KCMX
WHERE QCDM=@QCDM
OPEN OUTER_CURSOR2 --打开游标
FETCH NEXT FROM OUTER_CURSOR2 --读取游标
INTO @XKCSL,@LSDWDM
WHILE @@FETCH_STATUS=0 --游标中数据处理
BEGIN
--添加WG_KCJC
INSERT INTO WG_KCJC
(
QCDM,
KCSL,
TJQJHJ,
TJHJHJ,
LSDWDM,
KCJC,
TJR,
TJRQ,
TJYJ,
PC
)
VALUES
(
@QCDM,
@XKCSL,
@YJHDJ,
@XJHJ,
@LSDWDM,
@XKCSL*(@XJHJ-@YJHDJ),
@YHDLM,
GETDATE(),
@TJYJ,
@PC
)
--增加操作记录
略……
--读取游标下一条记录
FETCH NEXT FROM OUTER_CURSOR2 INTO @XKCSL,@LSDWDM
END
--关闭游标
CLOSE OUTER_CURSOR2
DEALLOCATE OUTER_CURSOR2
--修改WG_BZDM中计划价
UPDATE WG_BZDM SET JHDJ=@XJHJ,TJRQ=GETDATE(),GXSJ=GETDATE() WHERE QCDM=@QCDM
--增加操作记录
IF(@@ROWCOUNT>0)
BEGIN
INSERT INTO WG_YHCZJL
(
YHDLM,
CZBM,
CZLX,
JLGJZ,
CZNR,
CZSJ,
IPDZ
)
VALUES
(
@YHDLM,
'WG_BZDM',
'修改记录',
@QCDM,
'修改标准代码中的计划价:将器材代码为:'+@QCDM+'物资的计划价由:'+CAST(@TJQJHJ AS VARCHAR(12))+',修改为:'+CAST(@XJHJ AS VARCHAR(12))+'操作人:'+@YHXM,
GETDATE(),
@IP--@IP
)
IF(@@ROWCOUNT>0)
SET @RE='成功'
ELSE
SET @RE='失败'
END
COMMIT
PRINT(@RE)
RETURN
END
GO