Глава 11. МНОГОМЕРНЫЕ РЕГИСТРЫ
Таблицы итогов
Таблицы итогов создаются в дополнение к регистрам и позволяют решать
две задачи:
- Поддерживать мгновенные текущие итоги (например, текущее количество товаров
на складах)
- Обеспечивать конфликт блокировок (lock confilct) или deadlock при
попытке двух пользователей одновременно использовать общий ресурс (например,
отгрузить со склада последнюю единицу товара)
К каждому регистру можно создать несколько таблиц итогов, например
, к многомерному складскому регистру, включающему в поля измерений
Склад, Товар и Партию, можно создать две таблицы
итогов: «остатки партий на складах» и «
остатки товаров на складах».
При создании таблицы итогов конфигурирующий должен выбрать из всех полей
регистра:
- Ключевые поля (из основных измерений регистра)
- Поля сумм (из полей мер регистра)
Таблица итогов имеет всегда поля, одноименные соответствующим полям регистра
, но количество полей в таблице итогов бывает меньшим.
Таблицы итогов вообще не имеют системных полей типа ID.
В качестве первичного ключа в них используется ключевая комбинация измерений
, например «Склад + Товар».
После создания таблицы итогов необходимо создать триггеры для таблицы регистра
. Эти триггеры создаются автоматически системой Allegro – конфигурирующему достаточно
нажать одну кнопку. Триггеры срабатывают при любой вставке,
модификации или удалении строки в таблице регистра.
Например, триггер AFTER UPDATE для регистра GOODS_REG
, управляющий таблицей итогов GOODS_REG_TOTAL,
может выглядеть примерно так:
CREATE TRIGGER GOODS_REG_RT_UPDATE FOR GOODS_REG
ACTIVE AFTER UPDATE POSITION 200
AS
BEGIN
/*Триггер обновления таблицы итогов*/
/*Текст этого триггера создан системой Allegro автоматически.*/
/*Не меняйте этот текст. Ваши изменения могут быть утеряны*/
IF (EXISTS(
SELECT 1 FROM GOODS_REG_TOTAL
WHERE
(ACC = NEW.ACC) AND
(GOODS = NEW.GOODS)
))
THEN
UPDATE GOODS_REG_TOTAL SET
INCOME = INCOME + NEW.INCOME - OLD.INCOME,
INCOME_AMOUNT = INCOME_AMOUNT + NEW.INCOME_AMOUNT - OLD.INCOME_AMOUNT,
OUTCOME = OUTCOME + NEW.OUTCOME - OLD.OUTCOME,
OUTCOME_AMOUNT = OUTCOME_AMOUNT +
NEW.OUTCOME_AMOUNT - OLD.OUTCOME_AMOUNT
WHERE
(ACC = NEW.ACC) AND
(GOODS = NEW.GOODS);
ELSE
INSERT INTO GOODS_REG_TOTAL(ACC, GOODS, INCOME, INCOME_AMOUNT,
OUTCOME, OUTCOME_AMOUNT)
VALUES(NEW.ACC, NEW.GOODS, NEW.INCOME - OLD.INCOME, NEW.INCOME_AMOUNT - OLD.INCOME_AMOUNT,
NEW.OUTCOME - OLD.OUTCOME, NEW.OUTCOME_AMOUNT - OLD.OUTCOME_AMOUNT);
END
|