各位好,我现在的问题是:在一个三层结构中,接口只能提供CDS数据,即一个赋值后的CDS,我想在这样一个赋值后的CDS中添加一个LookUp字段,实现字段A的ID显示为另外一个CDS中的字段B的Name,现在不知道怎么办,动态创建LookUp字段始终失败,另外还想问一下Fields和FieldDef的区别是什么啊?

解决方案 »

  1.   

    FieldDef定义字段后,可以用CreateDataSet去创建一个数据集后,不依赖其他东西,生成一个数据结构,直接往里边添加数据,Fields只是添加静态字段,lookup的往fields里添加
      

  2.   

    意思是说不管这个CDS里面有没有数据,都可以往里面添加Field,而且这个Field和FieldDef没有关系吗?那具体怎么实现呢?谢谢
      

  3.   

    我的理解就是,FieldDef就是数据集的字段,你建好了字段就往里添加数据.
    Fields就是用来显示的字段.
    我这样说理解不?
      

  4.   

    Fields一般指主键字段

    FieldDel指的是数据库设计时的第一个字段
      

  5.   

    我做了个小实验,一个AdoConnection,AdoQuery,DataProvider和一个CDS,在CDS->DataProvider->AdoQuery->AdoConnection,这样建立连接,在设计期就把表A的数据拿过来,这时候你去看CDS的FieldDef里面就是表A的所有字段,而这时CDS的Fields里面什么都没有(打开CDS的Fields Editor里面什么也没有),即使这样也可以通过DBGrid显示。那这样frankie_24说的Fields是显示的字段就不成立了,同样fangsp说的FieldDef是数据库设计时的第一个字段也不成立了。但是就利用这样一个情况,在程序启动之后,你再看CDS的Fields里却有了所有的表A的字段。这个不明白是为什么?我的认为是FieldDef是表字段的定义,而且在CDS的CreateDataSet之后是不能改变的(FieldDefs lists the field definitions for a dataset. While an application can examine FieldDefs to explore the field definitions for a dataset, it should not change these definitions unless creating a new table with CreateTable or CreateDataSet.)多谢大家的回复,还请大家踊跃呀,我现在还是不会怎么动态创建一个LookUp的Field。
      

  6.   

    给你一段代码:
    var TmpField : TstringField;
        i : integer;
    begin
      with qry_work do
      begin
         Close;
         sql.Clear;
         SQL.Add('select * from t_User');
         if qry_work.Fields.FindField('TEST') =nil then
         begin       TmpField := TstringField.Create(self);        With TmpField do
            begin
                FieldKind:=fkLookUp;
                FieldName :='TEST';
                LookupDataSet:=adoquery2;
                KeyFields:='COMPANYID';
                LookupKeyFields := 'COMPANYID';
                LookupResultField :='COMPANYNAME';
                size:=200;
                Lookup :=True;
                Dataset := qry_work;
            end;
         end;
         Open;
         if qry_work.Fields.FindField('TEST') = nil then
            qry_work.Fields.Add(TmpField);
      

  7.   

    关键1:
      TmpField : TstringField; //类型要用这个
    关键2
      qry_work.Fields.Add(TmpField); //一定要在OPEN之后增加
      

  8.   

    试验了Fj_CSR的方法,可以添加了,但还有问题,如果在Add之前,设置了TmpField.DataSet := qry_work,那么在后面Add的时候就会报错,说qry_work没有COMPANYID这个Field。另外我还想问一下,这里创建的TmpField应该在哪里释放呢?
      

  9.   

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA