先进先出的还款处理触发器

原创 2004年07月22日 15:51:00

有 两个表:表1:借支
姓名   日期   借支单号     借支金额     已还金额     未还余额
张三  99-1-1  000001      10000          0           10000
李四  99-1-2  000002      5000           0           5000
张三  99-2-1  000003      6000           0           6000
张三  99-3-1  000004      10000          0           15000
...    ...      ...        ...          ..         .....
表2:还款
姓名   日期    还款单号     还款金额   

当表2 输入单据时,表1 的“已还金额”“未还余额”根据表2的输入“还款金额”做相应更改。即:
表2:还款
姓名   日期    还款单号     还款金额  
张三   99-4-3   000001      13000
 
表1:借支
姓名   日期   借支单号     借支金额     已还金额     未还余额
张三  99-1-1  000001      10000          10000        0
李四  99-1-2  000002      5000           0           5000
张三  99-2-1  000003      6000           3000        3000
张三  99-3-1  000004      10000          0           15000
...    ...      ...        ...          ..         .....
表2再输入时:
姓名   日期    还款单号     还款金额  
张三   99-4-3   000001      13000
张三   99-4-3   000002      8000
表1为:
表1:借支
姓名   日期   借支单号     借支金额     已还金额     未还余额
张三  99-1-1  000001      10000          10000        0
李四  99-1-2  000002      5000           0           5000
张三  99-2-1  000003      6000           6000        0
张三  99-3-1  000004      15000          5000        10000
...    ...      ...        ...          ..         .....

 

---------------------------------------------------------------------------

--测试

--测试数据
create table 表1(姓名 varchar(10),日期 datetime,借支单号 char(6),借支金额 int,已还金额 int,未还余额 int)
insert 表1 select '张三','99-1-1','000001',10000,0 ,10000
union  all select '李四','99-1-2','000002',5000 ,0 ,5000
union  all select '张三','99-2-1','000003',6000 ,0 ,6000
union  all select '张三','99-3-1','000004',15000,0 ,15000 --楼主原来这个数据应该不对

create table 表2(姓名 varchar(10),日期 datetime,还款单号 char(6),还款金额 int)
go

--处理的触发器
create trigger tr_insert on 表2
for insert
as
update a set
 已还金额=case when (
   select sum(case when 已还金额>0 then 未还余额 else 借支金额 end)
   from 表1
   where 未还余额>0 and 姓名=a.姓名 and 借支单号<=a.借支单号
  )>a.未还余额 then b.还款金额-isnull((
   select sum(case when 已还金额>0 then 未还余额 else 借支金额 end)
   from 表1
   where 未还余额>0 and 姓名=a.姓名 and 借支单号  ),0)+isnull(a.已还金额,0)
  else a.借支金额 end
 ,未还余额=case when (
   select sum(case when 已还金额>0 then 未还余额 else 借支金额 end)
   from 表1
   where 未还余额>0 and 姓名=a.姓名 and 借支单号<=a.借支单号
  )>a.未还余额 then a.借支金额-(b.还款金额-isnull((
   select sum(case when 已还金额>0 then 未还余额 else 借支金额 end)
   from 表1
   where 未还余额>0 and 姓名=a.姓名 and 借支单号  ),0)+isnull(a.已还金额,0))
  else 0 end
from 表1 a,inserted b
where a.未还余额>0 and a.姓名=b.姓名  and isnull((
  select sum(case when 已还金额>0 then 未还余额 else 借支金额 end)
  from 表1
  where 未还余额>0 and 姓名=a.姓名 and 借支单号 ),0)<=b.还款金额
go

--插入记录测试
insert 表2 select '张三','99-4-3','000001',13000
--显示处理结果
select * from 表1
select * from 表2

--插入记录测试
insert 表2 select '张三','99-4-3','000002',8000
--显示处理结果
select * from 表1
select * from 表2
go

--删除测试
drop table 表1,表2

