Вопрос

Сторон:

Я хочу добавить рассчитанное поле к данному (любому) набору данных во время выполнения. Я не знаю другого способа получить структуру набора данных, кроме как выполнение DataSet.Open метод

Но Open Метод приводит к тому, что по крайней мере одна строка данных должна быть передана с сервера на клиент. Затем мне нужно закрыть набор данных, добавить поле и открыть его. На мой взгляд, это ненужные накладные расходы. Есть ли лучший способ сделать это? Пожалуйста, не то чтобы я хочу иметь возможность добавить поле в калькуляции в любой набор данных, и я не знаю его структуры до открытия.

В псевдокоде это выглядит так:

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

Спасибо за ваше время.

Это было полезно?

Решение

Вы можете использовать DataSet.fieldDefs.update Метод. Это все равно будет включать в себя передачу данных, но строки не будут извлечены. Вы можете назвать этот метод в событии TENOPEN 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;

Другие советы

Если я хорошо понимаю ваш вопрос; Вы хотите увидеть/знать структуру таблиц, прежде чем вызывать метод Adoquery (Open). Если это то, что вы хотите, вы можете использовать методы AdoConnection, такие как (GetfieldNames), и здесь пример того, как получить названия поля таблицы (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