Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление Lookup поля / 7 сообщений из 7, страница 1 из 1
10.10.2017, 16:10:02
    #39534184
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление Lookup поля
Задача: в датасет, к динамически формируемым полям на основании 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
10.10.2017, 16:24:49
    #39534202
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление Lookup поля
_Vasilisk_, вообще некоторые датасеты позволяют комбинировать динамические и персистентные (в т.ч. лукапные) поля. если IBDataSet не умеет то описанный вариант вроде вполне норм, получить метаданные (FieldDefs->Update), на их основе насоздавать динамические и врукопашную добавить лукапы и проч.
...
Рейтинг: 0 / 0
10.10.2017, 16:45:06
    #39534212
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление Lookup поля
vavanполучить метаданные (FieldDefs->Update)Вот за это спасибо. Update позволяет заменить Prepare и отвязаться от IBDataSet
vavanна их основе насоздавать динамическиеХотелось, чтобы датасет сам вначале насоздавал динамические, а потом добавить к нему лукап. Потому и смотрел на AfterOpen
...
Рейтинг: 0 / 0
10.10.2017, 17:00:47
    #39534222
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление Lookup поля
_Vasilisk_Есть более прямой способ, чем этот?

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

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

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

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


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