powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кэширование.
5 сообщений из 5, страница 1 из 1
Кэширование.
    #32214204
Фотография Rin@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!

Нашел в Delphi 5 два примера кэширования. Разобрался с ними без проблем. Даже создал свой работающий аналогичный пример с 4-мя ранее заполненными таблицами.
Но возникла проблема. Не понимаю как организовать ввод новых данных для 2-х связанных таблиц (1:N)? Я ввел значения 1-й записи "родительской" таблицы, перешел к "дочерней", заполнил ее своими значениями.
Затем создал 2-ю запись в "родительской". Вернулся к 1-й "родительской" и обнаружилось, что записи в "дочерней" исчезли. Получается, что "дочерние" записи надо хранить во временной (на диске или в кэше) таблице?

Pardon, если чего-то не досказал и получилось немного туманно :-).
...
Рейтинг: 0 / 0
Кэширование.
    #32214418
Guest_Paul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дочерней таблице Post сделал?
А id родительской записи проставил в дочернии?
...
Рейтинг: 0 / 0
Кэширование.
    #32214533
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это классическая ошибка при работе с master-detail. У таблицы master до вызова post неопределено ключевое поле. При этом записи в доечрней таблице создаются, но в поле связи у них забито NULL. Можете проверить, они все в таблице остались, но ни с чем не связаны. :)

Я обычно вставляю в событие OnBeforeInsert дочерней таблицы проверку на то, в каком состоянии находится главная таблица. Если в режиме добавления записи, то вызываю ей post (если это возможно по логике работы). В некоторых случаях, правда, приходится переделывать процедуру создания новой записи таким образом, чтобы запись в главной таблице принудительно создавалась и сразу вызывался post, а после этого DataSet переводится в режим редактирования. Естественно, что тогда это всё далается ручками и в DBGrida отключается возможность автоматического добавления новых записей.
...
Рейтинг: 0 / 0
Кэширование.
    #32224667
paull
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Боюсь, что использовать master-detail (в смысле как его предлагает DELPHI) и кэширование совместно невозможно.

И дело даже не в том, что master-dataset (кэшируемый) должен содержать только 1 запись! (иначе при переходе к др. записи обновляется detail-dataset, то бишь невозможно их оба держать в кэшированном виде чтобы потом сделать CancelUpdates).

Беда в том, что как только у master-datasource меняется DataSetState (dsBrowse -> dsEdit при начале редактирования, или, напр. dsInsert -> dsBrowse при сохранении новой записи), так сразу же идет каскад событий с detail-dataset: Close и Open (т.е. он в обязательном порядке перечитывается).
И в итоге:
1) Если сначала отредактировать detail-dataset, а затем попытаться редактировать master, то у detail сразу все изменения гикнутся.
2) Что гораздо хуже: если вставить новую запись в master, ввести соответствующие записи в detail, то при сохранении (ApplyUpdates) после сохранения master dataset, в detail уже нечего сохранять ! Они тоже тю-тю...

Я долго ломал голову, пытаясь сообразить, как все это гадство обмануть, и не придумал ничего лучшего, чем отменить связь master-detail двух query на уровне св-ва DataSource для detail-query.
Теперь формально они независимы и никакие действия над master dataset'ом не вызовут за моей спиной никаких действий с detail dataset.
Ну а мне приходится (в качестве платы за это) самому везде прописывать руками необходимые действия над detail (переопределяя его параметры и переоткрывая при необходимости).
...
Рейтинг: 0 / 0
Кэширование.
    #32224949
mpro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто это надо все оформить как компонент
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кэширование.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]