如何实现递归并将结果存入数据库
我现在需要计算一系统产品的生产成本:
数据库:access 2007
数据表:t_test
字段说明:
ID:自动编号
FType:产品型号
FNumber:生产中工序编号(不同型号产品生产过程中所需要的工序不同,有些需要4道工序,有的只要3道工序……)
FYield:各工序生产过程中的良率
FCost:各工序生产成本
FTotalCost:累积成本A[n](公式:A[n+1]=A[n]/FYield[n+1]+FCost[n+1]))
FNote:备注,说明FTotalCost的期望结果
问题:怎么实现累积成本这个公式,执行完得到FTotalCost这一列期望结果
数据表格式如下:
看看图片能不能传上来:
如果图片不行:
请看这个表:
//ID FType FNumber FYield FCost FTotalCost FNote//1 A 1 .99 98 FTotalCost期望结果:98//2 A 2 .98 200 FTotalCost期望结果:98/0.98+200=300//3 A 3 .97 300 FTotalCost期望结果:300/0.97+300=609.28//4 A 4 .96 400 FTotalCost期望结果:609.28/0.96+400=1034.67//5 B 1 .99 100 FTotalCost期望结果:100//6 B 2 .98 200 FTotalCost期望结果:100/0.98+200=302.04//7 B 3 .97 300 FTotalCost期望结果:302.04/0.97+300=611.38//8 C 1 .99 100 FTotalCost期望结果:100//9 C 2 .98 200 FTotalCost期望结果:100/0.98+200=302.04
哦,仔细看了一下,你这个不必递归可以程序循环执行for i:=1 to 4 do runsqlbylevel(i);prcedure runsqlbylevel(i);if i=1 then执行:'update t_test set FTotalCost=FCost where FNumber='+inttostr(i)else执行:'update t_test set FTotalCost=FCost+(select FYield*FCost from t_test where id=外部id-) where FNumber='+inttostr(i)--这个 外部id,不知道access怎么传进去,sqlserver的update可以有from
[解决办法]
csdn又抽风了,我晕
比如说 身边没环境,随手写个概念公式
定义一个result:=0;
rtype:=‘’;
for 循环你的adoquery do
begin
if (rtype=ftype)
begin
result:=result/fyield+fcose;
end
else
begin
result:=fcost;
rtype:=ftype
end;
然后这里用id和result更新你的数据
end;
[解决办法]
function CalculateTotalCost(ADOQuery:TADOQuery):bool;var iFType,s:string; pFTotalCost:double; ErrCount:integer; CDSet:TClientDataSet; DSP:TDataSetProvider;begin Result:=false; if not ADOQuery.Active then exit; CDSet:=TClientDataSet.Create(nil); DSP:=TDataSetProvider.Create(nil); try ADOQuery.First; DSP.DataSet:=ADOQuery; CDSet.SetProvider(DSP); CDSet.Open; pFTotalCost:=0; CDSet.First; while not CDSet.Eof do begin if iFType<>CDSet.FieldByName('FType').AsString then begin iFType:=CDSet.FieldByName('FType').AsString; CDSet.Edit; CDSet.FieldByName('FTotalCost').AsVariant:= CDSet.FieldByName('FCost').AsInteger; CDSet.Post; end else begin s:=Format('%f',[pFTotalCost / CDSet.FieldByName('FYield').AsFloat + CDSet.FieldByName('FCost').AsInteger]); CDSet.Edit; CDSet.FieldByName('FTotalCost').AsFloat:=strtofloat(s); CDSet.Post; end; pFTotalCost:=CDSet.FieldByName('FTotalCost').AsInteger; CDSet.Next; end; if CDSet.ChangeCount>0 then begin DSP.ApplyUpdates(CDSet.Delta,0,ErrCount); Result:=true; end; finally CDSet.Free; DSP.Free; end;end;procedure TForm1.Button1Click(Sender: TObject);begin if CalculateTotalCost(ADOQuery1)then showmessage('成本核算完成。')//ADOQuery1是你的查询数据集 else showmessage('成本核算失败。');end;