Как создать поле поиска 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;