由Delphi程序改写Sql(2000)的存储过程
各位前辈大家好,请帮我解决一个棘手的问题,我不会写SQL存储过程,目前一个Delphi程序执行非常的慢,想将其用SQL存储过程替代
请各位前辈帮忙,在线等
主要 资料表单有 MRPplan,MRPplantou (生产单资料表), mrpplanpsn(物料需求单资料表),bom(BOM 资料表) 四个,
其中关联字段为Psn(生产单号),materysn(物料编号)
从 MRPplan 中依据Psn查找资料进行循环,
a:如果mrpplanpsn 中有对应Psn的materysn则将MRPplan.planshu数量加到 mrpplanpsn.gr上
b:如果mrpplanpsn 中没有有对应Psn的materysn则将MRPplan中相关资料写入 mrpplanpsn
c:进行对MRPplan.materysn 资料进行BOM分解,若有子项则对子项进行以上动作
1: Select psn.materysn,planshu from MRPplan where psn=xxx (xxx 为传入参数),对应数据集为rsq1
If rsq1.RecordCount>0 then
Begin
For I:=1 To rsq1.RecordCount Do
Begin
fstr:=rsq1.materysn
Select * From mrpplanpsn where materysn=fstr and psn=xxx (xxx 为传入参数),对应数据集为rst1
If rst1.RecordCount>0 Then 将对应 rst1.gr=rst1.gr+rsq1.planshu
Else
Begin
rst1.Append //新写入对应内容
rst1.materysn=rsq1.materysn
rst1.gr=rsq1.planshu //数量
rst1.consigndate=rsq1.consigndate //交获日期
...
End;
进行BOM资料对应查找,rsq2.SQL.Add('select materysn from bom where fmaterysn=fstr)
If Rsq2.RecordCount Then SGmaterysn(Fstr;rsq1.planshu) 进行循环
Rsq2.Next
End //For I:=1 To rsq1.RecordCount Do
End;
SGmaterysn 过程如下:
select materysn,useshu from bom where fmaterysn=Fstr and useshu>0
n:=Rsq2.RecordCount
If n > 0 Then
Begin
For i:= 1 To n do
begin
Fstr=Rsq2.Materysn
planshu:=Rsq2.Materysn
select materysn,gr,fu,psn,consigndate,remark from mrpplanpsn where materysn=Rsq2.Materysn and psn=xxx
If rst2.RecordCount > 0 Then 则将对应 rst2.gr=rst2.gr+rsq2.planshu
Else
Begin
rst2.Append //新写入对应内容
rst2.materysn=rsq2.materysn
rst2.gr=rsq2.planshu
rst2.consigndate=rsq2.consigndate //交获日期
...
End;
进行BOM资料对应查找,rsq2.SQL.Add('select materysn from bom where fmaterysn=fstr)
If Rsq2.RecordCount >0 Then SGmaterysn(Fstr;planshu) 进行递归循环
SGmaterysn(Fstr;planshu);
rsq2.Next ;
end; //For i:= 1 To n do
end;//If n > 0 Then
------解决方案--------------------
declare @MRPplan table
(
layer int,
Psn varchar(100),
materysn varchar(100),
planshu decimal(8,2),
f_planshu int,
cdate datetime
)
--这里忘改了,改成这样
f_planshu decimal(8,2),