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

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

Вопрос по транзакции в InterBase [D6, IB6.x]


Страницы:   1 2

АТ ©   (2003-05-27 04:24:00) 

Пользователь заполняет данными несколько форм. После этого он нажимает на кнопку и все изменения сохраняются. Предполагается, что чтобы отобразить все изменения в базе надо выполнить несколько SQL-запросов, а между ними еще и посчитать что-нибудь. Хочу чтобы чтобы все изменения выполнялись в рамках одной транзакции.
Если я последовательно выполню ряд динамических SQL-запросов через компонент IBQuery в свойстве Transaction которого будет указан компонент IBTransaction. То по идее транзакция перед началом первого запроса должна открыться, а закрыться только тогда, когда я ее закрою по Commit, пропустив через себя все мои запросы не закрываясь. Так-ли это? (св-во AutoStopAction компонента IBTransaction установлен в saNone)


Danilka   (2003-05-27 10:31:00) [1]

Жук © (27.05.03 10:20)
Вроде со скоростью пока все ок, тормозов, или еще чего не заметил.


Жук   (2003-05-27 10:20:00) [2]

Тогда, наверное, оптимальный вариант :
1) Вставка Append"ом
2) Редактирование как

> xmrz (27.05.03 08:59)



> Danilka © (27.05.03 09:57)
> Вообще, я делаю так:

А на скорость это не влияет ?


xmrz   (2003-05-27 10:02:00) [3]

>Жук © (27.05.03 09:54)

1) bookmark больше подходит конечно при редактировании записей.
2) набор данных я обычно строю с сортировкой по времени вставки, поэтому если открыть его с преждними параметрами (при условии что в запросе нет условия которое отбросит свежевставленное значение как не удовлетворяющее выборке) и сделать ему Last, то курсор окажется как раз на нужной записи. Если же сортировка идёт не по времени вставки, тогда хранимая процедура должна возвращать ID вставленных данных, и потом в открытом НД ищи по этому ID через Locate.


Danilka   (2003-05-27 09:58:00) [4]

Жук © (27.05.03 09:55)
ну, тогда моя ссылка устарела.


Danilka   (2003-05-27 09:57:00) [5]

Вообще, я делаю так:
открываю транзакцию на чтение,
делаю активным IBQuery, на него у меня повешен ClientDataSet через DataSetProvider, который я тоже делаю активным.
закрываю IBQuery, завершаю транзакцию.
ClientDataSet, при этом остается активным, и в нем есть все записи, которые были в IBQuery.
А дальше уж можно делать с этими данными все что угодно.
Если юзеру надо записать данные, запуск транзакции, запись измененных данных и завершение транзакции происходят в одной процедуре.


Жук   (2003-05-27 09:55:00) [6]


> Danilka © (27.05.03 09:31)
> Жук © (27.05.03 09:25)
> Наверно. Под IBX я понимаю стандартные дельфовые компоненты
> работы с IB, которые лежат на закладке InterBase.

Угу. Понял. В Д6 неявные транзакции откатываются без проблем.


Жук   (2003-05-27 09:54:00) [7]


> xmrz (27.05.03 09:48)
> Используй bookmark

1) Когда НД закрывается новой записи ещё нет, значит марка не поможет.
2) Записи НД где-то отображаются (z.b. грид). С какими параметрами вы переоткрываете НД ? Ведь свежевнесённая запись обязательно должна отобразиться.


xmrz   (2003-05-27 09:48:00) [8]

Используй bookmark:


...
var i : pointer;
begin
i := DepDS.DataSet.GetBookmark;
ShowCurrent;
if Assigned(i) then
if DepDS.DataSet.BookmarkValid(i) then DepDS.DataSet.GotoBookmark(i);
...


Жук   (2003-05-27 09:45:00) [9]


> xmrz (27.05.03 09:31)
> > Жук
> В смысле?

Вы ж говорите, что при вводе новой записи (данных в форму ввода) закрываете НД. Когда форма ввода закрывается, то его надо переоткрыть (с какими параметрами ?) и спозиционировать курсор на введённую запись. Так ?


xmrz   (2003-05-27 09:31:00) [10]

> Жук
В смысле?


Danilka   (2003-05-27 09:31:00) [11]

Жук © (27.05.03 09:25)
Наверно. Под IBX я понимаю стандартные дельфовые компоненты работы с IB, которые лежат на закладке InterBase.
Может, чего-то путаю :)) недавно начал с IB работать.


Жук   (2003-05-27 09:26:00) [12]


> xmrz (27.05.03 09:23)

Но остаётся вопрос с позиционированием курсора :-(


Жук   (2003-05-27 09:25:00) [13]


> Danilka © (27.05.03 09:21)

По-моему мы в терминологии запутались...


xmrz   (2003-05-27 09:23:00) [14]

> Жук
Самый большой плюс этого подхода очевиден в ситуации, когда тебе надо вставить сразу несколько записей со связью один_ко_многоим. Типа :
- клиент
- заявка 1
- заявка 2
- заявка 3
В несколько разных таблиц


Danilka   (2003-05-27 09:21:00) [15]

Жук © (27.05.03 09:16)
>А при чём здесь IBX ?

IBQuery, IBTransaction - это не IBX?
по-моему, в другие компоненты (тот-же FIBPlus) по другому называются.


Жук   (2003-05-27 09:16:00) [16]


> xmrz (27.05.03 08:59)

Интересная идея ! Надо попробовать.


> Danilka © (27.05.03 09:05)

А при чём здесь IBX ? Автор указал, что у него IB6, а там другая картина с неявными трензакциями.


Danilka   (2003-05-27 09:09:00) [17]

xmrz (27.05.03 08:59)
угу. по-моему, самый правильный вариант.


Danilka   (2003-05-27 09:05:00) [18]

Жук © (27.05.03 08:53)
а может потому что у тебя не IBX, а что-то другое?
;))
посмотри исходники IBX.

сейчас только что проверил, на форму повесил IBTable, IBDatabase, IBTarsaction, грид и кнопку.
в обработчике кнопки написал:
IBTransaction1.Rollback;

запустил, добавил в гриде несколько записей, нажал на кнопку, транзакция завершилась, датасет - IBTable, естесственно закрылся. Запускаю по-новому - записи на месте.
Правда, у меня Д5 а не Д6, но сомневаюсь, что там IBX изменился.


xmrz   (2003-05-27 08:59:00) [19]

По моему оставлять набор данных открытым во время заполнения форм - расточительно. Я обычно записываю промежуточные результате в собственной структуре данных, делаю любые промежуточные расчёты, а потом вставка (редактирование) данных через хранимую процедуру, после этого сразу commit. А если пользователь нажал отменить, то хранимая процедура не выполняется, а структура с данными - освобождается.


Жук   (2003-05-27 08:53:00) [20]


> Danilka © (27.05.03 07:38)

А я и не знал ! Может по этому откатывалось всё без проблем ?


Страницы:   1 2

Наверх

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