关于mysql存储过程示例-手动事务-循环-日志

CREATE DEFINER=`root`@`%` PROCEDURE `RTX_RECEIPT_INSPECT_DATA`()
BEGIN-- 声明变量DECLARE RESULT_CODE INT DEFAULT FALSE; -- 默认falseDECLARE done INT DEFAULT FALSE; -- 默认falseDECLARE log_message TEXT;DECLARE V_COUNT INT;DECLARE V_QCREQUIRED VARCHAR(10);-- 收货需质检DECLARE V_PLANEMOVETASK VARCHAR(10);-- 生成平移任务DECLARE V_RECEIVESENDERP VARCHAR(10);-- 生成收货触发ERPDECLARE V_RULEKEY VARCHAR(30);-- 入库规则编号DECLARE V_POSTATUS VARCHAR(2); -- PO明细状态DECLARE V_APICHANGED VARCHAR(2); -- 接口指令更改标记DECLARE V_ERPLOC VARCHAR(50); -- ERP库位DECLARE V_LOTTABLE01 VARCHAR(50); -- 源ERP库位DECLARE V_INSPECTTYPE VARCHAR(10);DECLARE V_RECEIPTKEY VARCHAR(20);DECLARE V_RECEIPTLINENUMBER VARCHAR(20);DECLARE V_STORERKEY VARCHAR(50);DECLARE V_SKU VARCHAR(50);DECLARE V_QTYRECEIVED DECIMAL(22, 5);DECLARE V_UOM VARCHAR(5);DECLARE V_LOTTABLE02 VARCHAR(50);DECLARE V_RTXLOTTABLE14 VARCHAR(50);DECLARE V_TOLOC VARCHAR(20);DECLARE V_RTXMINPACKQTY DECIMAL(22, 5);DECLARE V_FIRSTQC VARCHAR(50);DECLARE V_rtxRcErpTaskStatus VARCHAR(1);DECLARE V_POKEY VARCHAR(50);DECLARE V_POLINENUMBER VARCHAR(15);DECLARE V_TYPE VARCHAR(10);DECLARE V_SUSR4 VARCHAR(50);DECLARE V_RTXRECEIVESLOCATION VARCHAR(50);-- 声明游标DECLARE receiptDetail_cursor CURSOR FORSELECT CASEWHEN R.TYPE = '7' OR (R.TYPE = '3' AND PS.DEPARTMENT = 'SP') THEN '1'WHEN R.TYPE = '3' AND PS.DEPARTMENT = 'OM' THEN '4'WHEN R.TYPE = '17' AND R.REFERENCELOCATION = 'RDM' THEN '3'WHEN R.TYPE = '3' AND R.REFERENCELOCATION = 'RDM' THEN '3'WHEN R.TYPE = '3' AND PS.DEPARTMENT <> 'OM' AND PS.DEPARTMENT <> 'SP' THEN '5'WHEN R.TYPE = '15' OR R.TYPE = '40' THEN '12'ELSE 'NONE' END    AS INSPECTTYPE,RD.RECEIPTKEY,RD.RECEIPTLINENUMBER,RD.STORERKEY,RD.SKU,RD.QTYRECEIVED,RD.UOM,RD.LOTTABLE02,RD.RTXLOTTABLE14, -- 生产条码 || 收货的 供应商批号(次) || 条码信息表的供应商批次RD.LOTTABLE01,RD.TOLOC,SKU.RTXMINPACKQTY,RD.RTXFIRSTDELV        AS FIRSTQC,RD.rtxRcErpTaskStatus,RD.POKEY,RD.POLINENUMBER,R.TYPE,COALESCE(R.SUSR4, ' ') AS SUSR4,RD.RTXRECEIVESLOCATIONFROM (SELECT * FROM RECEIPTDETAIL rdt WHERE rdt.editdate > DATE_SUB(NOW(), INTERVAL 60 DAY)) RDINNER JOIN RECEIPT R ON RD.RECEIPTKEY = R.RECEIPTKEYINNER JOIN SKU ON SKU.SKU = RD.SKU AND SKU.STORERKEY = RD.STORERKEYLEFT JOIN RTXPLANTSLOACTION PS ON PS.PLANT = RD.RTXSHIPPLANT AND PS.SLOCATION = RD.RTXSHIPSLOCATIONWHERE R.RTXISVIRTUAL = '0'AND RD.QTYRECEIVED > 0AND RD.RECEIPTKEY <> '0000049014'AND RD.STATUS NOT IN ('20')AND (R.TYPE = '15' OR (R.TYPE <> '15' AND R.STATUS = '11'))AND RD.QCSTATUS = 'N'AND RD.QCREQUIRED = '1'AND (RD.rtxRcErpTaskStatus = '1' OR EXISTS (SELECT 1FROM TASKDETAILWHERE TASKTYPE = 'RTXPMV'AND STATUS IN ('9', 'R', 'X')AND SOURCEKEY = RD.RECEIPTKEYAND ORDERLINENUMBER = RD.RECEIPTLINENUMBER));DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET RESULT_CODE = TRUE; #在执行过程中出任何异常设置result_code为true-- 声明异常处理DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 没值设置true-- 开始事务START TRANSACTION;-- 删除不存在收货明细送检记录。DELETEFROM RTXQCSEND XWHERE X.SOURCETYPE = 'RECEIPT'AND STATUS = '0'AND NOT EXISTS (SELECT 1FROM RECEIPTDETAIL YWHERE X.ORDERKEY = Y.RECEIPTKEYAND X.ORDERLINENUMBER = Y.RECEIPTLINENUMBER);-- 打开游标OPEN receiptDetail_cursor;-- 循环读取数据read_loop:LOOP-- 读取游标数据FETCH receiptDetail_cursor INTO V_INSPECTTYPE, V_RECEIPTKEY, V_RECEIPTLINENUMBER, V_STORERKEY, V_SKU, V_QTYRECEIVED, V_UOM, V_LOTTABLE02, V_RTXLOTTABLE14, V_LOTTABLE01, V_TOLOC, V_RTXMINPACKQTY, V_FIRSTQC, V_rtxRcErpTaskStatus, V_POKEY, V_POLINENUMBER, V_TYPE, V_SUSR4, V_RTXRECEIVESLOCATION;-- 判断是否到达游标末尾IF done THENLEAVE read_loop;END IF;SET V_ERPLOC = IFNULL(V_LOTTABLE01, ' ');-- 获取入库规则配置SET V_RULEKEY = (SELECT RULEKEY FROM RECEIPT INNER JOIN RTXRECEIVERULERELATION ON WMSRECEIPTYPE = TYPE AND ERPRECEIPTYPE = RTXEXTTYPE WHERE RECEIPTKEY = V_RECEIPTKEY LIMIT 1);SET log_message = CONCAT(log_message, '; 获取入库规则配置 = ', V_RULEKEY);SELECT QCREQUIRED, PLANEMOVETASK, RECEIVESENDERP INTO V_QCREQUIRED, V_PLANEMOVETASK, V_RECEIVESENDERP FROM RTXRECEIVERULECONFIG WHERE RULEKEY = V_RULEKEY;SET log_message = CONCAT(log_message, '; 收货需质检 = ', V_QCREQUIRED, '; 生成平移任务 = ', V_PLANEMOVETASK, '; 收货触发ERP = ', V_RECEIVESENDERP, '; 是否首次收货 = ', IFNULL(V_FIRSTQC, ''));-- 入库规则必须已启用质检IF V_QCREQUIRED = 'Y' THEN-- 如果ASN明细有关联PO明细,则验证PO明细状态不能为取消或接口已更改SELECT COUNT(1), MAX(STATUS), MAX(RTXCHANGED) INTO V_COUNT, V_POSTATUS, V_APICHANGED FROM PODETAIL WHERE POKEY = V_RECEIPTKEY AND POLINENUMBER = V_RECEIPTLINENUMBER;SET log_message = CONCAT(log_message, '; ASN明细有关联PO明细大小 = ', V_COUNT, '; PO明细状态 = ', IFNULL(V_POSTATUS, ''), '; PO明细指令变更标识 = ', IFNULL(V_APICHANGED, ''));IF V_COUNT > 0 THENIF V_POSTATUS > 11 OR V_APICHANGED = 'Y' THENSET log_message = CONCAT(log_message, 'PO明细状态 = ', IFNULL(V_POSTATUS, ''), '; PO明细指令变更标识 = ', IFNULL(V_APICHANGED, ''), '; 不满足业务跳出本次循环!');LEAVE read_loop;END IF;END IF;-- 如果入库规则已启用平移且收货明细已生成平移任务,则验证平移任务必须执行完毕SET log_message = CONCAT(log_message, '生成平移任务是否为【Y】 = ', IFNULL(V_PLANEMOVETASK, ''), '; 生成平移任务是否为【1】 = ', IFNULL(V_FIRSTQC, ''));IF V_PLANEMOVETASK = 'Y' AND V_FIRSTQC = '1' THENSELECT COUNT(1) INTO V_COUNT FROM TASKDETAIL WHERE TASKTYPE = 'RTXPMV' AND STATUS NOT IN ('9', 'R', 'X') AND SOURCEKEY = V_RECEIPTKEY AND ORDERLINENUMBER = V_RECEIPTLINENUMBER;IF V_COUNT > 0 THENSET log_message = CONCAT(log_message, '; 收货明细启用平移切已生成平移任务,不存在不满足业务的数据,跳出本次循环!');LEAVE read_loop;END IF;ELSEIF V_PLANEMOVETASK = 'Y' AND V_FIRSTQC <> '1' THENSET log_message = CONCAT(log_message, '; 收货明细启用平移切未生成平移任务。跳出本次循环!');LEAVE read_loop;END IF;-- 如果入库规则已启用收货发送ERP过账,则收货明细必须已完成移动类型为103的ERP过账-- IF V_RECEIVESENDERP = 'Y' THEN SELECT COUNT(1) INTO V_COUNT FROM RTXINPOSTTASK WHERE MOVETYPE = '103' AND ERPPOSTSTATUS IN ('PS', 'PC') AND ORDERKEY = V_RECEIPTKEY AND ORDERLINENUMBER = V_RECEIPTLINENUMBER; -- 如果收货单单头的UDF4为NO103QC时,未103过账,也允许送检--     IF V_COUNT = 0 AND V_SUSR4 <> 'NO103QC' THEN LEAVE read_loop; END IF;-- END IF;-- 如果WMS订单类型 = ‘7’(采购订单),且工厂+ERP库位在工厂库存地配置的仓库类型为‘OCFB’(O厂分包),则取收货明细 RTXRECEIVESLOCATIONSET log_message = CONCAT(log_message, 'WMS订单类型是否为【7】 = ', IFNULL(V_TYPE, ''), '; 仓库类型为【OCFB】 = ', IFNULL(V_ERPLOC, ''));IF V_TYPE = '7' AND LENGTH(V_ERPLOC) > 4 THENSELECT COUNT(1) INTO V_COUNT FROM RTXPLANTSLOACTION WHERE PLANT = V_STORERKEY AND SLOCATION = V_ERPLOC AND TYPE = 'OCFB';IF V_COUNT > 0 THENSET V_ERPLOC := V_RTXRECEIVESLOCATION;SET log_message = CONCAT(log_message, '; WMS订单类型 = 7,接收库存地仓库类型为OCFB,不存在不满足业务的数据,跳出本次循环!');END IF;SET log_message = CONCAT(log_message, '; WMS订单类型 = 7,且工厂+ERP库位在工厂库存地配置的仓库类型为OCFB = ', V_COUNT);END IF;-- 插入QC送检记录SET log_message = CONCAT(log_message, '; 插入QC送检记录');INSERT INTO RTXQCSEND(WHSEID, INSPECTTYPE, ORDERKEY, ORDERLINENUMBER, STORERKEY, SKU, QCTOINSPECT, UOM, SUPPLIER, SUPPLIERLOT, PLANT, SLOCATION, QCLOC, PACKQTY, ISFIRSTRECEIVE, STATUS, SOURCETYPE, ADDWHO, EDITWHO, QCRESULT, QCQTYREJECTED, QCQTYCONCEDE)VALUES(DATABASE(), V_INSPECTTYPE, V_RECEIPTKEY, V_RECEIPTLINENUMBER, V_STORERKEY, V_SKU, V_QTYRECEIVED, V_UOM, IFNULL(V_LOTTABLE02, ' '), IFNULL(V_RTXLOTTABLE14, ' '), V_STORERKEY, V_ERPLOC, V_TOLOC, IFNULL(V_RTXMINPACKQTY, '0'), IFNULL(V_FIRSTQC, ' '), '0', 'RECEIPT', 'mysqlJob', 'mysqlJob', '', 0, 0);-- 更新收货明细的QC状态为已发送SET log_message = CONCAT(log_message, '; 更新收货明细的QC状态为已发送');UPDATE RECEIPTDETAIL SET QCSTATUS ='S' WHERE RECEIPTKEY = V_RECEIPTKEY AND RECEIPTLINENUMBER = V_RECEIPTLINENUMBER;END IF;END LOOP read_loop;CLOSE receiptDetail_cursor;IF RESULT_CODE THEN-- 异常发生时进行回滚ROLLBACK;ELSE-- 提交事务COMMIT;END IF;SET log_message = CONCAT('RTX_RECEIPT_INSPECT_DATA 不满足条件 = ', done, '; 异常状态 = ', RESULT_CODE);SELECT log_message;INSERT INTO procedure_log(procedure_name, execution_time, log_message)VALUES('RTX_RECEIPT_INSPECT_DATA', NOW(), log_message);
END

