Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

кэширование данных связанных таблиц [D6, IB6.x]


UncleRu ©   (2002-03-16 19:17:00) 

Никак не могу завершить свои мученья с кэшированными данными. Проблемс в следующем. Есть два IBQuery, в одном наборе из родительской, в другом - из дочерней таблиц данные, связанные между собой ключом. У обоих CacheUpdate:=True. Провожу вставку записей в обе таблицы. После Post данные отображаются в обеих Grid как и положено, но после того как начинаешь перемещаться в родительском гриде, кэшированные данные в дочернем IBQuery исчезают, т.е. IBQuery2.UpdatesPending=False. При выполнении ApplayUpdates, естественно, заносятся в БД только данные IBQuery1. Кто сталкивался с подобной проблемой, помогите, пожалуйста.


andrey_m   (2002-03-25 08:17:00) [1]

>UncleRu: Можно и через DataSource.DataChange, только нужно присвоив параметру значение, сделай Close<->Open дочерней Query, тогда ты увидишь нужные записи. Только проблема исчезновения записей после Postа и перемещения по родительской Query остается. Я думаю тебе нужно после редактирования/вставки данных в дочерней Query, для текущей записи в родительской Query,
сохранять данные в дочерней Query.


Гоша   (2002-03-22 18:24:00) [2]

>UncleRu:
Брат, ты не там роешь!:

1. На detail.BeforeOpen вешай обработчик присвоения параметрам значений из master.
2. На master.AfterScroll вешай что-нибудь на тему "RefreshDetail" - типа закрыть/открыть.
3. На master.BeforeScroll обрабатывай сохранение изменений в detail.
4. Ну и т.д. Дальше сам будешь смотреть, чего и где дописывать (напр. в обработчик detail.BeforeOpen вставишь проверку на пустоту master, когда встретишься с этой ошибкой. И т.п.)


UncleRu   (2002-03-22 17:56:00) [3]

Не могу никак соединить ВРУЧНУЮ эти таблицы. Для связи исползую событие родителского DataSource.DataChange, выполняю там присваивание параметру IBQSlave.Params[0].AsInteger:=IBQMasterMASTER_ID.Value;затем обновляю содержимое дочернего набора данных - IBQSlave.Refresh. В дочернем гриде ничего не изменяется. Что я делаю не так? Помогите!!!!


andrey_m   (2002-03-18 14:27:00) [4]

>UncleRu: Данные при перезапрашивании (открытие<->закрытие)IBQuery2 будут теряться если они не сохранены на сервере.
Но, так как IBQuery независимы, то изменения сохранятся для каждого IBQuery (при вставке/изменении данных). По крайней мере, так должно быть. Сначала сохранятся данные для IBQuery1, а потом для IBQuery2.
Попробуешь, поделись результатами. Удачи.


Гоша   (2002-03-18 13:09:00) [5]

>UncleRu: оказывается, и для компонент IB такая же дрянь ! (Я налетел на это при использовании стандартных TQUERY и CACHED UPDATES). Совет: не используй в этом случае НИКОГДА DataSource для связывания detaul-query с master - ни фига не выйдет (если, конечно, тебе требуется не только читать).
Связь организуешь руками, и руками же определяешь, когда записывать изменения в БД...
А касаемо: "после того как начинаешь перемещаться в родительском гриде, кэшированные данные в дочернем IBQuery исчезают" то тут, надеюсь все понятно - если внес изменения в detail, то перед перемещениием по master реши - сохранять или сбрасывать изменения в detail.


UncleRu   (2002-03-18 10:53:00) [6]

В ключевое поле родительской таблицы ID проставляется на сервере InterBase генератором, а в IBQuery1 ID проставляется с помощью GeneratorField. При выполнении insert в дочерюю таблицу, ID присваивается значение IBQuery1ID.Value. При Post никаких ошибок не возникает.

Спасибо за совет, буду пробовать. Но сразу возникает ламерский вопрос. А если перезапрашивать IBquery2 данные в кэше не будут теряться? Ведь при перезапрашивании придётся закрыть и снова открыть IBQuery2. Или я что-то не так понял...


andrey_m   (2002-03-18 08:34:00) [7]

Дело все в том, что при ApplyUpdates для IBQuery1 дочерняя IBQuery2 перезапрашивается, соответственно кэш теряется для IBQuery2 (это если связь через DataSource).
Эту проблему можно решить если не связывать IBQuery1 и IBQuery2 через DataSource (сделать их не зависимыми), а при перемещении по родительской IBQuery1 перезапрашивать IBQuery2 со значениями
ID от IBQuery1. Тогда сохранение данных будет не зависимым.
И ещё, напиши как проставляется значение в ключевое поле ID, на какое событие, и не выдается ли сообщение об ошибке при отсутствии ID для IBQuery2.


Наверх

Титульная страница Поиск, карта сайта Написать письмо