Как создать поле поиска TDataSet во время выполнения?

Я использую TADODataSet (Д7).
Я не создаю постоянные поля в режиме конструирования с моим 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

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

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


ПРИМЕЧАНИЕ: я получаю исключение при запуске кода Джона из IDE. Исключение возникает при попытке открыть DataSet: EOleException with message 'An unknown error has occured',

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

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

1 ответ

Решение

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

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

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;
Другие вопросы по тегам