Главная страница
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.051 c
15-1164867098
q10nik
2006-11-30 09:11
2006.12.24
Мозгопромывающая задача на перебор...


2-1165557263
Roman_ln
2006-12-08 08:54
2006.12.24
Есть ли функция посчета одинаковых элементов в списке ListBox


15-1164793479
bvn123
2006-11-29 12:44
2006.12.24
Есть ли конверторы компонентов в старшие версии Delphi?


3-1160978111
Sergey_b
2006-10-16 09:55
2006.12.24
Вставка данных


2-1165403808
mfender
2006-12-06 14:16
2006.12.24
TNotifyEvent и AccessViolation