找回密码
 立即注册

QQ登录

只需一步,快速开始

lwt 悬赏达人认证 活字格认证
论坛元老   /  发表于:2018-11-24 10:36  /   查看:22848  /  回复:56
本帖最后由 Simon.hu 于 2019-2-19 16:28 编辑

      大家都应该看过官方的库存案列,其中有出入单据发生增删改时是如何对于库存数量进行更改变化的。案列中做了一个辅助表用来记录单据在更改前和删除前的原始数据,再通过数量的增减后得出新的库存,提交后更新数据库中的库存数量。大家可能会觉得功能虽实现了,但是应用起来比较复杂,不便于维护。当然也有人用视图的聚合来计算库存数量,得取最新库存,在这里不讨论谁的优劣,只是介绍另一种更新数量的方法,不一定要用在库存上,其它应用中也可能需要用到。      我归纳了下触发更改数量的这种方式类似于其它Excel平台的回写公式,在增删改时触发命令更改目标数量,也有Excel平始称为业务公式,把改删前数量当作了变量可以在公式中调用进行数量更新回写,这样前台方便调用不用再写触发器了。     在这里借花献佛希望通过这个案列能让官方能做成命令让不会SQL的人的方便使用。触发的优点:前台不用做数据的计算,把数据丢到服务器去计算了,速度会非常快。也可以思路扩展下用触发去解决存储过程的问题,不用官方给的存储过程调用代码。
1.实现理论,数据增删改后SQL会在数据库中自动产生如下临时表,通过这两张表与更改目标表的数量进行加减得出新的
  deleted 增改删前数据临时表
  inserted 增改删后数据临时表
2.库表设计
a.库存表(物料ID,存量)
b.出入库表_子表(物料ID,出入量)3.下面是SQL脚本

Create trigger 出入库触发_库存表_存量                 --取名
on 出入库表_子表                                                 --触发放在此表
for insert,update,delete                                        --在增删改时执行
as
begin
--新增
if(exists(select 1 from inserted) and not exists(select 1 from deleted))                         --判断当前是新增?
     update 库存表
        set 存量=isnull(存量,0)+isnull(BCH.出入量,0)                                                            --存量的计算方法:存量=存量+新增量
     FROM (select 物料ID,sum(数量) as 数量 from inserted  group by 物料ID) as BCH     --给新增后记录取名保存后【BCH】
     WHERE BCH.物料ID=库存表.物料ID
--更新
if(exists(select 1 from inserted) and exists(select 1 from deleted))                               --判断当前是更改?
    begin  
      update 库存表
         set 存量=isnull(存量,0)-isnull(BCQ.出入量,0)+isnull(BCH.出入量,0)                            --存量的计算方法:存量=存量-更新前+更新后
      FROM (select 物料ID,sum(出入量) as 出入量 from Deleted  group by 物料ID) as BCQ  --给更改前记录取名更新前【BCQ】
          ,(select 物料ID,sum(出数量) as 出入量 from inserted  group by 物料ID) as BCH      --给更改后记录取名更新后【BCH】
      WHERE BCQ.物料ID=库存表.物料ID and BCH.物料ID=库存表.物料ID
    END
--删除
if(not exists(select 1 from inserted) and exists(select 1 from deleted))                           --判断当前是否为删除?
    begin  
       update 库存表
         set 存量=isnull(存量,0)-isnull(BCQ.出入量,0)                                                              --存量的计算方法:存量=存量-删除前
       FROM (select 物料ID,sum(出入量) as 出入量 from Deleted  group by 物料ID) as BCQ --给删除前记录取名更新后【BCQ】
       WHERE BCQ.物料ID=库存表.物料ID
    end
end




评分

参与人数 1满意度 +5 收起 理由
dklzhq + 5 很给力!

查看全部评分

56 个回复

正序浏览
Eric.Liang讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-3-16 18:12:54
62#

6.0直接用服务器端命令~也很方便~
回复 使用道具 举报
yikai
金牌服务用户   /  发表于:2020-3-15 20:42:17
61#
Mark, 收藏了
回复 使用道具 举报
yikai
金牌服务用户   /  发表于:2020-3-15 20:42:15
60#
Mark, 收藏了
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-2-28 09:37:57
59#
yxq 发表于 2020-2-27 21:22
请教楼主一个问题,在修改时如果改变物料ID该咋办?目前的触发器经测试在改变物料ID时库存没有更新!谢谢!

看我们6.0的服务端命令吧~
回复 使用道具 举报
yxq
初级会员   /  发表于:2020-2-27 21:22:20
58#
请教楼主一个问题,在修改时如果改变物料ID该咋办?目前的触发器经测试在改变物料ID时库存没有更新!谢谢!
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2019-5-24 16:34:53
57#

不客气的哈~
回复 使用道具 举报
mucai悬赏达人认证 活字格认证
高级会员   /  发表于:2019-5-21 18:13:50
56#
Simon.hu 发表于 2019-5-21 09:57
我看这个兄弟的写的还可以的~

触发器实现库存更新附工程文件

笑纳了,多谢
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2019-5-21 09:57:23
55#
mucai 发表于 2019-5-20 15:32
楼主,库存回写触发器的方案有写有实例吗?

我看这个兄弟的写的还可以的~

触发器实现库存更新附工程文件
https://gcdn.grapecity.com.cn/fo ... 8&fromuid=30160
(出处: 葡萄城产品技术社区)
回复 使用道具 举报
mucai悬赏达人认证 活字格认证
高级会员   /  发表于:2019-5-20 15:32:28
54#
楼主,库存回写触发器的方案有写有实例吗?
回复 使用道具 举报
luolanqiang活字格认证
高级会员   /  发表于:2019-5-16 18:13:21
53#
反之也应该考虑服务器的荷载,我就琢磨着如何给服务器减荷。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部