![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Какчать вряд ли кто-то будет. Ты лучше на пальцах объясни. Для начала...