库存数量管理方案一:基于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解决实战问题 作者: ...
随机推荐
- 神坑!为什么prometheus的pushgateway不能对上报的counter进行累加?
部署了一个prometheus的pushgateway,然后两次对其发送counter类型的数据: #第一次发送 curl -X POST -d '# TYPE my_first_metric_ahf ...
- 定位new
常规的new是分配内存,然后调用相应的构造函数,而定位new是在已经分配内存的上面调用构造函数: // ConsoleApplication7.cpp : 定义控制台应用程序的入口点. #includ ...
- Nginx限制连接控制访问量
目录 一:限制连接数模块(同时访问网址能访问多少次) 1.修改网址模块文件 2.测试 3.重启 4.增加解析ip 5.压力测试 二:控制Nginx访问量 1.连接池 2.限制数 3.测试 4.重启 5 ...
- 字节Android Native Crash治理之Memory Corruption工具原理与实践
作者:字节跳动终端技术--庞翔宇 内容摘要 MemCorruption工具是字节跳动AppHealth (Client Infrastructure - AppHealth) 团队开发的一款用于定 ...
- C++ STL 容器概述
在STL编程中,容器是经常用到的一种数据结构,在C++标准库中,容器分为: 序列式容器 关联式容器 二者本质区别在于,序列式容器是通过元素在容器中的位置进行顺序存储和元素访问.关联容器则是通过键[ke ...
- Caffeine缓存 最快缓存 内存缓存
一.序言 Caffeine是一个进程内部缓存框架. 对比Guava Cache Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存.使用Caffei ...
- AT2348 [ARC070D] HonestOrUnkind
不妨先从无解的情况下手,不难发现当 \(A \le B\) 时是一定无解的. 因为不诚实的 \(B\) 个人可以装作是诚实的,全部说自己这一方是诚实的对方是不诚实的我们就无法判断了. 下面我们就可以在 ...
- JAVA多线程学习十一-线程锁技术
前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...
- kali切换桌面环境
感谢大佬:https://blog.csdn.net/tao546377318/article/details/52353018 kali 是基于Debian的发行版,兼容性和软件支持都很好,默认使用 ...
- (全局npmrc)nrm、npmrc、package-lock.json 的优先级
npmrc 测试 nrm.npmrc 的优先级 实验 1. 没有设置 nrm. 默认设置 registry 为 https://registry.npmjs.org/ 下载的所有包都是通过以上域名获取 ...