Форум: "Базы";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c