关于在存储中获取编号

            -- 获取下一个任务键值SELECT CONCAT('TK_JOB_', DATE_FORMAT(NOW(), '%y%m%d'), '_',CONCAT(LPAD(IFNULL(MAX(CAST(SUBSTRING(TASKDETAILKEY, 15) AS UNSIGNED)) + 1, 1), 6, '0')))INTO V_TASKDETAILFROM TASKDETAILWHERE TASKDETAILKEY LIKE CONCAT('TK_JOB_', DATE_FORMAT(NOW(), '%y%m%d'), '%');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

对浅拷贝的理解

问题背景 我之前一直以为浅拷贝出来的新对象和旧对象的引用地址是相同的&#xff0c;但是通过Object和发现浅拷贝的新对象和旧对象的引用地址不同&#xff01;&#xff01; const obj1 { name: "Alice", test: { age: 12 } };const obj4 Object.assign({}, obj1);…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言 这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的&#xff0c;当然自己也是才开始学习的vue&#xff0c;在学到这个Vue的自定义事件的时候&#xff0c;虽然知识点很绕&#xff0c;但是在理解后又觉得很意思&#xff0c;觉得Vue真的很强大。这里博主将自己学习到的…

解释PostgreSQL中的MVCC(多版本并发控制)机制是如何工作的?

