如何为ADODataSet动态的增加一个计算字段?。 ADODataSet的SQL语句是运行期指定的,可这时如何为ADODataSet增加一个计算字段? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var field: TField;begin field := TIntegerField.Create(nil); field.DataSet := ADODataSet; field.FieldName := 'fieldname'; field.FieldKind := fkCalculated; BCB 的PPower 也开始用Delphi了? TO: pazee現在還是不大習慣Delphi。用BCB順手,Delphi是偶爾玩一下。不要看我老在BCB版就把我排出Delphi呀。再說Delphi版人氣比BCB版高,我還是常看Delphi版的,只是很少提問與回答。你還是幫幫我,回答一下問題吧。TO: useryecha問題是 如果數據集已經打開,那麼是不允許修改字段的,如果數據集沒打開,字段列表可是空的呀,那麼你以上生成字段的代碼將無效,也會出錯的呀。 PPower 提的问题要认真对待,这可是个老鸟。 ARI 的 BLOG 上提供了一种方法,可以给 DataSet 动态增加 lookup 字段,应该有借鉴意义。http://borland.mblogger.cn/aiirii (查看 2004年7月29日的 blog)不过,这个方法我还没有测试过。我原来也实现过给 ClientDataSet 动态增加 lookup 字段,不过我修改了一点 CDS 的源码,稍微麻烦一点。 pazee(耙子)可真是。謝謝leapmars(流铭),ARI 的 BLOG 上提到的方法剛看了,感覺其方法是字段已經被固化,然後才動態增加一個Lookup字段,我要找個時間測試一下才行。如果能將數據集的字段固化下來,這就好辦了,可偏偏連字段列表也是動態的. >>>> 可偏偏連字段列表也是動態的.这个也没有关系啊。 其实可以通过几种方法解决:要么把动态创建计算字段的代码整合进 ADODataSet 的源码,要么可以编写一个 Adapter 类,其中包含动态创建计算字段的代码。 var field: TField;begin field := TIntegerField.Create(nil); field.DataSet := ADODataSet; field.FieldName := 'fieldname'; field.FieldKind := fkCalculated;end ;在OnCalcFields做你要的计算,或者你重载一下它的OnCalcFields事件,不难吧。 可以在sql语句中写计算字段呀! 沒想到這麼久沒結貼了。下面是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();} ...我要做一个报表 ,应该如如何做 为什么Form没有显示出来? 一个DBGrid组件怎么使它显示数据库中的数据? D7是最好的開發環境,不同觀點的接分點評 音频频谱分析? 请问,使用一个quickrep控件可以连接两个数据库吗? 关于TNMFTP Delphi + SQL server寻求项目合作 怎样知道一个文本文件里有多少行 有问题请教 我申请此解释为年度最火星的解释。 求sql语句
field: TField;
begin
field := TIntegerField.Create(nil);
field.DataSet := ADODataSet;
field.FieldName := 'fieldname';
field.FieldKind := fkCalculated;
現在還是不大習慣Delphi。用BCB順手,Delphi是偶爾玩一下。不要看我老在BCB版就把我排出Delphi呀。再說Delphi版人氣比BCB版高,我還是常看Delphi版的,只是很少提問與回答。
你還是幫幫我,回答一下問題吧。TO: useryecha
問題是
如果數據集已經打開,那麼是不允許修改字段的,如果數據集沒打開,字段列表可是空的呀,那麼你以上生成字段的代碼將無效,也會出錯的呀。
field: TField;
begin
field := TIntegerField.Create(nil);
field.DataSet := ADODataSet;
field.FieldName := 'fieldname';
field.FieldKind := fkCalculated;
end ;
在OnCalcFields做你要的计算,或者你重载一下它的OnCalcFields事件,不难吧。
下面是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();
}