![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IBDataset обновляет не все поля [D6, Firebird 2.1]
Степан © (2010-02-05 07:09:00)Здравствуйте!
Подскажите, что я делаю не так.
На главной форме IBdataset+DBGrid отображают реестр заказов:
SelectSQL
select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust
where
cust.id = ord.cust_id
в модальной форме добавляю новый заказ, при ее закрытии делаю Post. Поля таблицы orders обновляются, а cust.name - нет.
RefreshSQL
select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust
where
cust.id = ord.cust_id and ord.id = :id
Виталий Панасенко(дом) (2010-02-06 20:06:00) [1]
> Степан (06.02.10 19:05) [36]
просто проблема "надуманная"... нужно было "тупо"(в смысле, без всякой фантазии) получить ord.id (или :id в твоем варианте).. вот и все... нормально используй GeneratorField... но, допустим, FIBPlus могут использовать RETURNING для FireBird.. т.е., ВСЕ, что сделал триггер/ХП(новое значение, удаление, изменение) возможно получить на клиенте.. IBX(закладка InterBase) этого не умеет.. или умеет криво.. вот и все... а ты, я так понял, получал ord.id на сервере, соответственно, о его значении клиент ничего не знает(я о программе) и твой запрос на рефреш
> RefreshSQL
> select
> ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
> from
> orders ord, customers cust
> where
> cust.id = ord.cust_id and ord.id = :id
>
"гонит"
Степан (2010-02-06 19:05:00) [2]Я так понял, что никто из участующих в обсуждении с данной проблемой никогда не сталкивался.
Проблема решена.
Если кому интересно:
SelectSQL относится к данным в целом, а все остальные запросы: InsertSQL, RefreshSQL, DeleteSQL имееют оношение только к текущей записи.
Поэтому они должно иметь не только ссылку на :ID или :OLD_ID (в зависимости от ситуации) в условии WHERE, но все все остальные прибамбамысвойственные SQL-запросам ( это про выкрутасы от Сергей М. ©).
Проблема заключалась в генераторе поля ORD.ID. Значение должно получаться только локально (On New Record), тогда IBdataset может полноценно им оперировать, инче он не зает его значения, ну и все вытекующие последствия отсюда.
Проработал все возможные пути решения проблемы, спасибо Варианту, хотя его предположение и не было столь уверенным.
Спасибо всем за участие.
Виталий Панасенко(дом) (2010-02-06 19:03:00) [3]ой!а ord.ID?
Степан (2010-02-06 18:54:00) [4]CUST_ID я не генерю ни на сервере ни локально > [24] про DBLookupComboBox
Виталий Панасенко(дом) (2010-02-06 00:13:00) [5]Видимо все-таки ты CUST_ID так и не научился получать..Ни на клиенте, ни с использованием GeneratorField. Я так думаю, там же генератор используется? только в триггере вызывается GEN_ID
Loginov Dmitry (2010-02-05 20:58:00) [6]
> в модальной форме добавляю новый заказ, при ее закрытии
> делаю Post. Поля таблицы orders обновляются, а cust.name
> - нет.
Ну не может IBDataSet автоматически связать твой INSERT и твой RefreshSQL! Тогда вообще зачем париться? После закрытия модальной формы делай IBDataSet1.Close, а затем IBDataSet1.Open. Вариант кстати ОЧЕНЬ даже стандартный.
Степан (2010-02-05 19:54:00) [7]> Sergey13
Зачем ручной код если есть средства визуального программирования, Append, и Post или Cancel - это единственный код, который я написал, остальное же настойка компонент.
> Вариант
> [24] При переоткрытии IBDataset все обновляется, оно и понятно работает > SQLSelect, но это плохое решение проблемы
Sergey13 (2010-02-05 13:19:00) [8]> [24] Степан (05.02.10 11:51)
> Пре переоткрытии IBDataset все обновляется, оно и понятно
> работает SQLSelect, но это плохое решение проблемы
Это пока и не решение вовсе, а вытягивание из ТЕБЯ, как из партизана, подробностей ТВОЕЙ проблемы.
Ты кроме Post никак модифицируемые запросы руками не запускаешь (где то видел таке)?
> [28] Степан (05.02.10 12:21)
> Если нужно подробно:
Код такой секретный?
Вариант (2010-02-05 12:43:00) [9]
> Степан (05.02.10 12:21) [28]
Хорошо, осталось вытащит пару ответов на ранее заданные вопросы
И что ответишь на вопрос
> Sergey13 © (05.02.10 11:44) [22]
> А после переоткрытия датасета или перезапуска программы
> все поля видны нормально?
Приведи значения всех полей записи после INSERT - тоже интересно глянуть, может там и увидим что ord.id есть NULL например или что еще -а то задавать наводящие вопросы издалека трудно. Отладчиком по коду пройти не можем, свойства глянуть не можем -вот и выдвигаем разные догадки. Дай исходные данные в виде - "а что у нас получилось сразу после INSERT, когда не видно поле cust.name" - интересны все поля
Степан (2010-02-05 12:21:00) [10]> Сергей М.
1) я опускаю подробности, которые к делу не относятся
Если нужно подробно:
на модальной форме две кнопки ОК(mrOK) и Отмена(mrCancel), при закрытии формы обработка ModalResult: = mrOK -> Post, = не mrOK -> Cancel
2) Обновления не кэшируются, CachedUpdates = False
3) RefreshSQL =
select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust
where
cust.id = ord.cust_id and ord.id = :id
Сергей М. (2010-02-05 12:14:00) [11]
> пере открытие модальной формы
> IBDataset1.Append;
> при закрыти
> with IBDataSet1 do if Modified then Post;
А если юзер открыл форму ошибочно ?
Или, не дай бог, открыл, ушел в сортир и не вернулся оттуда ?)
Вариант (2010-02-05 12:09:00) [12]И еще интересует поле CachedUpdates.
А так кроме того - приведи значения всех полей записи после INSERT - тоже интересно глянуть
Вариант (2010-02-05 12:00:00) [13]
> Степан (05.02.10 11:51) [24]
Любой - это уже не правильно для данного случая. Надо получать на клиенте. ID должен быть известен до того как произойдет реальная вставка для твоего случая.
В каком виде сейчас RefreshSQL? И что ответишь на вопрос
> Sergey13 © (05.02.10 11:44) [22]
> А после переоткрытия датасета или перезапуска программы
> все поля видны нормально?
Степан (2010-02-05 11:51:00) [14]> Виталий Панасенко(дом)
пробовал любой способ получения значения, результат тотже
> Sergey13
пере открытие модальной формы
IBDataset1.Append;
при закрыти
with IBDataSet1 do if Modified then Post;
когда в модальной форме в DBLoopkupComboBox выбираешь значение, то на главной форме в DBGrid оно сразу отображается
Пре переоткрытии IBDataset все обновляется, оно и понятно работает SQLSelect, но это плохое решение проблемы
Вариант (2010-02-05 11:49:00) [15]
> Степан (05.02.10 11:40) [19]
Хорошо, сомнения правда развеяли не полностью
Где он его задает? Каким образом - подробней , как это задали, как это сделали? И еще CashedUpdate чему равно?
Sergey13 (2010-02-05 11:44:00) [16]> [0] Степан (05.02.10 07:09)
> Поля таблицы orders обновляются, а cust.name - нет.
А после переоткрытия датасета или перезапуска программы все поля видны нормально?
> [19] Степан (05.02.10 11:40)
> Поле CUST_ID заполнено
Пока это только твое мнение. Код жалко выложить?
Виталий Панасенко(дом) (2010-02-05 11:44:00) [17]А ты это значение получаешь на клиенте?
Степан (2010-02-05 11:42:00) [18]> Sergey13
Поле CUST_ID заполняется через DBLookupComboBox в модальной форме
Степан (2010-02-05 11:40:00) [19]> Sergey13
Поле CUST_ID заполнено
> Вариант
значение поля ord.id задает генератор
Вариант (2010-02-05 10:40:00) [20]
> Степан (05.02.10 07:09)
> insert into orders
> (CUST_ID, DATE_REG, SUMMA)
> values
> (:CUST_ID, :DATE_REG, :SUMMA
) -
а где и как формируется
ord.id ?