文章目录 MVCC的工作原理1. 数据行版本化2. 事务ID和可见性3. 清理旧版本 解决方案&#xff1a;MVCC的优势1. 高并发性2. 避免锁竞争3. 一致性视图 示例代码 PostgreSQL中的MVCC&#xff08;多版本并发控制&#xff09;机制是一种在数据库管理系统中实现事务隔离级别的方法&…

vue中的mixin(局部混入、全局混入)

一、mixin是什么 Mixin是面向对象程序设计语言中的类&#xff0c;提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类&#xff1b;Mixin类通常作为功能模块使用&#xff0c;在需要该功能时“混入”&#xff0c;有利于代码复用又避免了多继承的复杂 Vue中的mixin…

如何远程访问路由器?

远程访问路由器是一种方便的技术&#xff0c;使用户可以远程操作和配置他们的网络设备。无论用户身在何处&#xff0c;只要有互联网连接&#xff0c;就可以远程访问家庭或办公室的路由器。在这篇文章中&#xff0c;我将介绍远程访问路由器的优势以及一种名为【天联】的组网产品…

数据结构之双链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 双链表的实现 初始化双链表 在双链表中尾插数据 在双链表中尾删数据 在双链表中头插数据 在双链表中头删数据 在双…

低代码技术与仓储管理的新纪元:革命性的供应链变革

