高手救命啊:DBGridEh 使用 picklist 和 keylist 时,applyupdates 出错。为什么?

xiaoxiaoman 2004-09-13 02:43:50
三层结构,client 端用 clientdataset1 -->Datasource1--> DBGrideh1 显示数据表,然后动态创建一个 clientdataset:tempCDS,从另一个 table query 数据并动态给第四列加入 picklist和 keylist,实现了该列的下拉只选列表,但是点选下拉值后,并 clientdataset1.applyupdate(0)时,总是出现 “ora-00904: invalid column name” 的错误。为什么啊?高手帮忙啊?
下面是动态添加 picklist 和 keylist 的代码:

tempCDS := TClientDataSet.Create(self);
tempCDS.commandText := 'select * from status';
tempCDS.Open ;
DBGridEh1.Columns[3].AlwaysShowEditButton := True;
DBGridEh1.Columns[3].KeyList.Clear;
DBGridEh1.Columns[3].PickList.Clear;
tempCDS.First ;
while not tempCDS.Eof do
begin
DBGridEh1.Columns[3].KeyList.Add(tempCDS.Fields[0].AsString);
DBGridEh1.Columns[3].PickList.Add(tempCDS.Fields[1].AsString);
tempCDS.Next ;
end;
tempCDS.Close ;
tempCDS.Free ;
...全文
472 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaoman 2004-09-23
  • 打赏
  • 举报
回复
to hoho5999,

高手,谢谢。搞定了。
hoho5999 2004-09-23
  • 打赏
  • 举报
回复
to ckx,

用 dbgrideh 吧,设置 footer 很方便。
ckx 2004-09-23
  • 打赏
  • 举报
回复
我在使用DBGID时,如何进行记录的统计请各位高手帮忙
hoho5999 2004-09-23
  • 打赏
  • 举报
回复
tempCDS.RemoteServer := ClientDataSet1.RemoteServer;
tempCDS.ProviderName := ClientDataSet1.ProviderName ;

因为tempCDS和ClientDataSet1使用了同一个ProviderName ,当tempCDS打开后改变了中间层(ClientDataSet1.ProviderName )的记录集!,重新在中间层为tempCDS加一个ProviderName
xiaoxiaoman 2004-09-23
  • 打赏
  • 举报
回复
我顶 upupup
chinaandys 2004-09-16
  • 打赏
  • 举报
回复
dbgridEH我用了有很多问题出现,所以就没用过?
xiaoxiaoman 2004-09-16
  • 打赏
  • 举报
回复
三层结构,client 端用 clientdataset1 -->Datasource1--> DBGrideh1 显示数据表,然后动态创建一个 clientdataset:tempCDS,并用tempCDS从另一个表 query 数据并动态给第四列加入 picklist和 keylist,实现了该列的下拉只选列表,但是点选下拉值后,并clientdataset1.applyupdate(0)时,总是出现 “ora-00904: invalid column name” 的错误。为什么啊?高手帮忙啊?

我是通过给 CDS 的 beforegetrecords 事件里的 ownerdata := VarArrayOf([SQLStr, Null]); 来给该 ClientDataSet1 和 tempCDS 赋 SQL的值。我发现如果 tempCDS 不连接 DB,ClientDataSet1.applyupdate 是没有问题的。tempCDS 一连接以后,ClientDataSet1.applyupdate(0); 就出错了。怎么避免啊?我在 DBGridEh 网格的editbuttondown 里面创建的 tempCDS,需要动态添加不同的 picklist 和 keylist。必须这样做啊。怎么办?

