Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.009 c
15-1310117366
Bober1
2011-07-08 13:29
2011.11.06
service application


1-1271765959
opolo2000
2010-04-20 16:19
2011.11.06
WorkSheet.Activate в Office2007


15-1310278541
antonn (work)
2011-07-10 10:15
2011.11.06
fastmm4 и работа без ide


15-1310329795
Юрий
2011-07-11 00:29
2011.11.06
С днем рождения ! 11 июля 2011 понедельник


2-1310474200
SIV5000
2011-07-12 16:36
2011.11.06
JPEG error + on E: Exception