Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Вниз

кэширование данных связанных таблиц 


UncleRu   (2002-03-16 19:17) [0]

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



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

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



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

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

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



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

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



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

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



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

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



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

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

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



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

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




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.015 c
1-46396           ded_di                2002-04-02 13:05  2002.04.15  
печать rtf


1-46325           QWest                 2002-04-02 17:49  2002.04.15  
Где ошибка?


3-46268           Sergey_R              2002-03-23 19:13  2002.04.15  
Вложенный подзапрос.


3-46259           MixVictor             2002-03-25 20:37  2002.04.15  
Бд на машине без Delphi


1-46399           Schummi               2002-03-30 08:08  2002.04.15  
Panel:=TPanel.Create(Form);