Текущий архив: 2011.11.06;
Скачать: CL | DM;
Вниз
IBDataset обновляет не все поля Найти похожие ветки
← →
Степан (2010-02-05 07:09) [0]Здравствуйте!
Подскажите, что я делаю не так.
На главной форме 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-05 08:44) [1]select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust /* объединение таблиц по ключ.полям происходит ЗДЕСЬ */
where
cust.id = ord.cust_id /* А это что за where-выкрутасы ? Таблиы ведь УЖЕ объединены в WHERE-статье твоего SELECT-предложения */
← →
Степан (2010-02-05 08:54) [2]Что тогда писать в RefreshSQL?
← →
Сергей М. © (2010-02-05 09:06) [3]Для начала убери в те же WHERE-выкрутасы и из RefreshSQL
← →
Степан (2010-02-05 09:16) [4]Хорошо, оставил так
select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust
← →
Сергей М. © (2010-02-05 09:17) [5]У куда делось ord.id = :id ?
← →
Степан (2010-02-05 09:21) [6]select
ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
from
orders ord, customers cust
where
ord.id=:id
← →
Сергей М. © (2010-02-05 09:26) [7]Параметр id, надо понимать, содержить ключ новой записи таблицы odrers ?
← →
Степан (2010-02-05 09:31) [8]да
← →
Сергей М. © (2010-02-05 09:41) [9]Т.е. ты утверждаешь, что в рез-те последовательности
IBdataset.Insert
..
IBdataset.Post
..
IBdataset.Refresh
поле cust.name вновь добавленной записи выглядит в гриде пустым, так ?
← →
Степан (2010-02-05 09:44) [10]да, так
← →
Сергей М. © (2010-02-05 09:47) [11]автокоммит транзакции = True ?
← →
Виталий Панасенко(дом) (2010-02-05 09:49) [12]refreshsql, по-моему кривой...
where ord.id=old.id, кажись так
← →
Степан (2010-02-05 09:51) [13]у транзакции DefaultAction = TACommit
← →
Sergey13 © (2010-02-05 09:58) [14]> [1] Сергей М. © (05.02.10 08:44)
> Таблиы ведь УЖЕ объединены в WHERE-статье твоего SELECT- предложения
Так разные запросы то на выборку и на рефреш. Вроде все правильно тут.
> [0] Степан (05.02.10 07:09)
> в модальной форме добавляю новый заказ, при ее закрытии делаю Post.
Давай код добавления? Конкретно как заполнен ord.cust_id?
← →
Степан (2010-02-05 10:02) [15]InsertSQL
insert into orders
(CUST_ID, DATE_REG, SUMMA)
values
(:CUST_ID, :DATE_REG, :SUMMA)
← →
Вариант (2010-02-05 10:26) [16]
> Сергей М. © (05.02.10 08:44) [1]
Если убрать в RefreshSQL свяку между таблицами, то что вернет запрос RefreshSQL? И вернет ли одну запись?
← →
Sergey13 © (2010-02-05 10:35) [17]> [15] Степан (05.02.10 10:02)
Не запрос а код в делфи, там где пост делаешь. Поле CUST_ID заполнено?
← →
Вариант (2010-02-05 10:40) [18]
> Степан (05.02.10 07:09)
> insert into orders
> (CUST_ID, DATE_REG, SUMMA)
> values
> (:CUST_ID, :DATE_REG, :SUMMA
) -
а где и как формируется
ord.id ?
← →
Степан (2010-02-05 11:40) [19]> Sergey13
Поле CUST_ID заполнено
> Вариант
значение поля ord.id задает генератор
← →
Степан (2010-02-05 11:42) [20]> Sergey13
Поле CUST_ID заполняется через DBLookupComboBox в модальной форме
← →
Виталий Панасенко(дом) (2010-02-05 11:44) [21]А ты это значение получаешь на клиенте?
← →
Sergey13 © (2010-02-05 11:44) [22]> [0] Степан (05.02.10 07:09)
> Поля таблицы orders обновляются, а cust.name - нет.
А после переоткрытия датасета или перезапуска программы все поля видны нормально?
> [19] Степан (05.02.10 11:40)
> Поле CUST_ID заполнено
Пока это только твое мнение. Код жалко выложить?
← →
Вариант (2010-02-05 11:49) [23]
> Степан (05.02.10 11:40) [19]
Хорошо, сомнения правда развеяли не полностью
Где он его задает? Каким образом - подробней , как это задали, как это сделали? И еще CashedUpdate чему равно?
← →
Степан (2010-02-05 11:51) [24]> Виталий Панасенко(дом)
пробовал любой способ получения значения, результат тотже
> Sergey13
пере открытие модальной формы
IBDataset1.Append;
при закрыти
with IBDataSet1 do if Modified then Post;
когда в модальной форме в DBLoopkupComboBox выбираешь значение, то на главной форме в DBGrid оно сразу отображается
Пре переоткрытии IBDataset все обновляется, оно и понятно работает SQLSelect, но это плохое решение проблемы
← →
Вариант (2010-02-05 12:00) [25]
> Степан (05.02.10 11:51) [24]
Любой - это уже не правильно для данного случая. Надо получать на клиенте. ID должен быть известен до того как произойдет реальная вставка для твоего случая.
В каком виде сейчас RefreshSQL? И что ответишь на вопрос
> Sergey13 © (05.02.10 11:44) [22]
> А после переоткрытия датасета или перезапуска программы
> все поля видны нормально?
← →
Вариант (2010-02-05 12:09) [26]И еще интересует поле CachedUpdates.
А так кроме того - приведи значения всех полей записи после INSERT - тоже интересно глянуть
← →
Сергей М. © (2010-02-05 12:14) [27]
> пере открытие модальной формы
> IBDataset1.Append;
> при закрыти
> with IBDataSet1 do if Modified then Post;
А если юзер открыл форму ошибочно ?
Или, не дай бог, открыл, ушел в сортир и не вернулся оттуда ?)
← →
Степан (2010-02-05 12:21) [28]> Сергей М.
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:43) [29]
> Степан (05.02.10 12:21) [28]
Хорошо, осталось вытащит пару ответов на ранее заданные вопросы
И что ответишь на вопрос
> Sergey13 © (05.02.10 11:44) [22]
> А после переоткрытия датасета или перезапуска программы
> все поля видны нормально?
Приведи значения всех полей записи после INSERT - тоже интересно глянуть, может там и увидим что ord.id есть NULL например или что еще -а то задавать наводящие вопросы издалека трудно. Отладчиком по коду пройти не можем, свойства глянуть не можем -вот и выдвигаем разные догадки. Дай исходные данные в виде - "а что у нас получилось сразу после INSERT, когда не видно поле cust.name" - интересны все поля
← →
Sergey13 © (2010-02-05 13:19) [30]> [24] Степан (05.02.10 11:51)
> Пре переоткрытии IBDataset все обновляется, оно и понятно
> работает SQLSelect, но это плохое решение проблемы
Это пока и не решение вовсе, а вытягивание из ТЕБЯ, как из партизана, подробностей ТВОЕЙ проблемы.
Ты кроме Post никак модифицируемые запросы руками не запускаешь (где то видел таке)?
> [28] Степан (05.02.10 12:21)
> Если нужно подробно:
Код такой секретный?
← →
Степан (2010-02-05 19:54) [31]> Sergey13
Зачем ручной код если есть средства визуального программирования, Append, и Post или Cancel - это единственный код, который я написал, остальное же настойка компонент.
> Вариант
> [24] При переоткрытии IBDataset все обновляется, оно и понятно работает > SQLSelect, но это плохое решение проблемы
← →
Loginov Dmitry © (2010-02-05 20:58) [32]
> в модальной форме добавляю новый заказ, при ее закрытии
> делаю Post. Поля таблицы orders обновляются, а cust.name
> - нет.
Ну не может IBDataSet автоматически связать твой INSERT и твой RefreshSQL! Тогда вообще зачем париться? После закрытия модальной формы делай IBDataSet1.Close, а затем IBDataSet1.Open. Вариант кстати ОЧЕНЬ даже стандартный.
← →
Виталий Панасенко(дом) (2010-02-06 00:13) [33]Видимо все-таки ты CUST_ID так и не научился получать..Ни на клиенте, ни с использованием GeneratorField. Я так думаю, там же генератор используется? только в триггере вызывается GEN_ID
← →
Степан (2010-02-06 18:54) [34]CUST_ID я не генерю ни на сервере ни локально > [24] про DBLookupComboBox
← →
Виталий Панасенко(дом) (2010-02-06 19:03) [35]ой!а ord.ID?
← →
Степан (2010-02-06 19:05) [36]Я так понял, что никто из участующих в обсуждении с данной проблемой никогда не сталкивался.
Проблема решена.
Если кому интересно:
SelectSQL относится к данным в целом, а все остальные запросы: InsertSQL, RefreshSQL, DeleteSQL имееют оношение только к текущей записи.
Поэтому они должно иметь не только ссылку на :ID или :OLD_ID (в зависимости от ситуации) в условии WHERE, но все все остальные прибамбамы свойственные SQL-запросам (это про выкрутасы от Сергей М. ©).
Проблема заключалась в генераторе поля ORD.ID. Значение должно получаться только локально (On New Record), тогда IBdataset может полноценно им оперировать, инче он не зает его значения, ну и все вытекующие последствия отсюда.
Проработал все возможные пути решения проблемы, спасибо Варианту, хотя его предположение и не было столь уверенным.
Спасибо всем за участие.
← →
Виталий Панасенко(дом) (2010-02-06 20:06) [37]
> Степан (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
>
"гонит"
Страницы: 1 вся ветка
Текущий архив: 2011.11.06;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.004 c