Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Firebird + FIBPlus методы работы с составным документом   Найти похожие ветки 

 
RDA   (2006-10-12 18:07) [0]

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

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


 
Johnmen ©   (2006-10-12 18:08) [1]

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


 
ANB ©   (2006-10-12 18:25) [2]

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

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


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

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 - но техники данной реализации не знаю.


 
Johnmen ©   (2006-10-13 11:36) [4]


> RDA


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

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


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

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


 
iva ©   (2006-10-13 12:11) [6]

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


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

Johnmen

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


 
atruhin ©   (2006-10-13 14:39) [8]

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


 
Zacho ©   (2006-10-13 17:29) [9]

RDA   (13.10.06 14:34) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
6-1154070111
FireMan_Alexey
2006-07-28 11:01
2006.12.24
Как создать програмно сетевое соединение!


15-1164888761
халявщик
2006-11-30 15:12
2006.12.24
Лицензия Access


15-1164158780
Дядя
2006-11-22 04:26
2006.12.24
Что такое кубит? И квантовый компьютер вообще?


15-1164879601
Fox
2006-11-30 12:40
2006.12.24
Вакансия Технический писатель


15-1165342390
Kolan
2006-12-05 21:13
2006.12.24
Что на самом деле есть блок "Node by pattern"