Страница 1 из 2
Lookup поля
Добавлено: 08.02.2018 12:01:58
Mikhail
Господа, кто подскажет, как работать с подстановочными полями?
Интересует содержимое 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 - это запрос
В DbGrid подстановочное поле работает, в том смысле что оно правильно отображается, но при попытке модификации выдает ошибку ModifySQL следующий
Код: Выделить всё
UPDATE goods SET
fkcat = :lkcat
WHERE pkgoods = :pkgoods;
В чем ошибка?

Re: Lookup поля
Добавлено: 08.02.2018 18:02:33
pupsik
В чем ошибка?
нет запроса на редактирование, удаление и изменение.
Re: Lookup поля
Добавлено: 08.02.2018 18:18:19
Mikhail
pupsik писал(а):В чем ошибка?
нет запроса на редактирование, удаление и изменение.
На выборку и редактирование есть, я их даже привел.
Re: Lookup поля
Добавлено: 08.02.2018 19:06:01
pupsik
На выборку и редактирование есть, я их даже привел.
уж проще бы тестовый пример приложили...
У меня ваш
ModifySQL вызывает смутные вопросы:
Если верно понял что там написано: вы хотите изменить строку в таблице goods значениями из самого goods ? Т.е. затрагиваются 2 поля: pkgoods и fkcat. Зачем тогда 2-я таблица и связь с ней по полю?
Re: Lookup поля
Добавлено: 08.02.2018 19:17:15
Mikhail
pupsik писал(а):На выборку и редактирование есть, я их даже привел.
уж проще бы тестовый пример приложили...
У меня ваш
ModifySQL вызывает смутные вопросы:
Если верно понял что там написано: вы хотите изменить строку в таблице goods значениями из самого goods ? Т.е. затрагиваются 2 поля: pkgoods и fkcat. Зачем тогда 2-я таблица и связь с ней по полю?
Уже решено, что-то я ступил. Надо так.
Код: Выделить всё
UPDATE goods SET
fkcat = :fkcat
WHERE pkgoods = :pkgoods;
Еще есть вопросы по транзакциям, когда они работают?
Re: Lookup поля
Добавлено: 08.02.2018 19:51:33
pupsik
fkcat = :lkcat
ну а вдруг вы забыли о том что объявили где то параметр :lkcat?
Еще есть вопросы по транзакциям, когда они работают?
конкретно в FB их 2 (при чтении) и более.
Ну а так:
для стартаИли на этом форуме посмотрите.
Re: Lookup поля
Добавлено: 08.02.2018 20:04:28
Mikhail
pupsik писал(а):ну а вдруг вы забыли о том что объявили где то параметр :lkcat?
Это поле подстановки.
Re: Lookup поля
Добавлено: 08.02.2018 20:20:00
pupsik
Это поле подстановки.
это ясно и с первого поста. Но ведь можно и параметр указать в SQL и просто забыть о этом написать. Т.е. вырезки из кода - замечательно. Но..о это не пример с "багом.?".
Т.е. вы написали куски кода, а остальным гадать что же там теоретически должно быть. Возможно это и весело (мурашками в голове шевелить и гадать). Но вы сами себе добавляете вариант "не дождаться ответа и самому решать проблему".
И кстати: часто подготовка не работающего примера помогает самому выявить проблему.
Re: Lookup поля
Добавлено: 08.02.2018 21:14:09
Mikhail
pupsik писал(а):Это поле подстановки.
это ясно и с первого поста. Но ведь можно и параметр указать в SQL и просто забыть о этом написать. Т.е. вырезки из кода - замечательно. Но..о это не пример с "багом.?".
Т.е. вы написали куски кода, а остальным гадать что же там теоретически должно быть. Возможно это и весело (мурашками в голове шевелить и гадать). Но вы сами себе добавляете вариант "не дождаться ответа и самому решать проблему".
И кстати: часто подготовка не работающего примера помогает самому выявить проблему.
Вообще-то я все написал и про поле и запросы, Вы просто не внимательно прочитали.
И к вопросу о транзакциях, когда стартует читающая в ibx? Когда edit вызываем для dataset или post? Читающая транзакция активна все время пока датасет активен?
Re: Lookup поля
Добавлено: 08.02.2018 21:59:44
pupsik
Читающая транзакция активна все время пока датасет активен?
Если вы о св-ве Active. То, по логике активируется доступ к базе, таблице... активируется транзакция. При закрытии, в простом случае, закрывается. Но вот по поводу
читающая (не знаю что вы под этим понимаете)...
Когда edit вызываем для dataset или post?
можно для каждого действия повесить свою. И управлять ими.
п.с.
Вы просто не внимательно прочитали.
хм... спорный вопрос. Но он не важен. И не интересно сразу выложить то что
показалось, вдруг оно показалось

лирика:
Интересно: если код написан с ошибкой. Он есть, или его нет?
Re: Lookup поля
Добавлено: 09.02.2018 13:43:56
Mikhail
Теперь вопрос о связке двух таблиц, главная-подчиненный - есть у кого пример как это сделать?
Re: Lookup поля
Добавлено: 09.02.2018 18:47:57
pupsik
Mikhail Простой
пример с исходниками (ссылки на странице).
Re: Lookup поля
Добавлено: 09.02.2018 22:56:49
Mikhail
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);
Это штатный способ решения такой задачи?

Re: Lookup поля
Добавлено: 10.02.2018 00:03:11
pupsik
вы просили пример... Хотя, возможно, примера под определённый сервер и не существует. Главное: основы даны.
В чем проблема?
отсутствие проекта (примера), наличие выдержек. Ну не фонтан догадываться что и где не так.
Это штатный способ решения такой задачи?
а кто его знает. См. выше.
Re: Lookup поля
Добавлено: 19.06.2019 15:37:20
Sharfik
Вопрос по той же теме.
Есть вместо DBGrid компонент VirtualDBGrid. Из таблицы берем данные, и соответственно где то не текст, а номера id для других таблиц.
Собственно при форматировании полей VirtualDBGrid делает несколько lookup запросов к двум, трем другим dataset.
Какие бывают способы чтобы убрать тормоза из-за lookup? У компоненты Query для работы с БД нет LookupCashe свойства, которое рекомендуют в сети.