powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление Lookup поля
7 сообщений из 7, страница 1 из 1
Добавление Lookup поля
    #39534184
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: в датасет, к динамически формируемым полям на основании SELECT, добавить лукап поле.

Есть более прямой способ, чем этот?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm1.IBDataSet1BeforeOpen(DataSet: TDataSet);
var
  LFld: TField;
  Li: Integer;
begin
  IBDataSet1.Prepare;
  for Li := 0 to DataSet.FieldDefs.Count - 1 do
    DataSet.FieldDefs[Li].CreateField(DataSet);
  LFld := TStringField.Create(DataSet);
  LFld.FieldKind := fkLookup;
  LFld.FieldName := 'NAME';
  LFld.KeyFields := 'ID';
  LFld.LookupDataSet := IBDataSet2;
  LFld.LookupKeyFields := 'ID';
  LFld.LookupResultField := 'REMARK';
  LFld.DataSet := DataSet;
end;

procedure TForm1.IBDataSet1AfterClose(DataSet: TDataSet);
begin
  DataSet.Fields.Clear;
end;



Пробовал переносить добавление поля в AfterOpen. Тогда на строку
Код: pascal
1.
  LFld.DataSet := DataSet;

ругаетсяCannot perform this operation on an open dataset

Если вместо этой строки вставить
Код: pascal
1.
DataSet.Fields.Add(LFld);

то поле не отображается в гриде. Если же добавить
Код: pascal
1.
DBGrid1.Columns.RebuildColumns;

то получаю ошибкуField ''NAME'' has no dataset

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534202
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, вообще некоторые датасеты позволяют комбинировать динамические и персистентные (в т.ч. лукапные) поля. если IBDataSet не умеет то описанный вариант вроде вполне норм, получить метаданные (FieldDefs->Update), на их основе насоздавать динамические и врукопашную добавить лукапы и проч.
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534212
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanполучить метаданные (FieldDefs->Update)Вот за это спасибо. Update позволяет заменить Prepare и отвязаться от IBDataSet
vavanна их основе насоздавать динамическиеХотелось, чтобы датасет сам вначале насоздавал динамические, а потом добавить к нему лукап. Потому и смотрел на AfterOpen
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534222
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Есть более прямой способ, чем этот?

Лично мне он не известен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534245
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЛично мне он не известен.Спасибо. Твоему мнению верю :))

Опыты показали, что
_Vasilisk_
Код: pascal
1.
DataSet.Fields.Clear;

лучше перенести из AfterClose первой строкой в BeforeOpen
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534250
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_лучше перенести из AfterClose первой строкой в BeforeOpenя бы вообще по возможности минимизировал размазывание по обработчикам и по максимуму все необходимые телодвижения расположил линейно в коде. а когда и такое поднадоело доточил датасет чтобы задавать в дизайне когда возможно
...
Рейтинг: 0 / 0
Добавление Lookup поля
    #39534278
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не взлетает идея. Ткните носом, что не так.

Есть рабочая таблица с полями (ParentID, ChildID) и есть таблица для лукапа (ID, ParentID, Name). Хотелось сделать в гриде рабочей таблицы выпадающее поле, но где значения будут в пределах одного ParentID. Т.е.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
IBDataSet2.SelectSQL.Text := 'SELECT ID, NAME FROM lookup_table WHERE ParentID = :ParentID';
...........
  LFld := TStringField.Create(DataSet);
  LFld.FieldKind := fkLookup;
  LFld.FieldName := 'NAME_LOOKUP';
  LFld.KeyFields := 'ChildID';
  LFld.LookupDataSet := IBDataSet2;
  LFld.LookupKeyFields := 'ID';
  LFld.LookupResultField := 'NAME;

но на каждый скролл должно вызываться переоткрытие IBDataSet2 с новым ParentID

Если IBDataSet2 сделать деталью основной таблицы, то получается, что вначале идет поиск лукап значения, а потом переоткрытие детали. В итоге ничего не находится
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление Lookup поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]