SQL2005使用游标的实例(SBO中计算到期应收账款)

我的SQL语言的查询做得并不好。但我可以用游标来实现之。实现之后才发现,无论多么复杂的查询,利用游标也都会更容易理解。虽然使用游标可能会牺牲一定的性能,但在硬件快速发展的今天,牺牲那么一点半点也未为不可。
    以下是我使用游标进行查询的一个实例,其中应该使用临时表的地方因为没有创建成功,只好使用事先创建好的表,显得此段代码有些不足,希望能给大家作抛砖引玉之用。
    这是一个在SBO中计算到期应收账款的应用,由于时间仓促,代码中没有太多注释,日后我会慢慢补上的。
代码:

 1CREATE PROCEDURE TS_GetPayDay
 2AS
 3BEGIN 
 4    DECLARE @DocNum NVARCHAR(100)      --订单号
 5    DECLARE @NumAtCard NVARCHAR(100)   --合同号
 6    DECLARE @CardName NVARCHAR(100)    --客户
 7    DECLARE @PayTimes INT              --总付款次数
 8    DECLARE @PayTime INT               --付款次序
 9    DECLARE @Prcnt INT                 --付款百分比
10    DECLARE @DocTotal NUMERIC          --订单总额
11
12    DECLARE @DocDate DATETIME          --单据日期
13    DECLARE @PayDay DATETIME           --到期付款日期
14    DECLARE @PayDay1 DATETIME          --
15    DECLARE @Months INT                --间隔月份
16    DECLARE @Days INT                  --间隔天数
17    DECLARE @CurRow INT                --当前行
18    DECLARE @CurCtg INT                --当前付款条款
19
20    DELETE FROM [TS_Payment]
21    DELETE FROM [TS_Payment1]
22    DELETE FROM [TS_Payment2]
23
24    DECLARE Rows_cursor CURSOR
25    FOR
26        SELECT T0.DocEntry
27        FROM ORDR T0 ORDER BY T0.DocEntry
28    OPEN Rows_cursor;
29    FETCH NEXT FROM Rows_cursor INTO @CurRow;
30    WHILE(@@FETCH_STATUS<>-1)
31    BEGIN
32        IF(@@FETCH_STATUS<>-2)
33        BEGIN
34            SET @DocNum=(SELECT DocNum FROM ORDR WHERE DocEntry=@CurRow);
35            SET @NumAtCard=(SELECT NumAtCard FROM ORDR WHERE DocEntry=@CurRow);
36            SET @DocDate=(SELECT DocDate FROM ORDR WHERE DocEntry=@CurRow);
37            SET @CardName=(SELECT CardName FROM ORDR WHERE DocEntry=@CurRow);
38            SET @DocTotal=(SELECT DocTotal FROM ORDR WHERE DocEntry=@CurRow);
39
40            INSERT INTO [TS_Payment1](DocNum,NumAtCard,CardName,DocTotal)
41                VALUES(@DocNum,@NumAtCard,@CardName,@DocTotal)
42                
43            SET @PayTimes=(SELECT InstNum FROM OCTG WHERE GroupNum=
44                (SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
45            DECLARE Ctg_cursor CURSOR
46            FOR 
47                SELECT T1.IntsNo 
48                FROM CTG1 T1
49                WHERE T1.CTGCode=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow)
50            OPEN Ctg_cursor;
51            FETCH NEXT FROM Ctg_cursor INTO @CurCtg;
52            WHILE(@@FETCH_STATUS<>-1)
53            BEGIN
54                IF(@@FETCH_STATUS<>-2)
55                BEGIN
56                    --SELECT @CurCtg
57                    SET @PayTime=(SELECT IntsNo FROM CTG1 WHERE IntsNo=@CurCtg 
58                        AND CTGCode
59                        =(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow)); 
60                    SET @Prcnt=(SELECT InstPrcnt FROM CTG1 WHERE IntsNo=@CurCtg
61                        AND CTGCode
62                        =(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow)); 
63                    SET @Months=(SELECT InstMonth FROM CTG1 WHERE IntsNo=@CurCtg 
64                        AND CTGCode
65                        =(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
66                    SET @Days=(SELECT InstDays FROM CTG1 WHERE IntsNo=@CurCtg 
67                        AND CTGCode
68                        =(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
69
70                    SET @PayDay1=DATEADD(MONTH,@Months,@DocDate);
71                    SET @PayDay=DATEADD(DAY,@Days,@PayDay1);
72                    INSERT INTO [TS_Payment2](DocNum,NumAtCard,CardName,
73                        DocTotal,PayTimes,PayTime,Prcnt,PayDay)
74                        VALUES(@DocNum,@NumAtCard,@CardName,
75                        @DocTotal,@PayTimes,@PayTime,@Prcnt,@PayDay)
76                END
77                FETCH NEXT FROM Ctg_cursor INTO @CurCtg;
78            END
79            CLOSE Ctg_cursor;
80            DEALLOCATE Ctg_cursor;
81        END
82        FETCH NEXT FROM Rows_cursor INTO @CurRow;
83    END
84    CLOSE Rows_cursor;
85    DEALLOCATE Rows_cursor;
86
87    DELETE FROM [TS_Payment1] WHERE DocNum IN(SELECT DocNum FROM [TS_Payment2])
88
89    INSERT INTO [TS_Payment]
90    SELECT * FROM [TS_Payment1]
91        UNION ALL 
92    SELECT * FROM [TS_Payment2]
93END

posted on 2008-04-25 09:17 guofu 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/saptechnique/archive/2008/04/25/1170407.html

SQL2005使用游标的实例(SBO中计算到期应收账款)相关推荐

  1. php中计算时间差的几种方法,php计算时间差的方法

    一个简单的例子:计算借书的天数,根据每天的日期进行计算. (1) 有数据库的情况 MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可. MYSQL那就用两个日期字段的差值计算的计 ...

  2. MS SQL Server 游标及实例(三)

    Sql server 中游标具体实例介绍:   表一 OriginSalary 表二 AddSalary 现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工号(NVAR ...

  3. 大一计算机思维知识点,大学计算机基础教学中计算思维的培养途径

    摘要:从几个侧面思考和探究在大学计算机基础教学中培养学生计算思维的途径,提出通过整合教学内容,将不同的知识点归纳为不同的知识单元:通过实验教学,提升学生运用计算思维处理问题的能力. 关键词:计算思维: ...

  4. c语言程序设计常用思维,C语言程序设计中计算思维的思考①

    王鑫 李万军 摘   要:计算思维是运用计算机科学的基础概念去求解问题.设计系统和理解人类的行为.本文归纳了计算思维在C语言程序设计中的体现,可归纳为抽象计算思维.自动化计算思维和并行计算思维三种.针 ...

  5. python统计列表中元素个数_python中计算一个列表中连续相同的元素个数方法

    python中计算一个列表中连续相同的元素个数方法 最简单的例子: a = [1,1,1,1,2,2,2,3,3,1,1,1,3] # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现 ...

  6. python计算cos_Python中计算三角函数之cos()方法的使用简介

    Python中计算三角函数之cos()方法的使用简介 cos()方法返回x弧度的余弦值. 语法 以下是cos()方法的语法: cos(x) 注意:此函数是无法直接访问的,所以我们需要导入math模块, ...

  7. 切割字符串长度php,C++_C语言中计算字符串长度与分割字符串的方法,C语言strlen()函数:返回字符串 - phpStudy...

    C语言中计算字符串长度与分割字符串的方法 C语言strlen()函数:返回字符串的长度头文件: #include strlen()函数用来计算字符串的长度,其原型为: unsigned int str ...

  8. JAVA中计算百分比 格式化数字

    JAVA中计算百分比 格式化数字 这个是我在程序使用的例子: public String myPercent(int y,int z){    String baifenbi="" ...

  9. oracle 记录给游标,Oracle游标 CURSOR实例详解

    一.游标概述: 游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果. 每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理. 作用 ...

最新文章

  1. Android -- TextView与EditText 同步显示
  2. cront 的应用(摘自鸟哥的私房菜)
  3. Use Excel Pivot Table as a BI tool
  4. 云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...
  5. oracle grid需要安装,Oracle 11g Grid for Linux安装指南
  6. 计算机科学基本理论,计算机科学的基础知识.ppt
  7. MINA核心结构和处理消息的逻辑流程
  8. (57)FPGA条件选择无优先级(case)
  9. 俄罗斯方块游戏设计的有关问题
  10. 【UML】免费的UML绘图工具yEd
  11. 机器人顶会RSS 2021各奖项出炉,CMU华人博士生摘得最佳论文
  12. Unity 讯飞实时语音转写(三)—— 分析转写结果
  13. 冯·诺依曼理论的要点
  14. ubuntu设置桌面图标
  15. MetLife - 美国大都会人寿保险公司
  16. 微信小程序image图片预览时不显示(后缀问题!)
  17. 写代码赚钱的一些门路
  18. android多指触控失效,安卓--多指触控
  19. 在CentOS7.9系统上安装N卡3060驱动、CUDA和离线升级gcc(4.8—>8.3)用以编译框架的过程记录
  20. 只能就读专科学校和专业怎么选择呢?

热门文章

  1. SH1B LMR62014XMFE/NOPB
  2. 一天干掉一只Monkey计划(二)——热流扰动,径向模糊
  3. Smarty2至Smarty3升级指南
  4. Matlab 数字图像处理1---图像的收缩和放大
  5. PAT乙级-1070. 结绳(25)
  6. 阿里云云服务器的端口配置问题
  7. 如何让eclipse恢复默认布局
  8. POSIX 消息队列相关问题
  9. cocos2d-js 3.0 jsb环境调用底层java代码
  10. 《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作