分享
 
 
 

一个自认为写得还可以的存储过程,就是没有注释,看起来有点乱。与ERP的BOM相关的

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

图示如下:

所使用数据库 : SQL Server 2000,数据表名:Te(乱七八糟命名的)

表结构:

varchar(20)

varchar(20)

decimal(20,4)

Assbom

point

sl

产成品

半成品1

2

产成品

半成品2

3

产成品

半成品3

2

半成品1

半成品4

2

半成品1

半成品5

2

半成品3

半成品5

3

最终需要输出结果

Assbom

point

sl

产成品

半成品2

3

产成品

半成品4

4

产成品

半成品5

13

即一单位产成品需要底级半成品的数量以及半成品的名称。比如说半成品4=1单位产成品*2单位半成品1*2单位半成品4。

存储过程如下:(呵呵,命名就别讲究了,我没有太过于留意)

create procedure GetBomTrueList

@AssBomName varchar(20),@pointName varchar(20),@expre varchar(500)

as

begin

declare @sl decimal(20,4)

declare @expression varchar(500)

declare @point varchar(20)

declare @bomTop varchar(20)

declare #point_cursor cursor LOCAL for

select distinct point,sl from te where Assbom = @pointName

open #point_cursor

fetch next from #point_cursor

into @point,@sl

while @@FETCH_STATUS = 0

begin

--如果没有下级节点了,就加入到数据表中

if(exists(select point from te where Assbom = @point))

begin

--如果有下级节点,则再次循环

select @expression = rtrim(@expre) + '*' + rtrim(convert(char(25),@sl))

exec('GetBomTrueList ' + @AssBomName + ',' + @point + ',"' + @expression + '"')

end

else

begin

insert into #bomTemp values (@AssBomName,@point,@sl,@expre + '*' + ltrim(rtrim(convert(char(25),@sl))))

end

fetch next from #point_cursor

into @point,@sl

end

close #point_cursor

deallocate #point_cursor

end

go

-------------------------------------------------------------------------------------------------------

create procedure GetBomList

as

begin

create table #bomTemp (Assbom varchar(20),point varchar(20),sl decimal(20,4),expression varchar(500))

create table #bomLast (Assbom varchar(20),point varchar(20),sl decimal(20,4))

--调用递归

declare @bomTop varchar(20)

declare bom_cursor cursor for

select distinct Assbom from te where Assbom not in (select point from te)

open bom_cursor

fetch next from bom_cursor

into @bomTop

while @@FETCH_STATUS = 0

begin

Exec('GetBomTrueList ' + @bomTop +','+@bomTop+','+'1')

fetch next from bom_cursor

into @bomTop

end

close bom_cursor

deallocate bom_cursor

--获得到数据及运算表达式后,再次利用数据表中的表达式运算一下

declare @AssbomT varchar(20)

declare @point varchar(20)

declare @expression varchar(500)

declare @value decimal(20,4)

declare @execUpdate varchar(500)

declare bom_cursor_end cursor for

select Assbom,point,expression from #bomTemp

open bom_cursor_end

fetch next from bom_cursor_end

into @AssbomT,@point,@expression

while @@FETCH_STATUS = 0

begin

set @execUpdate = 'Insert into #bomLast values(' + char(39) + rtrim(@AssbomT) + char(39) + ',' + char(39) + rtrim(@point) + char(39) + ',' + rtrim(@expression) + ')'

--set @execUpdate = 'update #bomTemp set sl = ' + rtrim(@expression) + ' where Assbom = ' + char(39) + rtrim(@AssbomT) + char(39) + ' and point = ' + char(39) + rtrim(@point) + char(39)

exec(@execUpdate)

fetch next from bom_cursor_end

into @AssbomT,@point,@expression

end

close bom_cursor_end

deallocate bom_cursor_end

select Assbom,point,sum(sl) as sl from #bomLast group by Assbom,point

drop table #bomTemp

drop table #bomLast

end

-------------------------------------------------------------------------

设计思路:

首先第一步就是得到顶级的产成品,由于在测试的表中有多个产成品,因此需要对顶级的产成品加一个游标,一行行处理。

得到一个产成品后,再去获取其下级的半成品,并且得到需要的半成品数量,将其数量先设成一个表达式,如1*3,如果半成品还有半成品,那只有对该半成品作同样的处理了,注意,这里面就传入了一个顶级的产成品,最终就可以得到顶级产成品到底级产成品的关系了,最终会获取一个表达式。

将所有的关系存入到数据表中后,需要再进一步处理,就是计算表达式,得到数值为多少。

由于原表设计时没有考虑到主键,因此使用Update语句可能会造成计算错误,没有什么好的办法,只有加入一个新的临时表,一行行往里面加入记录。

最后对新表执行一次group by操作,就是想要的结果了。

-------------------------------------------------------------------------------------

问题:

该存储过程在VB里面没有办法使用,不知道为什么,也不知道这是不是ADO的一个BUG,就是在Select * From 临时表时,recordset总是返回错误说什么对象关闭时不允许操作。碰到这样的问题也比较烦,因此我最终想出一个办法就是加入一个永久的表,表里面增加一个列为HostID,用HostID来标识操作者的机器,最终返回HostID相关的值。

但在C#里面测试一切正常。

------------------------------------------------------------------------------------

在设计过程中碰到的麻烦

1、游标问题:在第一个存储过程中有一个红色的标记Local,当时编写时没有加入该标识,总是提示游标已创建。加入后,问题解决。

2、表达式问题:在构建一个表达式后,需要进行计算,在SQL Server里面似乎没有公式可以计算表达式,然后再返回值的。最终不得不再加入一个游标来进行处理。

3、存储过程中执行存储过程的问题:很是奇怪,为什么不能直接写入存储过程的名称,而必须使用Exec?也是郁闷了许久。

-------------------------------------------------------------------------------------

相关的CSDN中的贴子链接

点击此处

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有