Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.003 c
15-1310278541
antonn (work)
2011-07-10 10:15
2011.11.06
fastmm4 и работа без ide


3-1265617737
Tornado
2010-02-08 11:28
2011.11.06
Что нужно добавить в дистриб?


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


15-1310424630
R_R
2011-07-12 02:50
2011.11.06
Как протестировать работу с интернетом?


1-1271002801
GreyWolf
2010-04-11 20:20
2011.11.06
Установка Parent Interface на мой интерфейс из другой TypeLibrary





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский