Как создать поле поиска TDataSet во время выполнения? - PullRequest
6 голосов
/ 30 января 2012

Я использую TADODataSet (D7).
Я не создаю постоянные поля в режиме конструирования с моим DataSet.

dsItems.CommandText := 'select ID, ItemName, UserIDCreate from Items';
dsUsers.CommandText := 'select  ID, LoginName from Users'; // lookup dataset

Если дважды щелкнуть dsItems и «Добавить все поля», а затем нажать «Новое поле» и определить поле поиска, все работает нормально. Полученный dsItems должен содержать: ID, ItemName, UserIDCreate, LoginName_Lookup

Как я могу избежать всего этого во время разработки и добавить поле поиска после / или до (? Не уверен) открытия набора данных.

Другими словами: как мне эмулировать «Добавить все поля» , а затем «Новое поле» для добавления поиска, поданного во время выполнения?


Примечание: Я получаю исключение при запуске кода Джона из IDE. Исключение возникает при попытке открыть набор данных: EOleException with message 'An unknown error has occured'.

function TCustomADODataSet.LocateRecord (ADODB.pas) в строке if FieldCount = 1 then FLookupCursor.Find...

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

1 Ответ

9 голосов
/ 30 января 2012

Невозможно открыть набор данных, чтобы добавить поле поиска во время выполнения.

Вам также необходимо добавить все остальные поля, к которым вам необходимо получить доступ, в качестве постоянных полей, иначе они будут недоступны.Процедуры ниже должны работать.Тем не менее, я рекомендую, если вы можете, использовать запросы и объединять свои таблицы - это намного меньше кода и, на мой взгляд, намного чище.

procedure CreatePersistentFields(ADataset: TDataset);
Var
  i: Integer;
Begin
  ADataset.FieldDefs.Update;
  for I := 0 to ADataset.FieldDefs.Count - 1 do
     if ADataset.FindField(ADataset.FieldDefs[i].Name) = Nil then
       ADataset.FieldDefs.Items[i].CreateField(ADataset);
End;

Procedure CreateLookupField( ATable: TDataSet; AFieldName: String; ALookupDataset:          TDataset; AKeyfields: String; ALookupKeyfields: String; ALookupResultField : String);
Var
  I : Integer;
  NewField : TField;
Begin
  with ATable do begin
    if FieldDefs.Updated = False then
      FieldDefs.Update;
    If FindField(AFieldName) = Nil then
    begin
      NewField := TStringField.Create(ATable);
      NewField.FieldName := AFieldName;
      NewField.KeyFields := AKeyFields;
      NewFIeld.LookupDataSet := ALookupDataset;
      NewField.LookupKeyFields := ALookupKeyFields;
      NewField.LookupResultField := ALookupResultField;
      NewField.FieldKind := fkLookup;
      NewField.Dataset := ATable;
    end;
  end;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AdoDataset1.Close;
  CreatePersistentFields(TDataset(AdoDataset1));
  CreateLookupField(TDataset(AdoDataset1), 'EmployeeNameLook', TDataset(EmployeeTable), 'EmployeeID', 'EmployeeID', 'EmployeeName');
end;
...