一个存储过程,折腾了我半天
/***************************************************************************
功能:价格管理--调价
作者: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
转载于:https://www.cnblogs.com/asdcer/archive/2006/09/01/492089.html
一个存储过程,折腾了我半天相关推荐
- 1 创建一个存储过程,以及对存储过程的调用 MySQL
1 首先创建一张tb1表 sql语句如下 CREATE TABLE `tb1` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) ...
- 创建一个存储过程,返回指定员工的姓名和薪水
/* 创建一个存储过程,返回指定员工的姓名和薪水 */ create or replace PROCEDURE queryEmp1(eno in number,empname out VARCHAR2 ...
- 使用oracle 的 PL/Sql 定时执行一个存储过程
/* 使用oracle 的 PL/Sql 定时执行一个存储过程 测试目的:在表 tab 中间隔一分钟插入一条数据 实现方案: 1.通过 oracle 中 dbms_job 完成存储过程的定时调用 2. ...
- 对一个存储过程语法的解读
create or replace package body SY_USER_PKG1 is//创建一个存储过程的声明,在package body就是存储过程的实现体所放的包,SY_USER_PKG1 ...
- 定义一个存储过程,以员工工号为参数,修改该员工的工资,若该员工属于10部门,则工资增加150 若属于20号部门,工资加200,若属于30部门,工资加250 若其它部门,则加300
注:使用的是Oracle的实例数据库中的scott用户 定义一个存储过程,以员工工号为参数,修改该员工的工资,若该员工属于10部门,则工资增加150 若属于20号部门,工资加200,若属于30部门,工 ...
- mysql定时任务如何每天0点跑_mysql定时任务,每天的零点执行一个存储过程
1 前言 利用navicat工具来写存储过程及定时执行,此文章是按照自身经验总结的,仅作为记录使用. 2 步骤 2.1 新建过程 2.2 在函数体写你需要执行的代码 CREATE DEFINER=`r ...
- mysql怎么让一个存储过程定时执行
查看event是否开启: show variables like '%sche%'; 将事件计划开启: set global event_scheduler=1; 关闭事件任务: alter ev ...
- 在存储过程中如何使用另一个存储过程返回的结果集
1.创建一个临时表#tmp,表结构与目标存储过程procedure_name的返回结果集兼容(兼容即可,不必相同). CREATE TABLE #tmp( [columns_list] ) 2.执行存 ...
- mysql 让一个存储过程定时作业的代码(转)
1.在mysql 中建立一个数据库 test1 语句:create database test1 2.创建表examinfo create table examinfo( id int auto_in ...
- mysql怎么创建自动作业_mysql 让一个存储过程定时作业的代码
1.在mysql 中建立一个数据库 test1 语句:create database test1 2.创建表examinfo create table examinfo( id int auto_in ...
最新文章
- 如何关注掘金的所有小伙伴
- 2017年11月01日普及组 I Will Like Matrix!
- windows phone 中反序列化json时出现的问题
- linux dhcp服务软包,dpkg包管理器详解
- 深入Python字典的内部实现
- 软件工程:方法与实践 第四次读书笔记
- 正确认识计算机专业,如何正确认识计算机科学与技术专业
- 【应用赏析】ArcGIS API for iOS在俄勒冈大学校园中的创新应用
- docker: Error response from daemon: driver failed programming external connectivity on endpoint mys
- 双十一淘宝美妆消费数据分析
- 高分系列(GF1-GF7)卫星介绍
- java linux virt_解决Unable to load library 'virt'
- 一个有用的webstrom激活方法
- 他妈的 Python(1):怎么发起一个同步的 HTTP 请求
- 重磅!75岁柳传志正式退休!卸任联想控股董事长,接班人是谁?一文回顾:柳传志的创业史...
- mysql插入中文报错处理办法
- Microsoft Excel 中 ROMAN 函数介绍
- 九、软件开发进度月报-模板
- raid的种类和区别
- CSP考试笔记:C++篇(第四章、面向对象)(牛客网学习)
热门文章
- CMake 使用总结(转载)
- 排序算法之九 基数排序(C++版本)
- git add多个文件_10个节省时间和改善工作流的Git技巧
- 平分七框梨java_php编程- php算法 - 平分七框鱼
- mysql 安装no key_No package mysql-server available错误解决(centos mysql安装教程)
- 数据结构二叉树的建立代码_二叉树就是这么简单
- 中科院计算机考研对外调剂吗,考研调剂信息:2020年中科院接收调剂研究生!...
- c语言实验报告1华科,华科操作系统实验报告
- java 反射集合_Java反射的理解(六)-- 通过反射了解集合泛型的本质
- SQL:MySQL创建、删除事件