库存更新是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(结合活字格案例)的更多相关文章

  1. 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)

    转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...

  2. 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦

           上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...

  3. 基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题

    目录 基于Git的数据库sql文件的管理--完美解决团队sql操作协同问题 1.产生背景 2.之前没用Git管理数据库出现的问题 2.1 用同一个库调试带来的问题 3.解决方案 3.1 Sql文件的创 ...

  4. PostgreSQL存储过程(1)-基于SQL的存储过程

    什么是SQL函数? SQL函数包体是一些可执行的SQL语言.同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果. 除非SQL函数声明为返回void,否则最后一条语句必须是S ...

  5. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  6. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结

    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...

  7. 基于sql service会话共享,实现SSO

    1:session的存储基于sql service数据库来存储 2:修改sql service中会话管理的系统存储过程 3:实现几个站点的会话共享 4:应用共享会话,实现单点登录

  8. sql存储过程中循环批量插入

    前几天有一个需求很头痛,部门是有上下级关系的,在给部门的经理赋予角色和权限的时候,通常我们都会认为假如经理A的部门是1,那么我给了他部门1 的管理权限,那么1的下级部门101,102,103 &quo ...

  9. 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战

    本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...

随机推荐

  1. 【必杀】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。

    之前写过一篇文章,https://www.cnblogs.com/qidian10/p/6028784.html 解释如何解决此类问题,但现在回过头来想一下,之前的文章还是太过浅显,无法完全有效的彻底 ...

  2. Java继承的概念与实现

    // 方法 public class Demo { public static void main(String[] args) { Teacher t = new Teacher(); t.name ...

  3. python16day

    昨日回顾 自定义模块 模块的两种执行方式:脚本方式.调用方式 name 模块导入的方式 相对导入 random:获取随机数相关 今日内容 常用模块的介绍 time:和时间相关 datetime os ...

  4. python15day

    昨日回顾 装饰器:完美的呈现了开放封闭原则.本质:闭包. def wrapper(f): def inner(*args,**kwargs): '''在执行被装饰函数之前,想写什么代码写什么代码''' ...

  5. python07day

    回顾 id == is: ==: 数值是否相同 is: 内存地址是否相同 id: 获取对象的内存地址 代码块: 一个文件.交互式命令一行都是一个代码块 同一代码块下缓存机制(字符串驻留机制) 所有数字 ...

  6. 关于使用学生或者教师身份免费使用JetBrains全家桶的说明

    官网操作 JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室,该公司有众多的好用的IDE,比如pycharm,webstorm,Int ...

  7. ApacheCN Vue 译文集 20211115 更新

    使用 GraphQL 构建 VueJS 应用 零.前言 一.数据绑定.事件和计算属性 二.组件.混合器和功能组件 三.设置我们的聊天应用--AWS Amplify 环境和 GraphQL 四.创建自定 ...

  8. ApacheCN 计算机视觉译文集 20210212 更新

    新增了六个教程: OpenCV 图像处理学习手册 零.前言 一.处理图像和视频文件 二.建立图像处理工具 三.校正和增强图像 四.处理色彩 五.视频图像处理 六.计算摄影 七.加速图像处理 Pytho ...

  9. BIMFACE 二次开发 SDK 之歌

    <BIMFACE SDK 之歌>讲述了作者与 BIMFACE 从相识.相知.相爱.相守的艳遇之爱唯美故事   我是一个小小的程序员 穿行在人来人往的IT行业之间 编程工作与建筑信息化相关 ...

  10. DP 专练

    A - 跳蚤电话 观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点. 所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也 ...