Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.019 c
14-1086028083
Drakon
2004-05-31 22:28
2004.06.20
Компиляция исходников C/C++


14-1086041201
lak
2004-06-01 02:06
2004.06.20
зацените и скажите


1-1085493215
Виноградов Алексей
2004-05-25 17:53
2004.06.20
Файл текстового типа (textfile). Как узнать его размер ?


1-1086327501
Sea Eagle
2004-06-04 09:38
2004.06.20
Работа с документом MS Word без установленного Офиса?


14-1086248857
___
2004-06-03 11:47
2004.06.20
И с чего бы это?




   Наверх