На главную   На главную   Форумы Новости Документация Скачать Купить  
Регистрация  
Система Allegro
Oб Allegro Характеристики Пример конфигурации Документация База ошибок Развитие
Версия для печати К списку книг Вернуться к оглавлению Предыдущий параграф Следующий параграф
Поиск по книге

Глава 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


Система Allegro. Руководство разработчика Наверх