Форум: "Базы";
Текущий архив: 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.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c