当前位置:主页>仓库管理软件> 列表

怎样做到当光标在DBGrid中不同记录之间移动时,对应的数

记账软件版1楼: 我直接用:
ADOQuery1.RecNo :=dbgrid1.SelectedRows; 提示: Incompatible types: ''Integer'' and ''TBookmarkList''

dbgrid1.SelectedRows :=ADOQuery1.RecNo;提示: Cannot assign to a read-only property

请问:怎样解决这个问题???

2楼: 哈哈,你什么都不用做,当光标在DBGrid中不同记录之间移动时,对应的数据表Table1中的记录指针本身就是跟着相应移动的. 如进销存财务管理软件

3楼: 楼主还没理解DBGRID是怎么一回事吧?dbgrid是数据感知控件,里面指针指向哪里,table自然就指在哪里,你就直接取table里的值就可以了。

4楼: “dbgrid是数据感知控件,里面指针指向哪里,table自然就指在哪里,你就直接取table里的值就可以了。”

既然是这样,那么当我用光标在DBGrid中移动到某一条记录时,点击“修改”按钮后,要修改的值为什么反映不到数据表中呢?

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''select * from Tech_Equipment'';
ADOQuery1.Open;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+QuotedStr(Trim(Edit1.Text))+'',Str_Name=''+QuotedStr(TRim(Edit2.Text));//+'' Where Int_Id=''+QuotedStr(inttostr(ADOQuery1.RecNo));
ADOQuery1.ExecSQL;

不加上'' Where Int_Id=''+QuotedStr(inttostr(ADOQuery1.RecNo))'',总提示:违反了Primary Key约束。不能在对象''Tech_Equipment''中插入重复键-----------我仔细检查过了,明明是要插入的值与主键不重复呀!

如果,加上'' Where Int_Id=''+QuotedStr(inttostr(ADOQuery1.RecNo))'',又往往修改不了记录!

请注意:我要修改的记录是光标在DBGrid中移动到的那一条记录.
到底是怎么一回事呀???

5楼: 你的写法的问题,这是你程序的一部分吗?
修改之前为什么加上
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''select * from Tech_Equipment'';
ADOQuery1.Open;
这段语句呢?
你的dbgrid显示的是哪个addoquery的数据,说的明白点。
为什么不直接用adoquery的缓存提交来完成?

6楼: ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+QuotedStr(Trim(Edit1.Text))+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+QuotedStr(inttostr(ADOQuery1.fieldbyname(''Int_Id'').AsString));
ADOQuery1.ExecSQL;
应该是这样子的吧

记账软件版7楼: 再加个adoquery控件吧,要不不够用,一个query控件只能执行一个sql语句!

8楼: 刚才写错了,呵呵:)
应该是这样子的:
var
sql: string;

sql := ''Update Tech_Equipment Set Int_Id=''+QuotedStr(Trim(Edit1.Text))+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+QuotedStr(ADOQuery1.fieldbyname(''Int_Id'').AsString);

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:= sql;
ADOQuery1.ExecSQL;

9楼: ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+QuotedStr(Trim(Edit1.Text))+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+QuotedStr(ADOQuery1.fieldbyname(''Int_Id'').AsString);

10楼: 为了更好的进行测试,我另外单独做了一个小程序.

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+Trim(Edit1.Text)+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+inttostr(ADOQuery1.fieldbyname(''Int_Id'').AsInteger);


ADOQuery1.ExecSQL;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Select * from Tech_Equipment'';
ADOQuery1.Open;
end;

我是先点击Button2的,然后输入数值后再点击Button1.却提示:
ADOQuery1:Field ''Int_Id'' not found.
表Tech_Equipment中是有Int_Id字段的,整型,主键.为什么出现这样的提示呢?

11楼: ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+Trim(Edit1.Text)+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+inttostr(ADOQuery1.fieldbyname(''Int_Id'').AsInteger);
这句里面ADOQuery1已经被你close了,那你inttostr(ADOQuery1.fieldbyname(''Int_Id'').AsInteger)这里面当然就找不到Int_ID字段了呀。
能找到才叫奇怪呢!!!!!

12楼: 我改成:

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Select * from Tech_Equipment'';
ADOQuery1.Open;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+Trim(Edit1.Text)+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+InttoStr(ADOQuery1.Fieldbyname(''Int_Id'').asinteger);


ADOQuery1.ExecSQL;

可以通过,也可以修改记录。但只对第一条有效,并不能做到: 光标在DBGrid中移动到哪一条记录我就修改哪一条记录呀. 如金蝶会计软件下载

13楼: 你还是直接用ADOTable连接数据库。
要修改的时候:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=''Update Tech_Equipment Set Int_Id=''+Trim(Edit1.Text)+'',Str_Name=''+QuotedStr(TRim(Edit2.Text))+'' Where Int_Id=''+InttoStr(ADOTable1.Fieldbyname(''Int_Id'').asinteger);
ADOQuery1.ExecSQL;

记账软件版14楼: 直接用ADOTable连接数据库,能用ADOQuery修改吗?如果用ADOQuery修改,还用得着用ADOTable连接数据库吗?

这个问题难道就这么难吗?没人知道怎样做到“光标在DBGrid中移动到哪一条记录我就修改哪一条记录”吗?(当然直接在DBGrid中修改不算)

15楼: 难道没人会吗???
怎样做到:“光标在DBGrid中移动到哪一条记录我就修改哪一条记录”(当然直接在DBGrid中修改不算)

16楼: adoquery.edit;
....

adoquery.post;

17楼: 来自:shine007, 时间:2005-9-27 12:05:40, ID:3220431
哈哈,你什么都不用做,当光标在DBGrid中不同记录之间移动时,对应的数据表Table1中的记录指针本身就是跟着相应移动的.

shine007说得有理
简单的问题不要复杂化!!!
比如,你要删除一条记录,点击DBGride中的一行
然后
ADotable1.delete
就可以了,放心不会删除别的记录

18楼: dbgrid是数据感知控件,里面指针指向哪里,table自然就指在哪里.
所以不需要写什么代码
写了反而错误!