库存数量管理方案一:基于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解决实战问题 作者: ...
随机推荐
- C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)
一.简叙 写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版D ...
- 【笔记】thanos ruler组件
阅读官网文档后的笔记:https://thanos.io/tip/components/rule.md/ 感受 官网第一个话就强调风险,看来坑很多,能不用尽量不用 recording rule &am ...
- 浅谈MySQL同步到ElasticSearch的几种方式及其优缺点
同步双写 优点:业务逻辑简单. 缺点: 硬编码,有需要写入mysql的地方都需要添加写入ES的代码: 业务强耦合: 存在双写失败丢数据风险: 性能较差:本来mysql的性能不是很高,再加一个ES,系统 ...
- golang中闭包讲解
1. 非闭包时的结果 package main import "fmt" func main() { var funcSlice []func() for i := 0; i &l ...
- 前端页面禁止调试debugger方法汇总
打开控制台直接跳转页面 //debug调试时跳转页面 var element = new Image(); Object.defineProperty(element,'id',{get:functi ...
- ES_AutoCheck.sh
#!/bin/bash #@es_check #@date 2019/11/26 #@auth tigergao status=`curl -s GET "http://172.16.71. ...
- 测试udp端口
yum -y install nc 在a机器上执行: nc -ul 1080 在b机器上执行:nc -u 服务器ip 1080 a机器可以接收到报文则代表端口正常.
- python21day
内容回顾 re模块的常用方法 findall(正则,待匹配字符串,flag):返回所有匹配项的列表 search:返回一个变量,通过group取到第一个匹配项 match:从头开始找第一个,其他同se ...
- Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...
- 如何在Visual Studio中添加opencvsharp的可视化工具
这个文件放到这个目录下,就可以看mat对象查看了