在我的代码中,我的做法是在代码中填充 TFDQuery, TDataSource, TDBGrid
只在运行时使用,所以我可以在整个应用程序中重复使用这些方法。
比如说
with AFDQuery do
begin
Connection := dmDados.FDConnection;
Active := False;
SQL.Clear;
SQL.Add('SELECT * FROM ' + VIEW_TXCONDOMINIO_VENCIDO);
Open;
end;
ADataSource.DataSet := AFDQuery;
ADBGrid.DataSource := ADataSource;
假设这些代码填充了 TFDQuery
有10个字段。但我还需要2个只能在运行时计算的字段。所以我将有12个字段。
当然,我发现了关于 计算和汇总领域但有些东西还不符合我的需求。
文档上说有一些计算字段和聚合字段。
如果我使用 fkAggregate
我最终可以忍受12个字段,其中10个是普通类型,2个是聚合类型。问题是,毕竟我不能给这2个聚合字段设值,因为我认为它们只允许表达式。SUM(), ... etc
.
然后 qryTaxasVencidas.AggFields.FieldByName('field_name').AsFloat := 10.0
不起作用。
如果我使用 fkCalculated
或 fkInternalCalc
字段,它们一定会得到值,并在运行时计算在 OnCalcFields
.
问题是,我在打开 TFDQuery
. 当我打开 TFDQuery
它给我一个 参数超出范围异常 和 TDBGrid
endup只有一个字段。
我正在使用的代码(最后发生错误)。
procedure TFrmGerAcordo.FormCreate(Sender: TObject);
begin
CreateAggFieldsParaValoresTaxa;
PopularTaxaCondominioPessoa(qryInadimplentes, dsInadimplentes, DBGridInadimplentes);
end;
procedure TFrmGerAcordo.CreateAggFieldsParaValoresTaxa;
var
FieldName, Expressions: TStringList;
begin
FieldName := TStringList.Create;
FieldName.Add('valor_correcao');
FieldName.Add('valor_honorarios');
CreateCalcFields(qryTaxasVencidas, FieldName);
end;
procedure CreateCalcFields(AFDQuery: TFDQuery; FieldNames: TStringList);
var
AField: TFloatField;
I: Integer;
begin
for I := 0 to FieldNames.Count - 1 do
begin
AField := TFloatField.Create(AFDQuery);
AField.FieldName := FieldNames[I];
AField.Calculated := True;
AField.Visible := True;
AField.FieldKind := fkInternalCalc;
AField.DataSet := AFDQuery;
end;
end;
procedure PopularTaxaCondominioVencido(var AFDQuery: TFDQuery;
var ADataSource: TDataSource; var ADBGrid: TDBGrid; Filtro: string);
var
I: Integer;
begin
with AFDQuery do
begin
Connection := dmDados.FDConnection;
Active := False;
SQL.Clear;
SQL.Add('SELECT * FROM ' + VIEW_TXCONDOMINIO_VENCIDO + ' ');
// Here I already have 2 fields in my query
Open; // ERROR WILL HAPPEN HERE
end;
ADataSource.DataSet := AFDQuery;
ADBGrid.DataSource := ADataSource;
end;
DBGrid的结果是这样的
好像我已经有2个字段了。TFDQuery
当FireDac填入字段时,它把已经在的2个字段弄乱了。我可以做什么?
你问的问题很简单,只要你的方法正确,也就是使用FDQuery的FieldDefs来创建它的字段,然后创建你需要的额外计算字段。
下面的代码是我在打开FDQuery之前用来添加一个FieldKind为fkInternalCalc的计算布尔字段的方法。 它完全按照预期工作。 在调用这段代码之前,我所做的就是将FDQuery的Sql.Text添加到查询中去执行。
我相信你能够根据你的情况调整这段代码。
procedure TForm2.Button1Click(Sender: TObject);
var
i : Integer;
AField : TField;
begin
// First, update the FDQuery's FieldDefs, then use them to create the fields
// based on the FDQuery's Sql.Text. NOTE: the FDQuery must be closed at the start
FDQuery1.Fields.Clear;
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to FDQuery1.FieldDefs.Count - 1 do
FDQuery1.FieldDefs[i].CreateField(Self);
// Next, add whatever calculated fields are required
AField := TBooleanField.Create(FDQuery1);
AField.FieldName := 'Flag';
AField.FieldKind := fkInternalCalc; // or fkCalculated
AField.DataSet := FDQuery1;
FDQuery1.Open;
Caption := 'Opened';
end;
如果你想将计算字段添加到已经有持久化TFields(用IDE字段编辑器创建)的FDQuery中,你可以通过使用字段编辑器将它们添加到持久化TFields中,或者使用下面的代码来实现。// Next
在上图所示的代码中添加注释。