数据库相关的简单问题!!!!!!!!!!!!!!!!!!!!!!!!!!(50分)

  • 主题发起人 主题发起人 txyx
  • 开始时间 开始时间
T

txyx

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个表table,有3个字段:日期,班次,数据.(一天有早,中,晚3班,数据为整型)
var tem:integer;
while not Table.Eof do
begin
if Table.Locate('日期',editdate.Text,[loCaseInsensitive])
then
begin
tem:=tem+Table.FieldValues['数据'];
Table.Next;
end;
end;
showmessage(inttostr(tem));
这样编译通过了,可是运行就死了.我已经定义了"日期"为可以重复的索引!
 
你的Next和Locate会出现死循环,使Table一直不能到达Eof。
 
能分析一下吗???
 
var tem:integer;
while not Table.Eof do
begin
if Table.Locate('日期',editdate.Text,[loCaseInsensitive]) then
begin
tem:=tem+Table.FieldValues['数据'];
end;
Table.Next; //写这里
end;
showmessage(inttostr(tem));
 
203010的做法是对的,
顺序换进来就OK
 
这样还是会死的
 
var tem:integer;
while not Table.Eof do
begin
if Table.fieldbyname('日期').asstring=editdata.text then //Locate('日期',editdate.Text,[loCaseInsensitive]) then
begin
tem:=tem+Table.FieldValues['数据'];
end;
Table.Next; //写这里
end;
showmessage(inttostr(tem));

因为Locate总是从第一条记录开始找。
或者是Locate到一条记录后,用一条类似Continue的语句(忘了具体的函数名)
 
你看一下李维的ADO+MTS+DOCM的书吧,重点是看CURSOR,我觉得你对CURSOR不了解。
 
哦,我才弄明白,你是要把日期相同的数据加起来
你过滤一下不就完了,何必Locate
var tem:integer;
with Table do
begin
Filter := '日期 = ' + Editdate.Text;
Filtered := True;
First;
whlie not EOF do
begin
tem:=tem+Table.FieldValues['数据'];
Next;
end;
Filtered := False;
end;
showmessage(inttostr(tem));
 
to wueng
哪里有李维的ADO+MTS+DOCM的书,不胜感激!!!!!!!!
 
我想因该是,当执行Table.Locate(...)后表的指针有回到了表的首纪录,
这样当Table.next 后又被table.Locate打回首纪录,故就成了死循环.

可以试一下在Table.Locate之前用标签BookMark保存纪录指针位置,Table.Locate完后
将指针恢复,再Table.next;
 
同意GBlueMan的观点
用SQL也很方便直观
select 日期,sum(数据) from 数据库 where 日期='日期' group by 日期
 
locate是永远都在table中从头到尾的查找(可以说是在内存中查找),
而不管你的指针己到何处,你可以试一下,如果你的表中有几个相同的记录
如果你用locate这几条相同的记录后,他会找到第一条匹配的,再locate时
仍然是第一条匹配的,不用说了你应该明白了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
758
SUNSTONE的Delphi笔记
S
后退
顶部