Глава 11. МНОГОМЕРНЫЕ РЕГИСТРЫ
Автоматическое проведение документов в регистрах
Так как хранимые процедуры шаблонов в любой момент предоставляют нам
необходимый «кусок» записей регистра, остается лишь сохранить
этот набор в таблице регистра. Если мы хотим «
перепровести» уже существующий документ (например, после внесения
в него изменений), то нужно сначала удалить старые записи
из регистра по данному документу, а затем вставить новые
записи, поставляемые хранимой процедурой шаблона. Упростить вставку записей
в регистр можно с помощью вызова хранимой процедуры <имя
_главной_таблицы_документа>_R_CHANGE
. Эта хранимая процедура создается программой автоматически при настройке шаблонов
записей по регистрам. Текст этой процедуры зависит от того
, какие шаблоны имеет конкретный тип документа.
Идеология системы Allegro предполагает, что все необходимые для проведения
данные уже подготовлены и хранятся в самих документах. В
частности, если документ списывает стоимость товаров, уходящих со
склада, то эта стоимость должна быть предварительно вычислена и
сохранена в соответствующем поле документа. Вычисление стоимости может производиться
на основе запросов к таблице регистра или таблицам итогов в
процессе создания документа, однако при проведении документа с помощью
хранимой процедуры <имя_главной_таблицы_документа
>_R_CHANGE эта информация может лишь использоваться,
но не модифицироваться.
Процедура <имя_главной_таблицы_документа>_
R_CHANGE имеет три входных параметра:
Название параметра |
Тип данных |
Назначение |
ID |
INTEGER |
Внутренний ID документа (NULL – все документы этого типа
) |
N |
INTEGER |
Внутренний номер позиции документа (NULL – все позиции) |
REG_TEMPLATE_ID |
INTEGER |
Внутренний ID шаблона (NULL – все шаблоны для документа
этого типа) |
Параметры ID и REG_TEMPLATE_ID не могут
одновременно принимать значение NULL. Если такое произошло, процедура
не создаст записей в регистре.
Если параметр ID принимает значение NULL, то перепроводятся все
документы этого типа одним шаблоном, для которого указан REG
_TEMPLATE_ID.
Если параметр N отличен от NULL, то перепроводится одна
строка подчиненной таблицы (позиция документа).
Если параметр ID отличен от NULL, а параметр REG
_TEMPLATE_ID равен NULL, то конкретный документ
перепроводится всеми имеющимися шаблонами во всех регистрах, которые они
затрагивают.
Пример хранимой процедуры, осуществляющей перепроведение документов типа «межскладское
перемещение»:
CREATE PROCEDURE DISPLACEMENT_R_CHANGE (ID INTEGER
, N INTEGER,
REG_TEMPLATE_ID INTEGER)
AS
DECLARE VARIABLE PERIOD_START DATE;
BEGIN
/*Текст данной процедуры создан системой Allegro автоматически.*/
/*Не меняйте этот текст. Ваши изменения могут быть
утеряны*/
IF ((ID IS NULL) AND (REG
_TEMPLATE_ID IS NULL)) THEN
EXIT;
/*Выбираем дату начала периода*/
SELECT START_DATE FROM PERIOD_PROPERTIES INTO
:PERIOD_START;
/*Удаляем прежние записи из регистра GOODS_REG
*/
DELETE FROM GOODS_REG
WHERE
((:ID IS NULL) OR (DOC_
ID = :ID)) AND
((:N IS NULL) OR (DOC_
N = :N)) AND
((:REG_TEMPLATE_ID IS NULL)
OR (REG_TEMPLATE_ID = :REG
_TEMPLATE_ID));
/*Вставляем новые записи в регистр*/
IF ((REG_TEMPLATE_ID IS NULL
) OR (REG_TEMPLATE_ID = 101
)) THEN
INSERT INTO GOODS_REG(ID, DOC
_ID, DOC_N, REG_TEMPLATE
_ID, OP_DATE,
ACC, GOODS, INCOME, INCOME_AMOUNT
, OUTCOME, OUTCOME_AMOUNT)
SELECT GEN_ID(GOODS_REG_
ID_GEN, 1), DOC_ID,
DOC_N, REG_TEMPLATE_ID,
OP_DATE,
ACC, GOODS, INCOME, INCOME_AMOUNT
, OUTCOME, OUTCOME_AMOUNT
FROM DISPLACEMENT_REG_TEMPLATE(NULL,
NULL, :ID, :N)
WHERE OP_DATE >= :PERIOD_START
;
END
Итак, для перепроведения конкретного документа какого-то типа
, нам достаточно вызвать хранимую процедуру <имя_главной
_таблицы_документа>_R_CHANGE, передав
в нее входным параметром ID документа. Например, так
можно полностью перепровести в регистрах документ «Межскладского перемещения»
с ID = 11035:
execute procedure displacement_r_change(11035, NULL, NULL);
Разработчик для вызова этой команды может воспользоваться также процедурой встроенного
языка:
procedure MakeRegEntries(const MainTableName: string;
doc_id,doc_n, reg_template_id: integer; ATransaction: TIBTransaction);
Процедура MakeRegEntries вызывает эту же SQL команду в контексте определенной
транзакции. В качестве параметров нужно передать название главной таблицы
документа, внутренний ID документа, который следует перепровести,
внутренний идентификатор позиции (N) документа, внутренний идентификатор
шаблона и указатель на компонент транзакции. При вызове этой
функции из текста скриптового проекта конфигурирующий в соответствующих параметрах передает
вместо NULL значение 0,если не хочет уточнять какой
-то из целочисленных параметров, например:
MakeRegEntries(‘DISPALCEMENT’, 11035,0,0);
//перепроведение в регистрах всех позиций документа
//«межскладское перемещение» с ID=11035
Так как все действия по перепроведению документов производятся на сервере
, это происходит без ощутимых затрат времени (практически мгновенно
).
|