引言 在当今数字化时代&#xff0c;企业对于创新和效率的追求越发迫切。在这样的背景下&#xff0c;低代码技术应运而生&#xff0c;成为企业数字化转型的重要工具之一。低代码技术的崛起为企业提供了一种快速、灵活、成本效益高的开发方式&#xff0c;大大缩短了软件开发周期…

POJO,Entity,model,domain,view,DTO,VO,Param这些分别都是什么含义?怎样理解?

目录 1. 前言 2. POJO的含义 3. entity(实体) 4. model(模型) 5. domain(域) 6. view(视图) 7. DTO(数据传输对象) 8. VO(真正视图层) 9. Param(参数) 10. 总结 1. 前言 在日常开发的过程中&#xff0c;如果我们接手一个新的项目之后&#xff0c;通常会有各种各样的…

浅谈免杀下的持久化

文章目录 前记注册表计划任务COM劫持后记reference 前记 实战中持久化的手段常用的就是加服务、添改注册表、加计划任务、劫持等&#xff0c;这里探索c/c下的维权免杀 注册表 用户级 \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run \HKEY_CURRENT_USER…

代码随想录算法训练营DAY36|C++贪心算法Part.5|435.无重叠区间、763.划分字母区间、56. 合并区间

文章目录 435.无重叠区间按右边界排序CPP代码 按左边界排序如何判断相邻区间是否重叠如何判断一下一个区间与当前相邻区间是否重叠总结CPP代码 763.划分字母区间思路伪代码实现CPP代码 56. 合并区间思路CPP代码 435.无重叠区间 力扣题目链接 文章链接&#xff1a;435.无重叠区间…

