Текущий архив: 2004.06.20;
Скачать: CL | DM;
Вниз
Синхронизация наборов данных. Найти похожие ветки
← →
VLAD-MAL (2004-05-25 13:12) [0]Извиняюсь, кого отвлек в ветке Interbase/Firebird... Этот вопрос касается вообще работе с базами данных в Delphi. И так:
Исходные данные:
1. На форме/фрейме в DBGrid отображается набор данных (используется TpFIBDataSet, но это неважно).
2. Вызывается для добавления/редактирования специальная форма, которая в отдельной транзакции выполняет добавление/редактирование, результат (в т.ч. новый ID записи при добавлении) возвращается в базовую форму.
3. При успешном обновлении выполняется Refresh текущей записи(с параметрами транзакций проблем нет: write, nowait, rec_version, read_committed; более того, возможна работа в той же самой транзакции). Все отображается ОК.
Вопрос: как в исходном наборе данных получить доступ к записи, не измененной, а добавленной во "внешней" процедуре?
Дополнительно:
----------------
- Набор данных может быть достаточно велик, поэтому вызов метода FullRefresh нежелателен;
- CachedUpdates = False.
---------------------------
Подскажите!
Спасибо.
← →
Курдль © (2004-05-25 13:19) [1]Принимать из вызываемой функции (которая открывает "спец. форму") параметры введенной записи и делать исходному НД append.
← →
Соловьев © (2004-05-25 13:20) [2]
> Набор данных может быть достаточно велик, поэтому вызов
> метода FullRefresh нежелателен;
Как раз так и надо. Ну или Close, Open;
Исходный набор данных должен читать данные в транзакции:
read, nowait, rec_version, read_committed;
← →
Соловьев © (2004-05-25 13:23) [3]
> [1] Курдль © (25.05.04 13:19)
действительно :) я пошел не вту степь :)
← →
VLAD-MAL (2004-05-25 13:35) [4]1.
Принимать из вызываемой функции (которая открывает "спец. форму") параметры введенной записи и делать исходному НД append.
Ох, нельзя. На форме юзер вводит разные данные, которые д.б. введены в "исходный" НД, а потом - в "дополнительный". Именно в таком порядке. Поэтому, если был успешный Insert, а затем еще один Insert в другом НД (но той же транзакции), но неуспешный -> RollBack, то в исходном НД будет отображается фиктивная запись.
2.
Спасибо. Как я сам не догадался?
← →
Johnmen © (2004-05-25 13:36) [5]>Курдль © (25.05.04 13:19) [1]
Не пройдет.
>VLAD-MAL
См. Соловьев © (25.05.04 13:20) [2]
← →
Курдль © (2004-05-25 13:44) [6]
> VLAD-MAL (25.05.04 13:35) [4]
> Ох, нельзя. На форме юзер вводит разные данные, которые
> д.б. введены в "исходный" НД, а потом - в "дополнительный".
> Именно в таком порядке. Поэтому, если был успешный Insert,
> а затем еще один Insert в другом НД (но той же транзакции),
> но неуспешный -> RollBack, то в исходном НД будет отображается
> фиктивная запись.
Транзакции-шманзакции... А что, вызываемая функция не способна определить, успешна ли цепочка Insert-ов, или нет? Если успешна - пусть добавляет куда хочет и в какой угодно последователльности!
> Johnmen © (25.05.04 13:36) [5]
> >Курдль © (25.05.04 13:19) [1]
>
> Не пройдет.
Что не пройдет?
Не пройдет, если только в "специально обученной форме" применялся тот же ДатаСэт, что и в вызывающей. А кто же так делает?
← →
VLAD-MAL (2004-05-25 13:45) [7]Спасибо - это я Соловьеву, только забыл смайлик добавить.
Короче - все просто: все делаем в том же набре данных, но на другой форме. В AfterUpdate. Если при повторном Insert случается ексцепшн, то не только Rillback, но и Delete фиктивной записи. При Update, естественно, Refresh вместо Delete.
--------------------
Спасибо за компанию.
← →
Johnmen © (2004-05-25 13:49) [8]>Курдль © (25.05.04 13:44) [6]
>Не пройдет, если только в "специально обученной форме"
>применялся тот же ДатаСэт, что и в вызывающей. А кто же так
>делает?
Не пройдет именно в том случае, кот.описан автором. Т.е. НЕ применялся тот же ДатаСэт
← →
VLAD-MAL (2004-05-25 16:01) [9]Извините, не удержался: тут один чел предложил решение, полностью отвечающее первоначально поставленным условиям (правда, только для компонента TpFIBDataSet) использовать метод CacheInsert.
Может, кому интересно будет.
← →
Johnmen © (2004-05-25 18:21) [10]>VLAD-MAL
Сколько ж у тебя ников... :)))
>(25.05.04 16:01) [9]
Что будет c содержимым буфера под CacheInsert, если DoRefresh ?
У меня нет однозначного ответа...
Страницы: 1 вся ветка
Текущий архив: 2004.06.20;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.03 c