/*--测试结果

--第一次插入记录的更新结果:

姓名   日期                       借支单号  借支金额   已还金额  未还余额 
------ ------------------------- --------- --------- --------- ----------
张三   1999-01-01 00:00:00.000    000001   10000     10000     0
李四   1999-01-02 00:00:00.000    000002   5000      0         5000
张三   1999-02-01 00:00:00.000    000003   6000      3000      3000
张三   1999-03-01 00:00:00.000    000004   15000     0         15000

(所影响的行数为 4 行)

姓名   日期                       还款单号   还款金额 
----- -------------------------- --------- -----------
张三   1999-04-03 00:00:00.000    000001    13000

(所影响的行数为 1 行)

 

--第二次插入的结果:

姓名   日期                       借支单号   借支金额  已还金额  未还余额
------ ------------------------------------ --------- -------- --------
张三   1999-01-01 00:00:00.000    000001    10000     10000     0
李四   1999-01-02 00:00:00.000    000002    5000      0         5000
张三   1999-02-01 00:00:00.000    000003    6000      6000      0
张三   1999-03-01 00:00:00.000    000004    15000     5000      10000

(所影响的行数为 4 行)

姓名   日期                       还款单号   还款金额 
------ ------------------------- ---------- ----------
张三   1999-04-03 00:00:00.000    000001    13000
张三   1999-04-03 00:00:00.000    000002    8000

(所影响的行数为 2 行)

--*/

SQL Server 用触发器实现库存的先进先出(有退货)

限制: 1)进仓表、出仓表只能一次插入一条,多条触发器没有对应。 2)退货没有指定批次,是按最近原则自动匹配的。...
  • tiger_zhao
  • tiger_zhao
  • 2015年05月04日 15:02
  • 1464

setInterval定时器(先触发一次再延时)

setInterval第一次延迟问题
  • datou0529
  • datou0529
  • 2017年01月10日 23:36
  • 4317

按优先数调度算法实现处理器调度的程序

一个小MM让我帮忙弄个课程设计,虽然挺简单但还是想了比较久才搞定(去网上搜索的代码都有明显的bug),重点是 SortChain 函数。 如果是双向链表估计就好 处理了: (1) ...
  • XscKernel
  • XscKernel
  • 2014年12月06日 11:20
  • 5011

磁盘调度算法——先进先出和电梯调度

#include #include using namespace std; /*先来先服务调度算法*/ void FIFO(int b[],int n,int num)//b[]磁...
  • u013263323
  • u013263323
  • 2013年12月24日 14:32
  • 890

FIFO先进先出置换算法

算法过程: 将内存块数组视为队列,在实现的过程中,初始化时,队头指针指向第一个内存块位置,队尾指针指向最后一个内存块位置。每次进行页面置换时,算法总置换当前队头,并且,队头指针循环加1,队尾指针循环...
  • u012432778
  • u012432778
  • 2015年06月16日 15:20
  • 2391

java队列--先进先出(循环队列、链队列)

队列--一种具有先进先出特点的数据结构,在我们生活中非常常见。队列可采用数组、链表存储。...
  • tanjiquan
  • tanjiquan
  • 2016年02月16日 22:16
  • 1349

android开发常用的缓存策略详解(2)- 先进先出(FIFO)置换算法

那么什么是FIFO算法呢?这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,...
  • qq_35703234
  • qq_35703234
  • 2017年12月19日 10:48
  • 41

linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段

生产者消费者问题:该问题描述了两个共享固定大小缓冲区的进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费...
  • Simba888888
  • Simba888888
  • 2013年06月15日 22:35
  • 4512

队列(FIFO)先进先出

首先引用《啊哈算法》中的一个题,背景就不说了。大体意思就是输入一串数字首先将第一个数字删除,然后将第二个数放在末尾。依次循环,最后按照删除的顺序,把这些数连起来。 这里然后引入队列这个概念,队列是一种...
  • Let_life_stop
  • Let_life_stop
  • 2017年12月18日 19:31
  • 48

java通过链表实现队列,先进先出

节点类package queue.demo;public class Node { private Object data; private Node nextNode; pri...
  • diwangerdai
  • diwangerdai
  • 2017年05月24日 11:40
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:先进先出的还款处理触发器
举报原因:
原因补充:

(最多只允许输入30个字)