打开已包含字段的 TFDQuery
Open TFDQuery which already contains Fields
我的代码习惯于仅在 运行 时间内填充 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;
假设这些代码用 10 个字段填充 TFDQuery
。但是我还需要2个只能在运行时间计算的字段。所以我将有 12 个字段。
当然我找到了 Calculated and Aggregated Fields,但有些东西还不符合我的需要。
如文档所述,存在某种计算字段和聚合字段。
我在做什么?
- 创建我的 TFDQuery;
- 添加 2 个(计算或汇总)字段;
- 运行 我的代码将从 FireDac 添加其他 10 个字段。
如果我使用 fkAggregate
我最终可以得到 12 个字段,其中 10 个是普通类型,2 个是聚合类型。问题是毕竟我不能为这两个聚合字段设置值,因为我认为它们只允许表达式。 SUM(), ... etc
.
那么qryTaxasVencidas.AggFields.FieldByName('field_name').AsFloat := 10.0
不行。
如果我使用 fkCalculated
或 fkInternalCalc
字段,它们肯定会得到值并在 运行 时间内计算 OnCalcFields
。
问题是,我在打开TFDQuery
之前创建了2个字段。当我打开 TFDQuery
时,它会给我一个 Argument out of range exception 并且 TDBGrid
最终只有一个字段。
我使用的代码(最后出现错误):
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 最终是这样的:
似乎我已经在 TFDQuery
中有 2 个字段,当 FireDac 填充字段时,它弄乱了已经存在的 2 个字段。我该怎么办?
只要您以正确的方式进行操作,您所要求的操作就非常简单,即使用 FDQuery 的 FieldDefs 创建其字段,然后创建您需要的额外计算字段。
下面的代码是我用来在打开 FDQuery 之前将 FieldKind 为 fkInternalCalc 的计算布尔字段添加到 FDQuery 的代码。它完全按预期工作。在调用此代码之前,我所做的只是将 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
注释后面的代码。
我的代码习惯于仅在 运行 时间内填充 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;
假设这些代码用 10 个字段填充 TFDQuery
。但是我还需要2个只能在运行时间计算的字段。所以我将有 12 个字段。
当然我找到了 Calculated and Aggregated Fields,但有些东西还不符合我的需要。
如文档所述,存在某种计算字段和聚合字段。
我在做什么?
- 创建我的 TFDQuery;
- 添加 2 个(计算或汇总)字段;
- 运行 我的代码将从 FireDac 添加其他 10 个字段。
如果我使用 fkAggregate
我最终可以得到 12 个字段,其中 10 个是普通类型,2 个是聚合类型。问题是毕竟我不能为这两个聚合字段设置值,因为我认为它们只允许表达式。 SUM(), ... etc
.
那么qryTaxasVencidas.AggFields.FieldByName('field_name').AsFloat := 10.0
不行。
如果我使用 fkCalculated
或 fkInternalCalc
字段,它们肯定会得到值并在 运行 时间内计算 OnCalcFields
。
问题是,我在打开TFDQuery
之前创建了2个字段。当我打开 TFDQuery
时,它会给我一个 Argument out of range exception 并且 TDBGrid
最终只有一个字段。
我使用的代码(最后出现错误):
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 最终是这样的:
似乎我已经在 TFDQuery
中有 2 个字段,当 FireDac 填充字段时,它弄乱了已经存在的 2 个字段。我该怎么办?
只要您以正确的方式进行操作,您所要求的操作就非常简单,即使用 FDQuery 的 FieldDefs 创建其字段,然后创建您需要的额外计算字段。
下面的代码是我用来在打开 FDQuery 之前将 FieldKind 为 fkInternalCalc 的计算布尔字段添加到 FDQuery 的代码。它完全按预期工作。在调用此代码之前,我所做的只是将 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
注释后面的代码。