Lookup поля

Модератор: Модераторы

Lookup поля

Сообщение Mikhail » 08.02.2018 13:01:58

Господа, кто подскажет, как работать с подстановочными полями?

Интересует содержимое ModifySQL в компоненте TIBDataset. Для определенности, есть две таблицы
Goods(pkgoods, name, fkcat, price) и categ(pkcateg, title). Вторая таблица содержит справочник для поля fkcat первой таблицы.

SelectSql такой
Код: Выделить всё
Select PKGOODS, NAME, FKCAT, PRICE  From GOODS;


В редакторе полей TIBdataset cозданы все поля из запроса + lookup поле lkCat. Оно настороено следующим образом
Код: Выделить всё
KeyFields:= FKCAT;
LookupDataset:=qrCat;
LookupKeyFields:=pkcateg;
LookupResultField:=title;


grCat - это запрос
Код: Выделить всё
Select  * from categ;


В DbGrid подстановочное поле работает, в том смысле что оно правильно отображается, но при попытке модификации выдает ошибку ModifySQL следующий
Код: Выделить всё
UPDATE goods SET
fkcat = :lkcat
WHERE pkgoods = :pkgoods;

В чем ошибка? :?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 08.02.2018 19:02:33

В чем ошибка?
нет запроса на редактирование, удаление и изменение.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 08.02.2018 19:18:19

pupsik писал(а):
В чем ошибка?
нет запроса на редактирование, удаление и изменение.

На выборку и редактирование есть, я их даже привел.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 08.02.2018 20:06:01

На выборку и редактирование есть, я их даже привел.
уж проще бы тестовый пример приложили...
У меня ваш ModifySQL вызывает смутные вопросы:
Если верно понял что там написано: вы хотите изменить строку в таблице goods значениями из самого goods ? Т.е. затрагиваются 2 поля: pkgoods и fkcat. Зачем тогда 2-я таблица и связь с ней по полю?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 08.02.2018 20:17:15

pupsik писал(а):
На выборку и редактирование есть, я их даже привел.
уж проще бы тестовый пример приложили...
У меня ваш ModifySQL вызывает смутные вопросы:
Если верно понял что там написано: вы хотите изменить строку в таблице goods значениями из самого goods ? Т.е. затрагиваются 2 поля: pkgoods и fkcat. Зачем тогда 2-я таблица и связь с ней по полю?

Уже решено, что-то я ступил. Надо так.
Код: Выделить всё
UPDATE goods SET
fkcat = :fkcat
WHERE pkgoods = :pkgoods;

Еще есть вопросы по транзакциям, когда они работают?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 08.02.2018 20:51:33

fkcat = :lkcat
ну а вдруг вы забыли о том что объявили где то параметр :lkcat? :roll:

Еще есть вопросы по транзакциям, когда они работают?
конкретно в FB их 2 (при чтении) и более.
Ну а так: для старта
Или на этом форуме посмотрите.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 08.02.2018 21:04:28

pupsik писал(а):ну а вдруг вы забыли о том что объявили где то параметр :lkcat?

Это поле подстановки.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 08.02.2018 21:20:00

Это поле подстановки.
это ясно и с первого поста. Но ведь можно и параметр указать в SQL и просто забыть о этом написать. Т.е. вырезки из кода - замечательно. Но..о это не пример с "багом.?".
Т.е. вы написали куски кода, а остальным гадать что же там теоретически должно быть. Возможно это и весело (мурашками в голове шевелить и гадать). Но вы сами себе добавляете вариант "не дождаться ответа и самому решать проблему".
И кстати: часто подготовка не работающего примера помогает самому выявить проблему.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 08.02.2018 22:14:09

pupsik писал(а):
Это поле подстановки.
это ясно и с первого поста. Но ведь можно и параметр указать в SQL и просто забыть о этом написать. Т.е. вырезки из кода - замечательно. Но..о это не пример с "багом.?".
Т.е. вы написали куски кода, а остальным гадать что же там теоретически должно быть. Возможно это и весело (мурашками в голове шевелить и гадать). Но вы сами себе добавляете вариант "не дождаться ответа и самому решать проблему".
И кстати: часто подготовка не работающего примера помогает самому выявить проблему.

