库存数量管理方案一:基于SQL存储过程和MERGE(结合活字格案例)
库存更新是ERP系统的基本功能,一般包括以下动作:
1、以库位编号和商品编号查询库存表,如果查询不到,则添加一行库存信息,如:(出入库)库位编号/(出入库)商品编号/(出入库)+或-数量
2、以库位编号和商品编号查询库存表,如果查询到,则更新查询到的库存信息,如:(库存表)数量=(库存表)数量+或-(出入库)数量
很奇怪活字格的数据表操作命令,不提供以下功能:(1)更新(如果没有就添加);(2)字段值,一不能取得库存表的值,二不能设置条件。所以论坛里存在着好几个版本的库存更新方案,比如:
1、官方用到的页面处理方法,因为比较违反我所认知的常识逻辑(之前有接触过很多类似平台,这事情就应该放到服务端去干,或者是固有的思维吧),这个方法具体实现没有细看。也有很多同仁说,数据调到页面处理,如果是高并发情况,调出数据后,如果数据源的数据已变更,怎么办?这样的问题,是很容易想到的。(但好像什么时候听梁老湿说有方案可以在页面处理的时候避免高并发数据不一致的情况)
2、视图法,就是所有的出入库操作(包括盘点等),用select和union all做成视图,然后出入库视图的基本上,再用group by做库存计算。这个方案,可以避免方案1数据不一致的问题。但但但,这是个虚拟库存表呀,所以你怎么样都会感觉它虚,另一个就是很快会碰到的效率问题。如果是有POS系统的,就算一年销售50万件货吧,产生的数据量大概就要到一两百万条了,而且还要在视图基础上再做两到三层的视图(数据库效率论里面一般都会说要尽量避免多层视图),可见以后麻烦会有多大。另外,和库存关联比较大的一个应用WMS,要涉及到比较复杂的库存条件判断和计算(比如库位锁定等),用这个方法也基本上非常难解决。
所以,思来想去,还是要老老实实做累计库存表,而要用累计库存表,又不能在页面端处理数据,就只能用存储过程了。所以到这里的时候,我就直接放弃内置数据库,然后开始学习SQL。下面我介绍的方法,就是基于外置数据库(sqlserver)和MERGE。
现在活字格调用存储过程非常的方便,有了存储过程,意味的系统设计的灵活性翻了一片天,因为你可以直接用SQL了。用SQL,不仅仅在功能上,还有在案例资源上,那就不是活字格这块天地了,而是整个数据库的天地,想实现啥功能,搜一搜,基本上能找到方案。(另一个类似功能是JS,暂且不表)。
话题拉回来。在数据库端实现库存更新,基本上有两个思路,一是用IF和EXIST,循环判断,然后根据判断结果执行UPDATE或者INSERT;二就是用强大的MERGE,MERGE可以说是专门为这种更新而生的。我直接选个这个方案。(官方关于MERGE的应用说明)https://docs.microsoft.com/zh-cn ... iew=sql-server-2017
用MERGE,有两个表,一是目标表,这里就是库存表;二是源表,这里就是业务表单,如出库、入库等。在数据库端,用这个源表的话,你要做一下筛选,MERGE支持源表的子查询。所以结合活字格的存储过程,你就要在页面,将主表的单号做为参数传递给存储过程,然后源表用子查询WHERE一下,就解决源表的问题了。另外,MERGE的UPDAGE和INSERT是支持标量子查询和CASE的,这就给更复杂的条件判断留下了可能(因为现在的系统还没涉及到,所以还没详细研究)。好了,下面亮代码:
1、存储过程(这个是增加,同时要有一个反向的):
<ignore_js_op>
2、页面调用存储过程
<ignore_js_op>
3、按钮的控制(页面的按钮支持正向和反向,如上图,我是根据按钮单元格的值来调用正向和反向的存储过程)。活字格真得很灵活呀,可以直接根据表单状态值来直接更新按钮(设置单元格属性,如背景和值等)。
这样,就能够实现一个严谨的库存更新的业务逻辑了。
库存数量管理方案一:基于SQL存储过程和MERGE(结合活字格案例)的更多相关文章
- 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)
转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...
- 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦
上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...
- 基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题
目录 基于Git的数据库sql文件的管理--完美解决团队sql操作协同问题 1.产生背景 2.之前没用Git管理数据库出现的问题 2.1 用同一个库调试带来的问题 3.解决方案 3.1 Sql文件的创 ...
- PostgreSQL存储过程(1)-基于SQL的存储过程
什么是SQL函数? SQL函数包体是一些可执行的SQL语言.同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果. 除非SQL函数声明为返回void,否则最后一条语句必须是S ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...
- 基于sql service会话共享,实现SSO
1:session的存储基于sql service数据库来存储 2:修改sql service中会话管理的系统存储过程 3:实现几个站点的会话共享 4:应用共享会话,实现单点登录
- sql存储过程中循环批量插入
前几天有一个需求很头痛,部门是有上下级关系的,在给部门的经理赋予角色和权限的时候,通常我们都会认为假如经理A的部门是1,那么我给了他部门1 的管理权限,那么1的下级部门101,102,103 &quo ...
- 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战
本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...
随机推荐
- 计算机视觉3-> yolov5目标检测1 |从入门到出土
本来就想着是对自己第一次跑yolov5的coco128的一个记录,没想到现在准备总结一下的时候,一方面是继续学习了一些,另一方面是学长的一些任务的要求,挖出了更多的东西,所以把名字改为了"从 ...
- 多线程-停止线程方式-Interrupt
1 package multithread4; 2 /* 3 * 停止线程: 4 * 1,stop方法. 5 * 6 * 2,run方法结束. 7 * 8 * 怎么控制线程的任务结束呢? 9 * 任务 ...
- java-异常-异常处理原则
1 异常处理的原则: 2 * 1,函数内部如果抛出需要检测的异常,那么函数上必须要声明. 3 * 否则必须在函数内用trycatch捕捉,否则编译失败. 4 * 5 * 2,如果调用到了声明异常的函数 ...
- linux用户密码过期导致命令执行失败
背景介绍: 使用zabbix调用系统命令,检查时间同步,发现一直在报错,root 用户执行无异常,问题还是出现zabbix用户上面. [zabbix@test-10-12 ~]$ sudo ntpda ...
- dp学习(五)
与数学有关的dp. 22. 计数dp 23. 数位dp 其实这个可以归到计数dp? 24. 数论dp 25. 概率dp
- 张高兴的 .NET IoT 入门指南:(七)制作一个气象站
距离上一篇<张高兴的 .NET Core IoT 入门指南>系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系 ...
- HttpClient的NoHttpResponse问题
调用第三方接口时会报NoHttpResponse异常,原因是上次的连接已经断掉了,但是客户端并未知道,复用上次连接就报错了,所以要解决这个问题,就是要校验上次链接是否断掉了 1. httpCl ...
- bom-倒计时
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ext原码学习之lang-Array.js
// JavaScript Document //Array 方法 (function(){ var arrayPrototype = Array.prototype, slice = arrayPr ...
- 数组中包含多个对象 按照对象中的时间进行排序 适用与Angular.js、Jquery、微信小程序等
LiveList.sort(this.compare('StartDate')) //StartData:需要排序的时间 compare: function (property) { ...