为什么只重复显示第一个记录??(100分)

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

callxuelin

Unregistered / Unconfirmed
GUEST, unregistred user!
我在TDataModule1.ADOQuery8创建永久字段,
其中有4个字段值由另外两个DataModule1.ADOQuery9、DataModule1.ADOQuery10
中的字段值赋值,程序开始运行顺序是
DataModule1.ADOQuery9.ExecSQL
DataModule1.ADOQuery10.ExecSQL
DataModule1.ADOQuery8.ExecSQL

procedure TDataModule1.ADOQuery8CalcFields(DataSet: TDataSet);
begin
with DataModule1.ADOQuery8 do
begin
Fields[16].Value :=Fields[0].Value +Fields[1].Value;

Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
Fields[19].Value :=DataModule1.ADOQuery10.Fields[0].Value;
Fields[20].Value :=DataModule1.ADOQuery10.Fields[1].Value;

end;
end;

现通过DBGrid显示字段值,对查出的5个符合条件记录中
DataModule1.ADOQuery8的原始字段显示没问题,
唯独4个关联字段成为5个相同的记录,且为第一个记录值
整个DBGrid变成前面字段没错,而后面字段相同而得不到预期的值,
不知是 Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
出问题还是别的,请指点。
 
你的adoquery9,adoquery10没有移动记录,始终在第一条记录上。
 
该如何控制?

Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
DataModule1.ADOQuery9.next;
Fields[19].Value :=DataModule1.ADOQuery10.Fields[0].Value;
Fields[20].Value :=DataModule1.ADOQuery10.Fields[1].Value;
DataModule1.ADOQuery10.next;

得出的结果符合要求,但当移动DBGrig的下拉条时,记录发生改变,
拉一个,变一个,最后都变成最后一个记录
怎么回事??
 
这是非常难控制的。

最好的办法是在sql语句中就把adoquery9中的字段包含进来(可以不显示),计算字段
本来就适合本表计算。
 
对应不过来,
一个交直流数据对应两个电池组的状态,而且两个电池组的结构一样,
由PileNum控制相应的数据信息,
同时adoquery8中的头几个字段需由电池组的状态信息反馈字段的取值,
为何加了个adoquery9.next 和adoquery10.next 未移动下拉条时显示结果
是对的,而且对应关系也是对的,能不能设置下拉条事件激发时,
ADOQUERY中指针不改变,而只改变DBGrid中的记录指针?
 
procedure TDataModule1.ADOQuery8CalcFields(DataSet: TDataSet);
begin
with DataModule1.ADOQuery8 do
begin
Fields[16].Value :=Fields[0].Value +Fields[1].Value;
if adoquery9.locate...... //先找到adoquery9中对应的记录
then
begin
Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
end;
end;
end;

用adoquery9.next方法是极不可靠的。
 
这个确实比较难控制,当移动DBGrig的下拉条时
触发了ADOQuery8CalcFields,所以adoquery9,adoquery10又next了,
所以记录就变了。
提供一个方法,把adoquery9,adoquery10的某些字段包含进
adoquery8的sql语句中去,这样就可以用当前adoquery8的记录
来定位adoquery9,adoquery10中的记录,就不会发生那种乱动的错误了
相应的语句为:
//其中数据
if DataModule1.ADOQuery9.locate('字段名',Fields[字段].Value,[]) then
begin
Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
end;
if DataModule1.ADOQuery9.locate('字段名',Fields[字段].Value,[]) then
begin
Fields[19].Value :=DataModule1.ADOQuery10.Fields[0].Value;
Fields[20].Value :=DataModule1.ADOQuery10.Fields[1].Value;
end;
 
在ADOQuery8中增加查找字段。到9、10中去查找。
 
代码更改如下:
if DataModule1.ADOQuery9.Locate('BV',DataModule1.ADOQuery8.Fields[17].Value,[]) then
if DataModule1.ADOQuery9.Locate('BI',DataModule1.ADOQuery8.Fields[18].Value,[]) then
begin
Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
end;
// DataModule1.ADOQuery9.Next ;
if DataModule1.ADOQuery10.Locate('BV',DataModule1.ADOQuery8.Fields[19].Value,[]) then
if DataModule1.ADOQuery10.Locate('BI',DataModule1.ADOQuery8.Fields[20].Value,[]) then
begin
Fields[19].Value :=DataModule1.ADOQuery10.Fields[0].Value;
Fields[20].Value :=DataModule1.ADOQuery10.Fields[1].Value;
end;
// DataModule1.ADOQuery10.Next ;
不过结果还是停留在第一个记录上,其中Fields[17].Value 对应DataModule1.ADOQuery8
中的BV_1字段,Fields[18].Value ->BI_1字段,其他类推
 
locate语句写法有问题

v1:=DataModule1.ADOQuery8.Fields[17].asstring; //字符类型,不能用value
v2:=DataModule1.ADOQuery8.Fields[18].asinteger; //integer类型,其它类型用相应语句
if locate('bv;bi',vararrayof([v1,v2]),[loPartialKey]) then
begin
.....
end;
 
Fields[17]->BV_1,Fields[18]->BI_1本身就设计成String型,
 
Fields[字段].Value是不是指的DataModule1.ADOQuery8中的字段,
代码能再详细点好吗?
 
