您的位置:程序门 -> ms-sql server -> 疑难问题



机械类生产计划与bom生成物料相关需求的存储过程(向大家请教如何修改)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


机械类生产计划与bom生成物料相关需求的存储过程(向大家请教如何修改)[已结贴,结贴人:yufei0420]
发表于:2007-08-30 16:38:32 楼主
表结构(测试方案)
生产计划   scjh
scjh,   xsdd,cpbh,jhsl(生产计划,销售订单、产品编号,计划数量)
测试记录
(scjh083001,xsdd083001,cpbh000001,300.00)
产品结构bom
cpbh,gybh,wlbh,sl,shl(产品编号,工艺编号,物料/半成品编号,数量,损耗率)
测试记录
理想情况下认为对半成品的数量需求为1,损耗率为0
(cpbh000001,gybh000001,cpbh000002,1,0)
(cpbh000001,gybh000001,wlbh000001,3,0.02)
(cpbh000002,gybh000002,cpbh000003,1,0)
(cpbh000002,gybh000002,wlbh000002,4,0.02)
(cpbh000003,gybh000003,wlbh000003,4,0.02)

相关需求xgxq
scjh,xsdd,cpbh,wlbh   ,xqsl(生产计划,销售订单,产品编号,物料编号,需求数量)
产品、半成品命名规则一样,如cpbh000001,物料编号,wlbh000001


create   proc   p(@scbh   varchar(10),@xsdd   varchar(10),@cpbh   varchar(10),@jhsl   decimal(18,2))
as
declare   @cpbh1   varchar(10),@cpbh2   varchar(10),@sl   decimal(18,2),@shl   decimal(18,2)
declare   @wlbh   varchar(10)
@cpbh2   =   @cpbh
do
declare   cur   cursor   for
select   bom.cpbh,bom.wlbh,bom.sl,bom,shl
from   bom
where   bom.cpbh=@cpbh
open   cur
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
while     @@fetch_status=0  
begin
if   left(@wlbh,2)== 'wl '
begin
insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*@shl)
@cpbh=@wlbh
end
else
begin
@cpbh=@wlbh
end
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
end
close       cur      
deallocate       cur      
while   left(@cpbh,2)== 'cp '
go

错误:
服务器:   消息   170,级别   15,状态   1,过程   p,行   5
第   5   行:   '@cpbh2 '   附近有语法错误。
服务器:   消息   137,级别   15,状态   1,过程   p,行   12
必须声明变量   '@wlbh '。
服务器:   消息   137,级别   15,状态   1,过程   p,行   15
必须声明变量   '@wlbh '。
服务器:   消息   137,级别   15,状态   1,过程   p,行   17
必须声明变量   '@wlbh '。
服务器:   消息   137,级别   15,状态   1,过程   p,行   24
必须声明变量   '@wlbh '。
服务器:   消息   170,级别   15,状态   1,过程   p,行   28
第   28   行:   '= '   附近有语法错误。

请高手帮忙看看@wlbh变量我声明了,怎么出错呢
还有其他的错误请高手帮忙看看
发表于:2007-08-30 16:40:391楼 得分:0
@cpbh2   =   @cpbh

改為

set   @cpbh2   =   @cpbh
发表于:2007-08-30 16:44:002楼 得分:0
@wlbh  

是不是把字母 'l '   寫成數字 '1 '了

发表于:2007-08-30 16:45:343楼 得分:0
我猜想是這個原因,把定義的@wlbh復蓋下下面所有的@wlbh,再試試
发表于:2007-08-30 16:47:594楼 得分:0
create   proc   p(@scbh   varchar(10),@xsdd   varchar(10),@cpbh   varchar(10),@jhsl   decimal(18,2))
as
declare   @cpbh1   varchar(10),@cpbh2   varchar(10),@sl   decimal(18,2),@shl   decimal(18,2)
declare   @wlbh   varchar(10)
set   @cpbh2   =   @cpbh
do
declare   cur   cursor   for
select   bom.cpbh,bom.wlbh,bom.sl,bom,shl
from   bom
where   bom.cpbh=@cpbh
open   cur
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
while     @@fetch_status=0  
begin
if   left(@wlbh,2)== 'wl '
begin
insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*@shl)
@cpbh=@wlbh
end
else
begin
@cpbh=@wlbh
end
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
end
close       cur      
deallocate       cur      
while   left(@cpbh,2)== 'cp '
go
服务器:   消息   170,级别   15,状态   1,过程   p,行   6
第   6   行:   'do '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   15
第   15   行:   '= '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   18
第   18   行:   '@cpbh '   附近有语法错误。
服务器:   消息   156,级别   15,状态   1,过程   p,行   25
在关键字   'end '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   28
第   28   行:   '= '   附近有语法错误。


