现在的位置: 首页 > 综合 > 正文

一个存储过程,折腾了我半天

2013年04月05日 ⁄ 综合 ⁄ 共 9952字 ⁄ 字号 评论关闭

/***************************************************************************
 功能:价格管理--调价
 作者: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

抱歉!评论已关闭.