求解算法或帮帮忙写程序(50分)

  • 主题发起人 主题发起人 coao
  • 开始时间 开始时间
C

coao

Unregistered / Unconfirmed
GUEST, unregistred user!
原表:

结构与数据如下:

编号 项目 型号 数量 金额 时间
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。


 
根本没有看懂你的问题!
"如果原表中的无编号002、项目1、型号1等的记录,则对应的目标表中的型号1与金额1为null。"
到底如何解释?
 
目标表内预先填好各种情况的分类,并且初始值都为NULL,然后从原表向目标表灌数据,没灌上的就保持NULL初值。
 
看不懂你的问题!
 
他是要按‘编号+项目’分组,将‘型号,金额’汇总横向显示。
按‘UNION’关键字检索。
 
doud说的基本对的,问题就是这样。
to wint:
不能对目标表预先填值,因为目标表中的编号是不定的。
如果对目标表预先填值(即先填入相对应数目的记录),则所有数据为null,不行,因有关键字 编号+项目。
而且目标表中的记录个数为定数,就算源表中没有相对应编号为002、项目为1的所有记录,而目标表中也要有编号为002、项目为1的记录。

 


先创建表目标表:(Table2)

编号 项目 型号1 金额1 型号2 金额2 型号3 金额3 型号4 金额4


对表1的“部门”分别进行过滤

(如:过滤出“项目”=1 的记录。)
Table1.first; //(已过滤)
Table2.append;
while not Table1.eof do
begin
Table2.fieldByName('项目').AsString:=
Table1.fieldByName('项目').AsString ;
for I:=1 to Table1.RecordCount do
//从型号“1” 到 型号“Table1.RecordCount”
begin
Table2.fieldByName('型号'+IntToStr(I)).value:=
Table1.fieldByName('型号').value;

Table2.fieldByName('金额'+IntToStr(I)).value:=
Table1.fieldByName('金额').value;


end;

Table2.refresh;
Table1.next;
end;
//过滤下一个“项目”=2 的记录。

end;//end while


注:'型号'+IntToStr(I)是很有意思的一段
请好好研究一下。

以上代码基本上是我以前做一个“医院...系统”中将
“各科前十位疾病转横排后做报表打印”用到的一个技巧。

科别 病名 人数 科别 病名1 人数1 病名2 人数2 ..........
1 aaa 18 1 asd 29 aaa 18
1 asd 29 ==> 2 fgd 35
2 fgd 35
 
这段代码采用两个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;
 
>> doud:
你的union检索是什么意思,有例子吗?

》》谢谢黄耀彰、刘素杰的方法。
 
后退
顶部