//下面是在 EditButtonDown 里动态添加 picklist 和 keylist 的代码:
......
tempCDS := TClientDataSet.Create(self);
tempCDS.RemoteServer := ClientDataSet1.RemoteServer;
tempCDS.ProviderName := ClientDataSet1.ProviderName ;
tempCDS.packetRecords := -1;
tempCDS.fetchOnDemand := False;
tempCDS.beforegetrecords := cdsbeforegetrecords;
SQLStr := 'select * from status';
tempCDS.Open ;
DBGridEh1.Columns[3].AlwaysShowEditButton := True;
DBGridEh1.Columns[3].KeyList.Clear;
DBGridEh1.Columns[3].PickList.Clear;
tempCDS.First ;
while not tempCDS.Eof do
begin
DBGridEh1.Columns[3].KeyList.Add(tempCDS.Fields[0].AsString);
DBGridEh1.Columns[3].PickList.Add(tempCDS.Fields[1].AsString);
tempCDS.Next ;
end;
tempCDS.Close ;
tempCDS.Free ;
......

//下面是beforegetrecords events
procedure TForm1.cdsbeforegetrecords(Sender : TObject; var OwnerData : OleVariant);
var LastValue : OleVariant;
begin
LastValue := Null;
ownerdata := VarArrayOf([SQLStr, LastValue ]);
end;

//下面是一开始打开 DBGridEh 连接的 ClientDataSet1 的过程:
procedure TForm1.ShowBtnClick(sender : TObject);
begin
ClientDataSet1.beforegetrecords := cdsbeforegetrecords;
SQLStr := 'select * from PInfo';
ClientDataSet1.open;
end;
......


高人救命啊!!!急用。帮帮我这个无助的人吧!!!
xiaoxiaoman 2004-09-15
  • 打赏
  • 举报
回复
是不是同时用同一个 socketconnection 的原因?

或者是因为 tempCDS 使用以后,applyupdate 用 tempCDS 来 update 了?在哪里可以跟踪 applyupdate 啊?

哎,都挂了好几天了。又要像前几个问题一样了,看来 csdn 现在已经没什么高人了。。。。。。
xiaoxiaoman 2004-09-14
  • 打赏
  • 举报
回复
to cdsgajxlp(新手) ,

我同时用的 keylist 和 picklist,就是说,显示在 dbgrideh 里面的是 picklist 的值,可是实际上是对应的 keylist 的值呀。这就是 keylist 的作用嘛。怎么 applyupdate 出错?应该是以 keylist 去 applyupdate 的吧?

高手平常碰到这种情况怎么做的啊?指导指导?
xiaoxiaoman 2004-09-14
  • 打赏
  • 举报
回复
to leejiey(李杰) ,

我就是在 ClientDataSet1-->cdsReconcileError 里面 Application.MessageBox(PChar(e.message),'Error Information', MB_OK+MB_ICONERROR);e.message 就是上面的错误啊。
cdsgajxlp 2004-09-14
  • 打赏
  • 举报
回复
可能是数据库字段类型不匹配
qly_1314 2004-09-14
  • 打赏
  • 举报
回复
up
hoho5999 2004-09-14
  • 打赏
  • 举报
回复
我 up
leejiey 2004-09-13
  • 打赏
  • 举报
回复
new-orther-dialogs-TReconcileErrorForm
在ClientDataSet1的onReconcileError事件中HandleReconcileError(DataSet,UpdateKind,E);(其中HandleReconcileError是TReconcileErrorForm的函数)
看看错误信息是什么
xiaoxiaoman 2004-09-13
  • 打赏
  • 举报
回复
picklist.add 里面看过了,tempCDS 已经有数据了,下拉列表都没问题了。
xiaoxiaoman 2004-09-13
  • 打赏
  • 举报
回复
to cdsgajxlp(新手),

tempCDS.RemoteServer := ClientDataSet1.RemoteServer;
tempCDS.ProviderName := ClientDataSet1.ProviderName ;
tempCDS.packetRecords := -1;

已经设了。哪里出错啊?急啊!!!
cdsgajxlp 2004-09-13
  • 打赏
  • 举报
回复
ClientDataSet1.RemoteServer:=SocketConnection1;
cdsgajxlp 2004-09-13
  • 打赏
  • 举报
回复
数据源...
qizhanfeng 2004-09-13
  • 打赏
  • 举报
回复
学习
up

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