ADODataSet的SQL语句是运行期指定的,可这时如何为ADODataSet增加一个计算字段?

解决方案 »

  1.   

    var
        field: TField;
    begin
        field := TIntegerField.Create(nil);
        field.DataSet := ADODataSet;
        field.FieldName := 'fieldname';
        field.FieldKind := fkCalculated;
      

  2.   

    BCB 的PPower 也开始用Delphi了?
      

  3.   

    TO: pazee
    現在還是不大習慣Delphi。用BCB順手,Delphi是偶爾玩一下。不要看我老在BCB版就把我排出Delphi呀。再說Delphi版人氣比BCB版高,我還是常看Delphi版的,只是很少提問與回答。
    你還是幫幫我,回答一下問題吧。TO: useryecha
    問題是 
        如果數據集已經打開,那麼是不允許修改字段的,如果數據集沒打開,字段列表可是空的呀,那麼你以上生成字段的代碼將無效,也會出錯的呀。
      

  4.   

    PPower 提的问题要认真对待,这可是个老鸟。
      

  5.   

    ARI 的 BLOG 上提供了一种方法,可以给 DataSet 动态增加 lookup 字段,应该有借鉴意义。http://borland.mblogger.cn/aiirii (查看 2004年7月29日的 blog)不过,这个方法我还没有测试过。我原来也实现过给 ClientDataSet 动态增加 lookup 字段,不过我修改了一点 CDS 的源码,稍微麻烦一点。
      

  6.   

    pazee(耙子)可真是。謝謝leapmars(流铭),ARI 的 BLOG 上提到的方法剛看了,感覺其方法是字段已經被固化,然後才動態增加一個Lookup字段,我要找個時間測試一下才行。如果能將數據集的字段固化下來,這就好辦了,可偏偏連字段列表也是動態的.
      

  7.   

    >>>> 可偏偏連字段列表也是動態的.这个也没有关系啊。 其实可以通过几种方法解决:要么把动态创建计算字段的代码整合进 ADODataSet 的源码,要么可以编写一个 Adapter 类,其中包含动态创建计算字段的代码。
      

  8.   

    var
        field: TField;
    begin
        field := TIntegerField.Create(nil);
        field.DataSet := ADODataSet;
        field.FieldName := 'fieldname';
        field.FieldKind := fkCalculated;
    end ;
    在OnCalcFields做你要的计算,或者你重载一下它的OnCalcFields事件,不难吧。
      

  9.   

    可以在sql语句中写计算字段呀!
      

  10.   

    沒想到這麼久沒結貼了。
    下面是BCB中的代碼:
    void CreateFieldList(TDataSet *DataSet,TPPFieldScript *FieldScript,int FieldCount)
    {
     TPPFieldScript *pFS;
     TField *pF ;
     assert(!DataSet->Active) ;
     TFieldDefs *pDefs = DataSet->FieldDefs;
     pDefs->Clear() ;
     DataSet->Fields->Clear();
     pFS = FieldScript;
     pDefs->BeginUpdate();
     for(int i=0;i<FieldCount; ++i,++pFS)
       {
         TFieldDef *pDef  = pDefs->AddFieldDef();
         pDef->Name = pFS->FieldName.c_str() ;
         pDef->DataType = pFS->FieldType;
         pDef->Size =  pFS->FieldSize;
         pFS->SetField(pDef->CreateField(DataSet));
       }
     pDefs->EndUpdate();
    }