倾家荡产送分,关于相同记录的极难问题!(200分)

  • 主题发起人 主题发起人 e518
  • 开始时间 开始时间
E

e518

Unregistered / Unconfirmed
GUEST, unregistred user!
设数据库有两个integer字段:A1,A2,数据如下

A1 A2
1 10
5 2
1 3
8 6
1 4
5 2
. .
. .

要求:1、输出A1*A2的表达式,如果A1重复,即要合并,如上例,输入表达式应为

1*(10+3+4)
5*(2+2)
8* 6
...

2、上述表达式输出时是字符串,如何能算出其结果。

最好有实例, 在下不胜感激。

听说可用数组或TLIST实现,但在下不会。
 
可能真的太难了………………
 
select sum(a1*a2) from 表 group by a1
 
你 可以在后台写个过程,用游标循环比较就可以了
 
to PiPi兄:
非常多谢,我试过了,得出的结果完全正确,但SELECT生成的只是结果,并不能
找出该结果的表达式,请问皮兄,可也有类似的方法得出其表达式?


昨晚我想了一晚用动态数组的方法,我的意思是把该字段的所有记录动太加入一数组,
然后循环(用FOR语句),找到后把该值赋给另一临时变量,然后把该数组值删除,再继续循环,但问
题就是删除,因数组的值是不能删除的,所以只能用一小循环把下值相应上移,再用
Setlength函数把原数组缩小一位,此时又有一问题:即原来FOR的条件改变了,所以循
环时又出错。

请大家继续发言,不胜感激,
 
to poorness兄
我原来的想法也是这样,但我总搞不出来,能给个实例吗??
 
》要求:1、输出A1*A2的表达式,如果A1重复,即要合并,如上例,输入表达式应为
》 1*(10+3+4)

1.Query1.add(‘select a2 from 表 group by a1=A1’)
2。var str:string;i:integer;

str:='';
for i:=1 to Query1.RecordCount do
begin
if str='' then
str:=Query1.['a2']
else
str:=str+'+'+Query1.['a2'];
Query1.next;
end;
3. str='A1*'+'('+str+')';

得到的str就是你所要的表达式 其中的控制有可能还有bug 你自己调试了
 
如果需要得到表达式,那么只好 select a1,a2 from 表 order by a1 然后在客户端读出
每条纪录来生成了
 
var
strlst:TStringList;
old_a1,expr:string;
query.SQL.Text:='select a1,a2 from 表 order by a1 ';
query.Open;
strlst:=TStringList.Create;
while not query.Eof do
begin
if old_a1<>query.FieldByName('a1').AsString then
begin
if expr<>'' then
strlst.Add(expr+')');
old_a1:=query.FieldByName('a1').AsString;
expr:=old_a1+'*('+query.FieldByName('a2').AsString;
end
else
expr:=expr+ '+' +query.FieldByName('a2').AsString;
query.Next;
end;
if expr<>'' then
strlst.Add(expr+')');
ShowMessage(strlst.Text); //strlst保存了表达式
strlst.Free;
 
求值的sql 改为
select a1,sum(a1*a2) from 表 group by a1 order by 1
这样值可以与上面的对应
 
我把我的源程序贴出来,执行起来很慢,很慢…………
(5条记录,C850,128M,约1分钟,如果子100条,真不敢想象)

//计算每个项目的重复值,输入到OutReport2中*********
with DM.AQOutReport2 do begin
First;
while not eof do begin
Edit;
FieldByName('LN').AsString:='';
FieldByName('LNNum').AsFloat:=0;
Post;
Next;
end;
end;
for i:=1 to 24 do begin //1--24为玻璃之前,单位为支,实际共有86个字段
with DM.AQTemp1 do begin
SQL.Clear;
S:=format('select L%s as Lx,sum(N%s) as Nx from outreport1 group by L%s',[inttostr(i),inttostr(i),inttostr(i)]);
SQL.Add(s);
Active:=true;
while not eof do begin
n:=roundto(DM.AQTemp1.FieldValues['lx'],-2)*DM.AQTemp1.FieldValues['nx'];
if n>0 then begin
with DM.AQOutReport2 do begin
Locate('lnx',format('l%s',[inttostr(i)]),[]);
edit;
FieldByName('LN').AsString:=FieldByName('LN').AsString+' '+
floattostr(roundto(DM.AQTemp1.FieldValues['lx'],-2))+'*'+
floattostr(roundto(DM.AQTemp1.FieldValues['nx'],-2))+'支';
FieldByName('LNNum').AsFloat:=FieldByName('LNNum').AsFloat+n;
Post;
end;
end;
Next;
end;
end;
end;
{for i:=25 to 32 do begin //玻璃
//
end;
for i:=33 to 86 do begin //数量
//
end;}
//利用OutReport2的值,打印*************
Application.CreateForm(TFrmAlReport, FrmAlReport);
FrmAlReport.QuickRep1.Prepare;
TotalPage:=FrmAlReport.QuickRep1.QRPrinter.PageCount;
FrmAlReport.QuickRep1.Preview;
end;
 
问题是什么?
 
后退
顶部