Вообще-то я все написал и про поле и запросы, Вы просто не внимательно прочитали. :)

И к вопросу о транзакциях, когда стартует читающая в ibx? Когда edit вызываем для dataset или post? Читающая транзакция активна все время пока датасет активен?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 08.02.2018 22:59:44

Читающая транзакция активна все время пока датасет активен?
Если вы о св-ве Active. То, по логике активируется доступ к базе, таблице... активируется транзакция. При закрытии, в простом случае, закрывается. Но вот по поводу читающая (не знаю что вы под этим понимаете)...
Когда edit вызываем для dataset или post?
можно для каждого действия повесить свою. И управлять ими.

п.с.
Вы просто не внимательно прочитали.
хм... спорный вопрос. Но он не важен. И не интересно сразу выложить то что показалось, вдруг оно показалось :lol:

лирика:
Интересно: если код написан с ошибкой. Он есть, или его нет?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 09.02.2018 14:43:56

Теперь вопрос о связке двух таблиц, главная-подчиненный - есть у кого пример как это сделать?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 09.02.2018 19:47:57

Mikhail Простой пример с исходниками (ссылки на странице).
Последний раз редактировалось pupsik 10.02.2018 00:55:02, всего редактировалось 1 раз.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Mikhail » 09.02.2018 19:56:38

pupsik писал(а):Mikhail Простой [url=http://wiki.freepascal.org/TSqlite3_Master_Detail_Example]пример[url] с исходниками (ссылки на странице).

Нужно для Firebird. Конкретно не получается модификация дочерней таблицы вылетает ошибка
TPB constant (lock_timeout)

Добавлено спустя 3 часа 11 минут 54 секунды:
Модификация получилась, а вот вставка нет. InsertSQL для подчиненной таблицы такой

Код: Выделить всё
insert into goods
(name, fkcat, price, amount)
values (:name, :pkcat, :price, :amount);


здесь pkcat первичный ключ главной таблицы, пишет ошибку т.к. в этом параметре передается ноль. При этом следующий SelectSQL нормально работает.

Код: Выделить всё
select pkgoods, name, fkcategory, price, amount
from goods
where fkcat = :pkcat;


В чем проблема?

Добавлено спустя 48 минут 17 секунд:
В общем победа! :)
Устанавливаю внешний ключ вручную. Для этого создаю обработчик OnNewRecord для подчиненного IBDataSet.
Код: Выделить всё
procedure TfrmMain.dsDetailNewRecord(DataSet: TDataSet);
begin
DataSet.FieldByName('fkcat').AsInteger:=dsMaster.FieldByName('pkcat').AsInteger;
end;


Изменяю InsertSQL на следующий запрос
Код: Выделить всё
insert into goods
(name, fkcat, price, amount)
values (:name, :new_fkcat, :price, :amount);


Это штатный способ решения такой задачи? :roll:
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Lookup поля

Сообщение pupsik » 10.02.2018 01:03:11

Нужно для Firebird.
вы просили пример... Хотя, возможно, примера под определённый сервер и не существует. Главное: основы даны.

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

Это штатный способ решения такой задачи?
а кто его знает. См. выше.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Lookup поля

Сообщение Sharfik » 19.06.2019 16:37:20

Вопрос по той же теме.
Есть вместо DBGrid компонент VirtualDBGrid. Из таблицы берем данные, и соответственно где то не текст, а номера id для других таблиц.
Собственно при форматировании полей VirtualDBGrid делает несколько lookup запросов к двум, трем другим dataset.
Какие бывают способы чтобы убрать тормоза из-за lookup? У компоненты Query для работы с БД нет LookupCashe свойства, которое рекомендуют в сети.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 756
Зарегистрирован: 20.07.2013 01:04:30

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru
cron