CREATE procedure test107 @mtlno varchar(40),@flag bit=1
as
declare @materialbill varchar(8),--物料单号
@alternativebom varchar(2),--物料替代号
@configuration varchar(18), --物料对象号
@bomcomponent varchar(40),
@quantity NUMERIC(16,6),
@classtype varchar(3),
@isConfFlag varchar(1),
@count int
--判断是否需要创建临时表
--这个临时表用于存储结果数据
if(@flag=1)
create table #result (bomcomponent varchar(40),quantity NUMERIC(16,6),classtype varchar(3),isselect varchar(1),isvirtual varchar(1));
--主物料对象号,主物料单号,主物料替代
select top 1 @materialbill=a.materialbill,@alternativebom=a.alternativebom,@configuration=b.configuration
from N_BDMMaterToBOMLink a,(
select top 1 configuralbemtl ,configuration
from N_MMRPLANTMTL
where mtlno=@mtlno) b
where a.mtlno=b.configuralbemtl
--select @materialbill ,@alternativebom ,@configuration ;
--判断物料单号是否为空
if(@materialbill is not null)
begin
--判断物料单号是否被删除
if (select bomsdeletionindic from N_bdmbomheader where materialbill=@materialbill and alternativebom=@alternativebom ) ='Y'
begin
--删除
goto labelend;
end
else
begin
--未被删除
--创建临时表 用于临时存储数据
create table #thisbomlist (bomcomponent varchar(40),quantity NUMERIC(16,6),classtype varchar(3),isselect varchar(1),isvirtual varchar(1),speprocuretypefbomitem varchar(2));
--向临时表插入数据
insert into #thisbomlist(bomcomponent,quantity,classtype,speprocuretypefbomitem)
(
select bomcomponent,quantity,classtype,speprocuretypefbomitem
from N_BDMBOMITEM where bomitemnodeno in
(select bomitemnodeno
from N_BDMBOMSITEMSELECT where materialbill= @materialbill and alternativebom = @alternativebom)
and materialbill = @materialbill
)
--select * from #thisbomlist;
--选装件处理
--创建临时表 临时存储特性信息
create table #tmp (characterval varchar(30),intcharact varchar(10),signnumindic varchar(12));
insert into #tmp(characterval,intcharact,signnumindic)
(
select
charactvalue,intcharact,numberindic
from
N_pcmibsymbol
where
numberindic in
(
select
signnumindic
from
N_pcmexamchartrestrain
where
internalCfg = @configuration
)
)
--select * from #tmp;
--select * from #thisbomlist;
declare cur cursor for
select bomcomponent,classtype from #thisbomlist where classType is not null
open cur
fetch next from cur into @bomcomponent,@classtype
--
while @@fetch_status = 0
begin
--判断该物料是否可以复选
if((select top 1 multipleObjAllowed from n_pcmclasstypes where classType=@classType) <>'Y')
begin
delete #thisbomlist WHERE CURRENT OF cur
fetch next from cur into @bomcomponent,@classtype
continue
end
select top 1 @bomcomponent = configuration from n_PCMLinkBeInterNumAndObj where keyobjclassified=@bomcomponent
--判断该物料是否是下达状态
if(exists (select top 1 classreleaseindi
from n_pcmclassificastatus
where classificastatus in (
select distinct classificastatus
from n_pcmallocatableobjtoclass
where keyobjclassified=@bomcomponent and classType = @classtype
)
and classType = @classtype and classreleaseindi <> 'Y')
)
begin
delete #thisbomlist WHERE CURRENT OF cur
fetch next from cur into @bomcomponent,@classtype
continue
end
--判断是否存在与原特性值相匹配的值
if(exists(select top 1 a.* from
(select intcharact,characterval from N_PCMCharacterVal
where keyobjclassified =@configuration and internalclassno in
(select internalclassno from N_pcmallocatableobjtoclass
where keyobjclassified=@configuration and classType =@classtype)
) a ,#tmp b
where a.intcharact=b.intcharact and a.characterval = b.characterval)
)
begin
fetch next from cur into @bomcomponent,@classtype
continue
end
delete #thisbomlist WHERE CURRENT OF cur
fetch next from cur into @bomcomponent,@classtype
end
close cur
deallocate cur
--select * from #thisbomlist;
--虚拟件处理
--判断是否是虚拟件
DECLARE cur2 CURSOR FOR
select a.bomcomponent,a.quantity,a.classtype from
(
select bomcomponent,quantity,classtype,speprocuretypefbomitem from #thisbomlist where speprocuretypefbomitem <>'' or speprocuretypefbomitem is not null
union
select a.bomcomponent,a.quantity,a.classtype,bb.specprocuretype as speprocuretypefbomitem from #thisbomlist a
join N_MMRPLANTMTL bb on a.bomcomponent=bb.mtlno
where (bb.specprocuretype <>'' or bb.specprocuretype is not null)
) a
,N_BDMSpecProcureKey b where b.specprocuretype=a.speprocuretypefbomitem
and b.phantomitemindic='Y'
Open cur2
FETCH NEXT FROM cur2 into @bomcomponent,@quantity,@classtype
WHILE @@FETCH_STATUS = 0
BEGIN
--select @bomcomponent;
if(@classtype is not null)
begin
insert into #result (bomcomponent,quantity,classtype,isselect,isvirtual) values (@bomcomponent,@quantity,@classtype,'Y','Y')
delete from #thisbomlist where bomcomponent = @bomcomponent;
--虚拟件展开
exec test107 @bomcomponent, 0
end
else
begin
insert into #result (bomcomponent,quantity ,classtype,isselect,isvirtual) values (@bomcomponent,@quantity,@classtype,'N','Y')
delete from #thisbomlist where bomcomponent = @bomcomponent;
--虚拟件展开
exec test107 @bomcomponent, 0
end
FETCH NEXT FROM cur2 into @bomcomponent,@quantity,@classtype
END
CLOSE cur2
DEALLOCATE cur2
DECLARE cur3 CURSOR FOR
select #thisbomlist.bomcomponent from #thisbomlist
Open cur3
FETCH NEXT FROM cur3 into @bomcomponent
WHILE @@FETCH_STATUS = 0
BEGIN
set @isConfFlag = (
select top 1 N_MMRGenMtl.isConfFlag
from N_MMRGenMtl where N_MMRGenMtl.mtlno=@bomcomponent
)
if(@isConfFlag ='Y')
begin
set @count = 0
declare cur4 cursor for
select configuration from n_MMRPLANTMTL where configuralbeMtl=@bomcomponent
open cur4
fetch next from cur4 into @configuration
while @@fetch_status = 0
begin
if(exists (select signnumindic from #tmp where signnumindic in
(select signnumindic from n_PCMEXAMCHARTRESTRAIN where internalcfg=@configuration))
)
begin
if(@count = 1)
begin
set @count=0
break
end
set @count = 1
set @bomcomponent = @configuration
end
fetch next from cur4 into @configuration
end
close cur4
deallocate cur4
--set @count = (select count(*) from (
-- select distinct a.internalcfg from
-- (
-- select internalcfg,signnumindic from N_PCMEXAMCHARTRESTRAIN
-- where internalcfg in (select configuration from N_MMRPLANTMTL where configuralbeMtl=@bomcomponent) and signnumindic in (select signnumindic from #tmp)
-- ) a
-- ) b
-- )
--select @bomcomponent
if(@count=1)
begin
set @bomcomponent =(select top 1 mtlno from n_MMRPLANTMTL where configuration=@bomcomponent)
-- (
--select top 1 mtlno from N_MMRPLANTMTL where configuration = (select top 1 internalcfg from N_PCMEXAMCHARTRESTRAIN
-- where internalcfg in (select configuration from N_MMRPLANTMTL where configuralbeMtl=@bomcomponent) and signnumindic in (select signnumindic from #tmp)
-- )
--)
UPDATE #thisbomlist SET bomcomponent = @bomcomponent WHERE CURRENT OF cur3
end
end
FETCH NEXT FROM cur3 into @bomcomponent
END
CLOSE cur3
DEALLOCATE cur3
insert into #result(bomcomponent,quantity,classtype,isselect,isvirtual)
(
select bomcomponent,quantity,classtype,(case when isselect is not null then 'Y' else 'N' end) isselect,isvirtual
from #thisbomlist
)
--select * from #thisbomlist left join N_MMRGenMtl on N_MMRGenMtl.mtlno = #thisbomlist.bomcomponent
--select * from #thisbomlist;
drop table #tmp;
drop table #thisbomlist;
end
end
--删除临时表
--select * from #thisbomlist;
--select * from #tmp;
labelend:
--判断是否需要查询和删除临时表
if(@flag=1)
begin
select * from #result;
drop table #result;
end
GO
不知道有没有可以优化的空间
先将就用着
分享到:
相关推荐
递归调用的存储过程是指该存储过程在其执行过程中会调用自身,形成一种自相似的结构,通常用于处理层次数据或者实现特定的算法。在给定的标题“一个递归调用的存储过程”中,我们可以推测这个存储过程利用了递归机制...
2. **递归步**:递归过程中的核心部分,通过与递归基连接的方式逐步扩展结果集。 3. **连接条件**:用于确定递归步中如何与递归基进行关联,通常是根据父节点与子节点的关系进行匹配。 #### 六、递归查询的应用场景...
包括两个存储过程,一个是建立临时表用来存储需要的数据,另一个利用临时表进行操作。
本文将详细解析一个具体的递归查询存储过程示例,并探讨其工作原理。 #### 二、递归查询存储过程示例分析 ##### 1. 存储过程定义 给定的存储过程名为`proc_wx_getuserlist`,它接收两个参数:`@nodeid`和`@uid`。...
程序员还必须确保递归函数不会随意改变静态变量和全局变量的值,以避免在递归下降过程中的上层函数出错。 递归调用可以解决许多问题,如求和、阶乘、斐波那契数列等。例如,求 1+2+⋯ ⋯ +100 的和,可以使用递归...
本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。
在上面的存储过程中,我们定义了一个游标`cur`来遍历当前层级的所有子分类,并通过递归调用`generate_tree`处理每个子分类的子分类,直到所有子节点都被访问到。这样,我们就能生成整个分类树,而无需实际执行递归...
以阶层为例子说存储过程中递归的调用。 递归 CREATE PROC [dbo].[usp_spFactorial] @InputValue INT, @OuputValue INT OUTPUT AS BEGIN DECLARE @InValue INT; DECLARE @OutValue INT; IF(@InputValue!=1) ...
在每次循环迭代过程中,还会调用`AddReplies`方法来添加子节点。这个过程是递归的,因为它不断地调用自身来构建树的层次结构。 #### AddReplies() 方法 `AddReplies()` 方法负责向给定的父节点添加子节点。方法首先...
### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business ...通过上述分析,我们不仅了解了递归算法的工作机制,也熟悉了ABAP中递归函数的实现方法,这对于进一步学习和应用ABAP编程具有重要意义。
在Java编程语言中,递归是一种强大的编程技术,它指的是函数或方法调用自身的过程。递归可以帮助我们解决复杂的问题,通过将大问题分解为更小的子问题来简化问题解决。本文将深入探讨Java中递归的概念、工作原理、优...
在编程领域,递归是一种强大的概念,它在VB6.0中同样得到了广泛的应用。递归调用是指在执行一个过程或函数时,该过程或函数又在其内部直接或间接地调用自身。这种调用方式可以解决某些复杂问题,如树遍历、分治策略...
非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。 非递归算法的特点: 1. 非递归算法是采用循环或者栈的方式来实现。 2. 递归算法递归越深,占用栈空间也...
函数递归调用堆栈分析是指在计算机科学中,函数递归调用时,函数调用自身的过程中,如何使用堆栈来存储变量和参数的过程。堆栈是一种 lasts-in-first-out(LIFO)的数据结构,用于存储函数调用的参数和变量。 在...
如果在递归调用过程中试图创建同名的游标,就会因为作用域问题导致失败。为了解决这个问题,可以将游标的作用域更改为局部,或者在存储过程的游标声明语句中添加LOCAL关键字,这样每个递归层级的调用都会创建一个...
在计算机科学中,二叉树广泛应用于算法设计、数据存储和检索等领域。二叉树的遍历是对其进行操作的基本步骤之一,用于访问树中的所有节点。 ### 递归遍历方法 #### 前序遍历 前序遍历是指首先访问根节点,然后递归...
在非递归的深度优先搜索(DFS)中,我们使用链式栈来模拟递归调用的过程。当遇到一个可通行的节点时,我们将该节点压入栈中,并标记为已访问,然后移动到其相邻的未访问节点。如果所有相邻节点都无法通行或者已被...
7. **动态规划与记忆化**:为了优化递归算法,可以采用动态规划的思想,将已经计算过的子问题结果存储起来,避免重复计算,这种方法称为记忆化搜索。 8. **递归与分治策略**:递归往往是分治算法的实现方式,如快速...