打开已经包含字段的TFDQuery

问题描述 投票:0回答:1

在我的代码中,我的做法是在代码中填充 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个字段。

当然,我发现了关于 计算和汇总领域但有些东西还不符合我的需求。

文档上说有一些计算字段和聚合字段。

我在做什么?

  1. 创建我的TFDQuery。
  2. 添加2个(计算或聚合)字段。
  3. 运行我的代码,将从FireDac中添加其他10个字段。

如果我使用 fkAggregate 我最终可以忍受12个字段,其中10个是普通类型,2个是聚合类型。问题是,毕竟我不能给这2个聚合字段设值,因为我认为它们只允许表达式。SUM(), ... etc.

然后 qryTaxasVencidas.AggFields.FieldByName('field_name').AsFloat := 10.0 不起作用。

如果我使用 fkCalculatedfkInternalCalc 字段,它们一定会得到值,并在运行时计算在 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的结果是这样的

DBGrid with only one column

好像我已经有2个字段了。TFDQuery当FireDac填入字段时,它把已经在的2个字段弄乱了。我可以做什么?

delphi firedac
1个回答
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 在上图所示的代码中添加注释。

© www.soinside.com 2019 - 2024. All rights reserved.