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

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

Firebird + FIBPlus методы работы с составным документом [D6, Firebird]


RDA ©   (2006-10-12 18:07:00) 

Как правильно обработать составной документ (мастер и деталь одновременно создаються и редактируються). Я делаю так но пара моментов в коде мне не очень нравиться, может кто подскажет более правильный способ?

Код - http://rapidshare.de/files/36464288/Test2.rar


Zacho   (2006-10-13 17:29:00) [1]

RDA   (13.10.06 14:34) [7]

Читай http://www.ibase.ru/devinfo/ibtrans.htm


atruhin   (2006-10-13 14:39:00) [2]

write
wait - в зависимости от логики
rec_version
read_committed


RDA   (2006-10-13 14:34:00) [3]

Johnmen

Какие лучше параметры использовать для транзакции?


iva   (2006-10-13 12:11:00) [4]

и еще, для TpFIBDataSet.DetailConditions обрати внимание на dcForceOpen и dcWiteEndMasterScroll, на префикс 'MAS_' в insert, update запросах.


iva   (2006-10-13 12:04:00) [5]

возможно тебе поможет вот это http://www.devrace.com/ru/fibplus/articles/1163.php, но там еще есть продолжение (несколько частей)


Johnmen   (2006-10-13 11:36:00) [6]


> RDA


Методика едина:
1. стартуем транзакцию
2. изменяем/вставляем в Мастерную таблицу
3. изменяем/вставляем в Детальную таблицу
4. подтверждаем/откатываем транзакцию

Никаких автокоммитов не допускаем...


RDA   (2006-10-13 11:05:00) [7]

to Johnmen
Значит так. Для примера две таблицы
Мастер
CREATE TABLE DOCTITLE (
   DT_ID DINTEGER NOT NULL,
   DT_NOMER DINTEGER NOT NULL,
   DT_DATE DDATE DEFAULT CURRENT_DATE NOT NULL,
   DT_NAME DVARCHAR050 DEFAULT 'Документ №');
Деталь
CREATE TABLE DOCBODY (
   DB_ID DINTEGER NOT NULL,
   DB_NAME DVARCHAR050 DEFAULT 'Товар №',
   DB_SUMA DFLOAT DEFAULT '0' NOT NULL,
   DT_ID DINTEGER NOT NULL);

Документ типа счет/накладная
Работа идет в контексте двух транзакций:
Read {read nowait rec_version read_committed}
Update {write nowait concurrency}

Настройки плюсов (TpFIBDataSet).
Мастер:
AutoCommit = True;
Деталь:
AutoCommit = False;
CachedUpdates = True;

Запрос на выборку документов:
SELECT
   DT_ID,
   DT_NOMER,
   DT_DATE,
   DT_NAME,
   (SELECT SUM(DB_SUMA) FROM DOCBODY WHERE DOCBODY.DT_ID = DOCTITLE.DT_ID) AS DT_SUMA
FROM
   DOCTITLE
ORDER BY
   DT_NOMER

При сохранении нового/измененного документа

tbDocTitle.Post;
tbDocBody.ApplyUpdToBase;
if tbDocBody.UpdateTransaction.Active = True then
 tbDocBody.UpdateTransaction.Commit;
tbDocTitle.ReopenLocate('DT_ID');

Остальная логика тривиальна.

Хотелось бы узнать какие есть иные способы. Желатьно чтобы использовались DBAware компоненты в формах дабы не городить огород. Вроде бы можно реализовать с использованием ClientDataSet - но техники данной реализации не знаю.


ANB   (2006-10-12 18:25:00) [8]

2 подхода :
1) связать мастер и детал
2) ручками заполнять по событиям параметры и переоткрывать наборы данных.

второй способ геморройнее, но надежнее (хотя обычно эта повышенная надежность идет от незнания всех тонкостей первого способа).


Johnmen   (2006-10-12 18:08:00) [9]

Какчать вряд ли кто-то будет. Ты лучше на пальцах объясни. Для начала...


Наверх

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