发表于:2007-08-30 16:48:445楼 得分:0
多谢回复的朋友们!:)
发表于:2007-08-30 16:50:246楼 得分:0
create   proc   p(@scbh   varchar(10),@xsdd   varchar(10),@cpbh   varchar(10),@jhsl   decimal(18,2))
as
declare   @cpbh1   varchar(10),@cpbh2   varchar(10),@sl   decimal(18,2),@shl   decimal(18,2)
declare   @wlbh   varchar(10)
set   @cpbh2   =   @cpbh
do
declare   cur   cursor   for
select   bom.cpbh,bom.wlbh,bom.sl,bom,shl
from   bom
where   bom.cpbh=@cpbh
open   cur
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
while     @@fetch_status=0  
begin
if   left(@wlbh,2)== 'wl '
begin
insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*(1+@shl))
@cpbh=@wlbh
end
else
begin
@cpbh=@wlbh
end
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
end
close       cur      
deallocate       cur      
while   left(@cpbh,2)== 'cp '
go

服务器:   消息   170,级别   15,状态   1,过程   p,行   6
第   6   行:   'do '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   15
第   15   行:   '= '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   18
第   18   行:   '@cpbh '   附近有语法错误。
服务器:   消息   156,级别   15,状态   1,过程   p,行   25
在关键字   'end '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   28
第   28   行:   '= '   附近有语法错误。
发表于:2007-08-30 16:57:077楼 得分:0
不要   do   ,在第六行
发表于:2007-08-30 16:57:368楼 得分:0
create   proc   p(@scbh   varchar(10),@xsdd   varchar(10),@cpbh   varchar(10),@jhsl   decimal(18,2))
as
declare   @cpbh1   varchar(10),@cpbh2   varchar(10),@sl   decimal(18,2),@shl   decimal(18,2)
declare   @wlbh   varchar(10)
set   @cpbh2   =   @cpbh
do
declare   cur   cursor   for
select   bom.cpbh,bom.wlbh,bom.sl,bom,shl
from   bom
where   bom.cpbh=@cpbh
open   cur
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
while     @@fetch_status=0  
begin
if   left(@wlbh,2)== 'wl '
begin
insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*(1+@shl))
set   @cpbh=@wlbh
end
else
begin
set   @cpbh=@wlbh
end
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
end
close       cur      
deallocate       cur      
while   left(@cpbh,2)== 'cp '
go
服务器:   消息   170,级别   15,状态   1,过程   p,行   6
第   6   行:   'do '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   15
第   15   行:   '= '   附近有语法错误。
服务器:   消息   156,级别   15,状态   1,过程   p,行   20
在关键字   'else '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   28
第   28   行:   '= '   附近有语法错误。

发表于:2007-08-30 17:01:209楼 得分:0
if   left(@wlbh,2)== 'wl '

改為
if   left(@wlbh,2)= 'wl '


insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*(1+@shl))
@cpbh=@wlbh
---------------
這句話這裡錯了,@cpbh=@wlbh是不是不要的,還是作為條件
发表于:2007-08-30 17:03:1810楼 得分:0
while   left(@cpbh,2)== 'cp '

--------
改為
while   left(@cpbh,2)= 'cp '
发表于:2007-08-30 17:06:4411楼 得分:0
create   proc   p(@scbh   varchar(10),@xsdd   varchar(10),@cpbh   varchar(10),@jhsl   decimal(18,2))
as
declare   @cpbh1   varchar(10),@cpbh2   varchar(10),@sl   decimal(18,2),@shl   decimal(18,2)
declare   @wlbh   varchar(10)
set   @cpbh2   =   @cpbh
do
declare   cur   cursor   for
select   bom.cpbh,bom.wlbh,bom.sl,bom,shl
from   bom
where   bom.cpbh=@cpbh
open   cur
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
while     @@fetch_status=0  
begin
if   left(@wlbh,2)= 'wl '
begin
insert   into   xgxq(scbh,xsdd,cpbh,wlbh,xqsl)   values   (@scbh,@xsdd,@cpbh2,@wlbh,@jhsl*@sl*(1+@shl))
set   @cpbh=@wlbh
end
else
begin
set   @cpbh=@wlbh
end
fetch       next       from       cur       into   @cpbh1,@wlbh,@sl,@shl
end
close       cur      
deallocate       cur      
while   left(@cpbh,2)= 'cp '
go

服务器:   消息   170,级别   15,状态   1,过程   p,行   6
第   6   行:   'do '   附近有语法错误。
服务器:   消息   170,级别   15,状态   1,过程   p,行   28
第   28   行:   'cp '   附近有语法错误。
发表于:2007-08-30 17:09:1412楼 得分:0
do  
改為   go     在第六行


while   left(@cpbh,2)= 'cp '這錯了
发表于:2007-08-30 17:10:1613楼 得分:0
while   left(@cpbh,2)= 'cp '

表示條件不能用while
发表于:2007-08-30 17:14:4214楼 得分:0
在bom表中查询有个循环的过程,所以我用   do       ....   while   left(@cpbh,2)= 'cp '
不知道这个结构用在这里对不对
发表于:2007-08-30 17:20:1415楼 得分:20
不行的,用while   ()循环,可以這樣寫

while  

....

if   left(@cpbh,2)= 'cp '
break

)
发表于:2007-08-30 17:20:5016楼 得分:0
在sql中不支持   do..while()
发表于:2007-08-30 17:33:5117楼 得分:0
哈!问题解决了,谢谢大家!


快速检索

最新资讯
热门点击