Python 0基础_变现_38岁_day 15(匿名函数)

匿名函数&#xff1a; 不用定义函数名&#xff0c;无需使用def关键字&#xff0c;使用lambda将函数写成一行&#xff1b;#使用匿名函数定义一个两个数字相加的函数add lambda x,y : xy #使用变量接收匿名函数的内容&#xff0c;且变量名作为调用函数的变量名&#xff1…

EasyRecovery数据恢复软件2025破解版安装包下载

EasyRecovery数据恢复软件的主要功能及使用教程。coco玛奇朵可以提供一个概要和简化的教程&#xff0c;以便你了解其基本内容和操作步骤。 EasyRecovery绿色破解下载网盘链接: https://pan.baidu.com/s/1_6NmcOh_Jmc-DGc4TJD-Mg?pwddq4w 提取码: dq4w 复制这段内容后打开百度…

强固型工业电脑在称重系统+叉车电脑,称重量体扫码一体机,物流分拣线工作站行业应用

称重系统叉车电脑行业应用 背景介绍 在叉车上安装称重传感器&#xff0c;通过对举升压力的自动检测&#xff0c;将压力信号转换为电流或电压信号&#xff0c;经过A/D转换&#xff0c;使模拟信号变为数字信号&#xff0c;经微处理器进行数据处理后通过蓝牙、串口或者USB接口将称…

dial tcp 192.168.0.190:443: connect: connection refused

1、场景 用nerdctl登录镜像仓库192.168.0.190&#xff08;Harbor&#xff09;&#xff0c;报错 ERRO[0006] failed to call tryLoginWithRegHost error"failed to call rh.Client.Do: Get \"https://192.168.0.190/v2/\": dial tcp 192.168.0.190:…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历&#xff08;DFS&#xff09;广度优先遍历 图的连接分量和生成树生成…

C#设计树形程序界面的方法:创建特殊窗体

目录 1.TreeView控件 2.实例 &#xff08;1&#xff09;Resources.Designer.cs &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs &#xff08;4&#xff09;生成效果 以树形来显示程序的菜单&#xff0c;可以更直观、更快捷地对窗体进行…

科技赋能无人零售

科技赋能无人零售&#xff0c;使其具备以下独特优势&#xff1a; 1. 全天候无缝服务 &#xff1a;无人零售店依托科技&#xff0c;实现24小时不间断运营&#xff0c;不受人力限制&#xff0c;满足消费者随时购物需求&#xff0c;尤其惠及夜间工作者、夜猫子及急需购物者&…

Android --- 常见UI组件

TextView 文本视图 设置字体大小&#xff1a;android:textSize"20sp" 用sp 设置颜色&#xff1a;android:textColor"#00ffff" 设置倍距(行距)&#xff1a;android:lineSpacingMultiplier"2" 设置具体行距&#xff1a;android:lineSpacingExtra&q…