Mis多级配方处理的简洁方式

2023-10-17 11:40

本文主要是介绍Mis多级配方处理的简洁方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mis多级配方处理的简洁方式http://www.bieryun.com/3409.html

在Mis开发中经常会碰到配方(简易BOM):如进销存中的组装单、拆卸单,MPR中的材料定额等均可以采用配方来解决。下边是一个常规树型配方的基本结构:

CREATE TABLE CL_CPPF(
XH varchar(30) not NULL,--型号
CXH varchar(30) not NULL,--子型号
PFSM varchar(30) NULL,--说明
SL numeric(18, 3) not NULL DEFAULT (0),--子型号数量
ID int IDENTITY(1,1) NOT NULL
)

网上可以查到多个类似配方处理的代码,大多是采用递归等方始处理的,代码较为复杂,有些时候只需深度为一、二级的小配方,不需要多级深度的大配方。能否用一条SQL语句就可以处理类似一、二级的小配方的呢?

通过努力,笔者终于找到了:
深度为一级的小配方:

Select case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From CL_CPPF as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001'

从语句上可以看出,一级的小配方仅仅是个左连查询。这真是大道至简呀。有了一级配方的语句,写二级配方就非常容易了:

Select case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From
(Select 'DJ-001' as xh,case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From CL_CPPF as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001' ) as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001'

下边是见证奇计的时刻了,
现隆重推出多级(无限级)配方的SQL代码:

declare @XH varchar(30)
declare @ID int,@ID1 int

CREATE TABLE #tmp (
XH varchar(30) NULL,
CXH varchar(30) NULL,
SL numeric(18, 3) NULL DEFAULT (0),
LVL Int NULL DEFAULT (0),--深度
ID int IDENTITY(1,1) NOT NULL
)

set @XH ='DJ-001'

insert into #tmp (xh,cxh,sl) select a.xh,a.cxh,a.sl from cl_CPPF as a where a.xh= @XH
set @id=0

while exists(select b.xh from #tmp as b, CL_CPPF as a where a.xh=b.cxh and b.xh=@XH and b.id>@id)
begin
select @id1=max(id) from #tmp
insert into #tmp (xh,cxh,sl,LVL)
Select @XH as xh,case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl,b.LVL+1
From #tmp as b, CL_CPPF as a where a.xh=b.cxh and b.xh=@XH and b.id>@id
set @id=@id1
end

select * from #tmp as a where not exists( select xh from cl_CPPF as b where b.xh=a.cxh)
drop table #tmp

非常简单吧,上述多级(无限级)配方的SQL代码也可为编写其它复杂BOM时参考。

上述的代码是从产品主型号查找子材料的代码,作为问题的扩展,我们能否用子材料找出改材料被哪些主型号使用?
这里特别提示一下,代码中的XH 与 CXH 是对等。

上述观点仅供参考,代码上有疑问多联系,我们共同探讨。

    在Mis开发中经常会碰到配方(简易BOM):如进销存中的组装单、拆卸单,MPR中的材料定额等均可以采用配方来解决。下边是一个常规树型配方的基本结构:

CREATE TABLE CL_CPPF(
XH varchar(30) not NULL,--型号
CXH varchar(30) not NULL,--子型号
PFSM varchar(30) NULL,--说明
SL numeric(18, 3) not NULL DEFAULT (0),--子型号数量
ID int IDENTITY(1,1) NOT NULL
)

网上可以查到多个类似配方处理的代码,大多是采用递归等方始处理的,代码较为复杂,有些时候只需深度为一、二级的小配方,不需要多级深度的大配方。能否用一条SQL语句就可以处理类似一、二级的小配方的呢?

通过努力,笔者终于找到了:
深度为一级的小配方:

Select case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From CL_CPPF as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001'

从语句上可以看出,一级的小配方仅仅是个左连查询。这真是大道至简呀。有了一级配方的语句,写二级配方就非常容易了:

Select case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From
(Select 'DJ-001' as xh,case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl From CL_CPPF as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001' ) as b
left JOIN CL_CPPF as a on a.xh=b.cxh where b.xh='DJ-001'

下边是见证奇计的时刻了,
现隆重推出多级(无限级)配方的SQL代码:

declare @XH varchar(30)
declare @ID int,@ID1 int

CREATE TABLE #tmp (
XH varchar(30) NULL,
CXH varchar(30) NULL,
SL numeric(18, 3) NULL DEFAULT (0),
LVL Int NULL DEFAULT (0),--深度
ID int IDENTITY(1,1) NOT NULL
)

set @XH ='DJ-001'

insert into #tmp (xh,cxh,sl) select a.xh,a.cxh,a.sl from cl_CPPF as a where a.xh= @XH
set @id=0

while exists(select b.xh from #tmp as b, CL_CPPF as a where a.xh=b.cxh and b.xh=@XH and b.id>@id)
begin
select @id1=max(id) from #tmp
insert into #tmp (xh,cxh,sl,LVL)
Select @XH as xh,case when a.sl is null then b.cxh else a.CXH end cxh,b.SL*isnull(a.sl,1) as sl,b.LVL+1
From #tmp as b, CL_CPPF as a where a.xh=b.cxh and b.xh=@XH and b.id>@id
set @id=@id1
end

select * from #tmp as a where not exists( select xh from cl_CPPF as b where b.xh=a.cxh)
drop table #tmp

非常简单吧,上述多级(无限级)配方的SQL代码也可为编写其它复杂BOM时参考。

这篇关于Mis多级配方处理的简洁方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_33941350/article/details/89694369
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/225131

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程