Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Синхронизация наборов данных. [D7, FireBird 1.5]


VLAD-MAL ©   (2004-05-25 13:12:00) 

Извиняюсь, кого отвлек в ветке Interbase/Firebird... Этот вопрос касается вообще работе с базами данных в Delphi. И так:

Исходные данные:

1. На форме/фрейме в DBGrid отображается набор данных (используется TpFIBDataSet, но это неважно).

2. Вызывается для добавления/редактирования специальная форма, которая в отдельной транзакции выполняет добавление/редактирование, результат (в т.ч. новый ID записи при добавлении) возвращается в базовую форму.

3. При успешном обновлении выполняется Refresh текущей записи(с параметрами транзакций проблем нет: write, nowait, rec_version, read_committed; более того, возможна работа в той же самой транзакции). Все отображается ОК.

Вопрос: как в исходном наборе данных получить доступ к записи, не измененной, а добавленной во "внешней" процедуре?

Дополнительно:
----------------
- Набор данных может быть достаточно велик, поэтому вызов метода FullRefresh нежелателен;
- CachedUpdates = False.

---------------------------
Подскажите!

Спасибо.


Johnmen   (2004-05-25 18:21:00) [1]

>VLAD-MAL  

Сколько ж у тебя ников... :)))

>(25.05.04 16:01) [9]

Что будет c содержимым буфера под CacheInsert, если DoRefresh ?
У меня нет однозначного ответа...


VLAD-MAL   (2004-05-25 16:01:00) [2]

Извините, не удержался: тут один чел предложил решение, полностью отвечающее первоначально поставленным условиям (правда, только для компонента TpFIBDataSet) использовать метод CacheInsert.

Может, кому интересно будет.


Johnmen   (2004-05-25 13:49:00) [3]

>Курдль ©   (25.05.04 13:44) [6]
>Не пройдет, если только в "специально обученной форме"
>применялся тот же ДатаСэт, что и в вызывающей. А кто же так
>делает?

Не пройдет именно в том случае, кот.описан автором. Т.е. НЕ применялся тот же ДатаСэт


VLAD-MAL   (2004-05-25 13:45:00) [4]

Спасибо - это я Соловьеву, только забыл смайлик добавить.

Короче - все просто: все делаем в том же набре данных, но на другой форме. В AfterUpdate. Если при повторном Insert случается ексцепшн, то не только Rillback, но и Delete фиктивной записи. При Update, естественно, Refresh вместо Delete.

--------------------
Спасибо за компанию.


Курдль   (2004-05-25 13:44:00) [5]


> 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]
>
> Не пройдет.

Что не пройдет?
Не пройдет, если только в "специально обученной форме" применялся тот же ДатаСэт, что и в вызывающей. А кто же так делает?


Johnmen   (2004-05-25 13:36:00) [6]

>Курдль ©   (25.05.04 13:19) [1]

Не пройдет.

>VLAD-MAL

См. Соловьев ©   (25.05.04 13:20) [2]


VLAD-MAL   (2004-05-25 13:35:00) [7]

1.
Принимать из вызываемой функции (которая открывает "спец. форму") параметры введенной записи и делать исходному НД append.

Ох, нельзя. На форме юзер вводит разные данные, которые д.б. введены в "исходный" НД, а потом - в "дополнительный". Именно в таком порядке. Поэтому, если был успешный Insert, а затем еще один Insert в другом НД (но той же транзакции), но неуспешный -> RollBack, то в исходном НД будет отображается фиктивная запись.

2.
Спасибо. Как я сам не догадался?


Соловьев   (2004-05-25 13:23:00) [8]


> [1] Курдль ©   (25.05.04 13:19)

действительно :) я пошел не вту степь :)


Соловьев   (2004-05-25 13:20:00) [9]


> Набор данных может быть достаточно велик, поэтому вызов
> метода FullRefresh нежелателен;

Как раз так и надо. Ну или Close, Open;
Исходный набор данных должен читать данные в транзакции:
read, nowait, rec_version, read_committed;


Курдль   (2004-05-25 13:19:00) [10]

Принимать из вызываемой функции (которая открывает "спец. форму") параметры введенной записи и делать исходному НД append.


Наверх

Титульная страница Поиск, карта сайта Написать письмо