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

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

Как правильно организовать транзакцию на вставку в IB?


Страницы:   1 2

KIR ©   (2002-10-31 01:01:00) 

Народ, ситуация следующая (для примера упростим содержание таблиц): Имеется таблица, содержащая PK по полю ID и, скажем, номер документа. Имеются еще несколькотаблиц в которых определенное количество записей ссылаются на главную таблицу (в таблицах имеется поле, скажем MasterID). Записи туда добавляются автоматически при запуске некой процедуры (некоторые рассчитываются, некоторые беруться из StringGrid"ов). Так вот суть этой процедуры такова: добавить 1 запись в главную таблицу (ID генерится с помощью генератор+транзакция "перед вставкой"), затем заполняются все подчиненные таблицы, в которых в поле MasterID заносится только что сгенеренный ID из главной таблицы?

Вопрос следующий: как грамотно организовывается такая вставка:
1. С помощью ХП и огромной кучи параметров (в общей сложности полей около 30)?
2. С помощью Query ---"---?
3. С помощью StartTransaction-Commit из кода клиента?
4. Еще как-то?

Спасибо!


KIR   (2002-10-31 11:27:00) [21]

>Max Zyuzin Я пользуюсь компонентами библиотеки FIBPlus и соответственно pFIBDataSet

>Ops А как ЯВНО запустить транзакцию в pFIBDataDase, используя свойство DefaultTransaction? Я это спрашиваю, так, как если написать просто
pFIBDataBase1.StartTransaction;
...
...
pFIBDataBase1.Commit


Ввдается ошибка: "Format "%s" ivalid or incompatible with argument"


Ops   (2002-10-31 11:20:00) [22]

0. Запускай транзакцию (явно)
1. Получи ID - хранимой процедурой. (Чтобы другие незахватили)
2. Все табицы открывай через квери
3. Сделай всем квери кеширование
4. Работай с ними как хочешь
5. Конец работы
а) сохраняй кеширование
б) применяй транзакцию


Desdechado   (2002-10-31 11:02:00) [23]

1. табличный подход и ИБ - как отверткой гвозди забивать
2. перед вставкой во 2-ю таблицу считать ID из мастера


Max Zyuzin   (2002-10-31 11:00:00) [24]

>KIR © (31.10.02 10:55)
Я так понял вы пользуетесь компонентами IBTable?


KIR   (2002-10-31 10:55:00) [25]

Если сделать так:

MyDataBase.StartTransaction

MasterTable.Append;
MasterTable["FrstFied"] := "test";
MasterTable.Post;
DetaiTable1.Append;
DetailTable1["MasterID"] := MasterTable["ID"];
DetailTable1.Post;
DetaiTable2.Append;
DetailTable2["MasterID"] := MasterTable["ID"];
DetailTable2.Post;

MyDataBase.Commit;


ругается. В хелпе к FIBPlus вычитал, что это все делается через DataBase.DefaultTransaction

The following procedure illustrates how to start and commit transaction in response to a button click:

procedure TForm1.ApplyButtonClick(Sender: TObject);
begin
pFIBDatabase1.Open;
pFIBTransaction1.StartTransaction;
pFIBDataSet1.Insert;
pFIBDataSet1.FieldByName("QUANTITY").AsInteger := StrToInt(Edit1.Text);
pFIBDataSet1.Post;
pFIBTransaction1.Commit;
end;

In the preceding example, you could substitute Rollback for Commit.


Desdechado   (2002-10-31 10:40:00) [26]

starttran и commit обязательно.
а между ними как хочешь - один или несколько квери и/или ХП.


Max Zyuzin   (2002-10-31 10:16:00) [27]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035978375&n=1
А вообще с помощью транзакции и рамках транзакции уже запросы на добавления делай


KIR   (2002-10-31 10:12:00) [28]

Народ, оч. надо!!!


KIR   (2002-10-31 01:01:00) [29]

Да, добавление: использую IB 6.5 и FIBPlus


Страницы:   1 2

Наверх

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