Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-46424
Zeerov
2002-04-02 16:59
2002.04.15
Помогите новичку


1-46373
Biorobot
2002-04-01 19:00
2002.04.15
Как открыть И-нет explorer из программы, да не проосто,


3-46255
@andrew
2002-03-20 12:42
2002.04.15
Привет Всем! Как бороться с ошибкой.


1-46360
MAxiMum
2002-04-03 19:42
2002.04.15
Pascal + ООП = ???


14-46498
Бомж
2002-03-06 20:20
2002.04.15
Надоело добираться полтора часа до работы!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский