三层结构,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 ;

解决方案 »

  1.   

    ClientDataSet1.RemoteServer:=SocketConnection1;
      

  2.   

    to cdsgajxlp(新手),  tempCDS.RemoteServer := ClientDataSet1.RemoteServer;
      tempCDS.ProviderName := ClientDataSet1.ProviderName ;
      tempCDS.packetRecords := -1;已经设了。哪里出错啊?急啊!!!
      

  3.   

    picklist.add 里面看过了,tempCDS 已经有数据了,下拉列表都没问题了。
      

  4.   

    new-orther-dialogs-TReconcileErrorForm
    在ClientDataSet1的onReconcileError事件中HandleReconcileError(DataSet,UpdateKind,E);(其中HandleReconcileError是TReconcileErrorForm的函数)
    看看错误信息是什么
      

  5.   

    to  leejiey(李杰) ,我就是在 ClientDataSet1-->cdsReconcileError 里面 Application.MessageBox(PChar(e.message),'Error Information', MB_OK+MB_ICONERROR);e.message 就是上面的错误啊。
      

  6.   

    to cdsgajxlp(新手) ,我同时用的 keylist 和 picklist,就是说,显示在 dbgrideh 里面的是 picklist 的值,可是实际上是对应的 keylist 的值呀。这就是 keylist 的作用嘛。怎么 applyupdate 出错?应该是以 keylist 去 applyupdate 的吧?高手平常碰到这种情况怎么做的啊?指导指导?
      

  7.   

    是不是同时用同一个 socketconnection 的原因?或者是因为 tempCDS 使用以后,applyupdate 用 tempCDS 来 update 了?在哪里可以跟踪 applyupdate 啊?哎,都挂了好几天了。又要像前几个问题一样了,看来 csdn 现在已经没什么高人了
      

  8.   

    三层结构,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;
    ......
    高人救命啊!!!急用。帮帮我这个无助的人吧!!!
      

  9.   

    dbgridEH我用了有很多问题出现,所以就没用过?
      

  10.   

    tempCDS.RemoteServer := ClientDataSet1.RemoteServer;
    tempCDS.ProviderName := ClientDataSet1.ProviderName ;因为tempCDS和ClientDataSet1使用了同一个ProviderName ,当tempCDS打开后改变了中间层(ClientDataSet1.ProviderName  )的记录集!,重新在中间层为tempCDS加一个ProviderName
      

  11.   

    我在使用DBGID时,如何进行记录的统计请各位高手帮忙
      

  12.   

    to ckx,用 dbgrideh 吧,设置 footer 很方便。
      

  13.   

    to hoho5999,高手,谢谢。搞定了。