对不起,贴错地址了。
问题:
原表:
结构与数据如下:
编号 项目 型号 数量 金额 时间
002 1 1 12 12 2000-06-12 12:00:00
002 1 2 22 22 2000-06-12 12:00:00
002 1 3 30 30 2000-06-12 12:00:00
002 1 4 14 14 2000-06-12 12:00:00
002 2 1 25 25 2000-06-12 12:00:00
002 2 2 16 16 2000-06-12 12:00:00
002 2 3 27 27 2000-06-12 12:00:00
002 2 4 38 38 2000-06-12 12:00:00
002 3 1 49 49 2000-06-12 12:00:00
002 3 2 10 10 2000-06-12 12:00:00
002 3 3 11 11 2000-06-12 12:00:00
002 3 4 12 12 2000-06-12 12:00:00
003 1 1 12 12 2000-06-12 12:00:00
003 1 2 22 22 2000-06-12 12:00:00
003 1 3 30 30 2000-06-12 12:00:00
003 1 4 14 14 2000-06-12 12:00:00
003 2 1 25 25 2000-06-12 12:00:00
003 2 2 16 16 2000-06-12 12:00:00
003 2 3 27 27 2000-06-12 12:00:00
003 2 4 38 38 2000-06-12 12:00:00
003 3 1 49 49 2000-06-12 12:00:00
003 3 2 10 10 2000-06-12 12:00:00
003 3 3 11 11 2000-06-12 12:00:00
003 3 4 12 12 2000-06-12 12:00:00
目标表:
编号 项目 型号1 金额1 型号2 金额2 型号3 金额3 型号4 金额4
002 1 12 12 22 22 30 30 14 14
002 2 14 14 16 16 27 27 38 38
002 3 49 49 10 10 11 11 12 12
003 1 12 12 22 22 30 30 14 14
003 2 14 14 16 16 27 27 38 38
003 3 49 49 10 10 11 11 12 12
要求:如果原表中的无编号002、项目1、型号1等的记录,则对应的目标表中的型号1与金额1为null。
解决:
这段代码采用两个Query来实现。
第一个Query即源表的Query的sql语句为
"Select * from Source order by id,xm,xh"
var
lID,lXM: string;
begin
SourceQuery.Open;
SourceQuery.First;
if not SourceQuery.Eof then
begin
lID := SourceQuery.FieldByName('ID').AsString;
lXM := SourceQuery.FieldByName('XM').AsString;
DestQuery.Insert;
DestQuery.FieldByName('ID').AsString := lID;
DestQuery.FieldByName('XM').AsString := lXM;
while not SourceQuery.Eof do
begin
if (lID <> SourceQuery.FieldByName('ID').AsString) or
(lXM <> SourceQuery.FieldByName('XM').AsString) then
begin
DestQuery.Post;
DestQuery.Insert;
DestQuery.FieldByName('ID').AsString := SourceQuery.FieldByName('ID').AsString;
DestQuery.FieldByName('XM').AsString := SourceQuery.FieldByName('XM').AsString;
end;
case SourceQuery.FieldByName('XH').AsInteger of
1:
begin
DestQuery.FieldByName('XH1').AsInteger := SourceQuery.FieldByName('SL').AsInteger;
DestQuery.FieldByName('JE1').AsCurrency := SourceQuery.FieldByName('JE').AsInteger;
end;
2:
begin
DestQuery.FieldByName('XH2').AsInteger := SourceQuery.FieldByName('SL').AsInteger;
DestQuery.FieldByName('JE2').AsCurrency := SourceQuery.FieldByName('JE').AsInteger;
end;
3:
begin
DestQuery.FieldByName('XH3').AsInteger := SourceQuery.FieldByName('SL').AsInteger;
DestQuery.FieldByName('JE3').AsCurrency := SourceQuery.FieldByName('JE').AsInteger;
end;
4:
begin
DestQuery.FieldByName('XH4').AsInteger := SourceQuery.FieldByName('SL').AsInteger;
DestQuery.FieldByName('JE4').AsCurrency := SourceQuery.FieldByName('JE').AsInteger;
end;
end;
lID := SourceQuery.FieldByName('ID').AsString;
lXM := SourceQuery.FieldByName('XM').AsString;
SourceQuery.Next;
end;
DestQuery.Post;
end;
end;
问题
用QRport打印,由目标表的数据
由于目标表的值(纵队已定),横向动态是根据目标表中的值。
是不是对应报表为动态产生QRLabel,QRShape,并在QRLabel的打印事件中编程填入数据吗。如果是,那QRLabel,QRSape的位置不是很难对齐,并且在日后的维护当中不易修改(此方法不推荐使用,在没有办法的办法时使用),因为的我的报表格式是一个比较复杂的报表(报表幅面为A3)。