質問

シーンリオ:

実行時間中に、指定された(任意の)データセットに計算されたフィールドを追加したいと思います。実行以外のデータセット構造を取得する他の方法は知りません DataSet.Open 方法。

しかし Open メソッドは、少なくとも1つのデータの1行をサーバーからクライアントに転送する必要があります。次に、データセットを閉じてフィールドを追加して再開する必要があります。私の意見では、これは不必要なオーバーヘッドです。これを行うより良い方法はありますか?計算フィールドを任意のデータセットに追加できるようにしたいのではなく、開く前にその構造がわかりません。

Pseudocodeでは、次のようになります。

DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;

御時間ありがとうございます。

役に立ちましたか?

解決

dataset.fielddefs.updateメソッドを使用できます。これにはまだいくつかのデータ転送が含まれますが、行はありません。このメソッドをTdatasetの前のイベントで呼び出して、計算されたフィールドをそこに追加することもできます。

これが私に役立つ短い例です:

procedure TDataModule.cdsExampleBeforeOpen(DataSet: TDataSet);
var I: Integer;
    TmpField: TDateTimeField;
begin
  // Get field definitions from the server
  DataSet.FieldDefs.Update;

  // Add calculated field
  TmpField := TDateTimeField.Create(DataSet);
  with TmpField do
  begin
    Name := 'Date';
    FieldName := 'Date';
    DisplayLabel := 'Date';
    DisplayFormat := 'ddd ddddd';
    Calculated := True;
  end;
  TmpField.DataSet := DataSet;

  // Create fields from field definitions
  for I := 0 to DataSet.FieldDefs.Count - 1 do
    DataSet.FieldDefs[I].CreateField(DataSet);
end;

他のヒント

私があなたの質問をよく理解しているなら。おしゃべり(オープン)メソッドを呼び出す前に、テーブル構造を確認/知りたいです。あなたが望むものなら、あなたは(getFieldNames)などのAdoConnectionメソッドを使用できます。ここでは、テーブルのフィールド名を取得する方法(EMP)の例を使用できます。

procedure TForm2.Button1Click(Sender: TObject);
var
  lstFields: TStringList;
begin
  lstFields := TStringList.Create;
  try
    ADOConnection1.GetFieldNames('EMP', lstFields);
  finally
    lstFields.Free;
  end;
end;

その後、すべてのフィールド名がオン(LSTFields)になります。これが役立つことを願っています。

よろしく。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top