Fields[字段].Value是指DataModule1.ADOQuery8中的字段,但是这是为了
在adoquery9,adoquery10定位特别在adoquery8中增加的字段,实际上是
adoquery9,adoquery10的值,因此你adoquery8的sql可能要重新写过。
而且你的代码肯定不对,adoquery9,adoquery10肯定不能用相同的字段来定位
(除非他们他们有相同的字段和相同的值)
 
最重要的是adoquery8,adoquery9,adoquery10到底
依靠什么来关联?
 
adoquery9,adoquery10具有相同的字段,
而adoquery8,adoquery9,adoquery10三表通过共有的
UserNum,DateTimeNum,Time字段相关联且形成同步,
 
源代码:
代码:
with DataModule1.ADOQuery9 do
begin
Close ;
SQL.Clear ;
SQL.Add('Select BV,BI,RSB,PileStatus');
SQL.Add ('From t_acswitchdata s1,t_dcswitchdata s2,t_pilestatus s3');
SQL.Add('Where s1.UserNum=s2.UserNum and s2.UserNum=s3.UserNum and PileNum='+'''1''');
SQL.Add('and s1.DateTimeNum=s2.DateTimeNum and s2.DateTimeNum=s3.DateTimeNum ');
SQL.Add('and s1.Time=s2.Time and s2.Time=s3.Time ');
SQL.Add('and Exists (select s3.UserNum, UserName from t_userinfo s4 ');
SQL.Add('Where s3.Usernum=s4.UserNum and UserName='+QuotedStr(ComboBox1.Text)+')');
//***ShowMessage(SQL.Text);***
Prepared:=True;
Open;
ExecSQL;
end;

with DataModule1.ADOQuery10 do
begin
Close ;
SQL.Clear ;
SQL.Add('Select BV,BI,RSB,PileStatus');
SQL.Add ('From t_acswitchdata s1,t_dcswitchdata s2,t_pilestatus s3');
SQL.Add('Where s1.UserNum=s2.UserNum and s2.UserNum=s3.UserNum and PileNum='+'''2''');
SQL.Add('and s1.DateTimeNum=s2.DateTimeNum and s2.DateTimeNum=s3.DateTimeNum ');
SQL.Add('and s1.Time=s2.Time and s2.Time=s3.Time ');
SQL.Add('and Exists (select s3.UserNum, UserName from t_userinfo s4 ');
SQL.Add('Where s3.Usernum=s4.UserNum and UserName='+QuotedStr(ComboBox1.Text)+')');
//***ShowMessage(SQL.Text);***
Prepared:=True;
Open;
ExecSQL;
//**ShowMessage(IntToStr(recordcount));
end;

with DataModule1.ADOQuery8 do
begin
Close ;
SQL.Clear ;
SQL.Add('Select Distinct(s3.Time),s1.DateTimeNum,'); //消除重复的行值 Distinct的位置
SQL.Add('VA,VB,VC,IA,DvOut,DiOut,');
SQL.Add('FanStatus,LoadStatus,Lamp,ExamStatus');
SQL.Add ('From t_acswitchdata s1,t_dcswitchdata s2,t_pilestatus s3');
SQL.Add('Where s1.UserNum=s2.UserNum and s2.UserNum=s3.UserNum');
SQL.Add('and s1.DateTimeNum=s2.DateTimeNum and s2.DateTimeNum=s3.DateTimeNum ');
SQL.Add(' and s1.Time=s2.Time and s2.Time=s3.Time ');
SQL.Add('and Exists (select s1.UserNum, UserName from t_userinfo s4 ');
SQL.Add('Where s1.Usernum=s4.UserNum and UserName='+QuotedStr(ComboBox1.Text)+')');
//***ShowMessage(SQL.Text);***
Prepared:=True;
Open;
ExecSQL;
//**ShowMessage(IntToStr(recordcount)+'!');
end;
Fields[17].Value 对应DataModule1.ADOQuery8
中的BV_1字段,Fields[18].Value ->BI_1字段,其他类推
 
帮忙看看SQL代码和原先的功能要求有冲突没有?
 
不用这么复杂吧,这样太浪费了!
既然adoquery8,adoquery9,adoquery10三表通过共有的
UserNum,DateTimeNum,Time字段相关联且形成同步那这个问题就
简单了,还是用语句,就是定位的语句换一下:
var
s1,s2,s3:String;//类型对不对?
begin
s1:=DataModule1.ADOQuery8('UserNum').asstring;
s2:=DataModule1.ADOQuery8('DateTimeNum').asstring;
s3:=DataModule1.ADOQuery8('Time').asstring;

if DataModule1.ADOQuery9.locate('UserNum;DateTimeNum;Time',
vararrayof([s1,s2,s3]),[]) then
begin
Fields[17].Value :=DataModule1.ADOQuery9.Fields[0].Value;
Fields[18].Value :=DataModule1.ADOQuery9.Fields[1].Value;
end;
if DataModule1.ADOQuery10.locate('UserNum;DateTimeNum;Time',
vararrayof([s1,s2,s3]),[]) then
begin
Fields[19].Value :=DataModule1.ADOQuery10.Fields[0].Value;
Fields[20].Value :=DataModule1.ADOQuery10.Fields[1].Value;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
987
SUNSTONE的Delphi笔记
S
S
回复
0
查看
805
SUNSTONE的Delphi笔记
S
D
回复
0
查看
630
DelphiTeacher的专栏
D
顶部