Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

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

 
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.



Страницы: 1 вся ветка

Текущий архив: 2002.04.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
3-46295
IronHawk
2002-03-21 10:58
2002.04.15
Иммитация нажатия клавиш DBNavigator !


3-46236
Malder
2002-03-18 20:43
2002.04.15
Добавление информации к Blob полю


3-46265
XanderMan
2002-03-25 21:35
2002.04.15
Извлечение дня, месяца и года из поля типа Date в InterBase


1-46378
Tpv
2002-04-01 14:58
2002.04.15
Быстрые клавиши (MainMenu)


3-46256
alexpsico
2002-03-25 19:06
2002.04.15
как сбросить кэш БДЕ на винт