Глава 11. МНОГОМЕРНЫЕ РЕГИСТРЫ
Шаблоны операций с регистрами, системные таблицы REG_TEMPLATE, REG_TEMPLATE_FIELDS
Автоматические проводки по регистрам формируются на основе документов и шаблонов
операций с регистрами. Каждый тип документа может иметь несколько
шаблонов операций, работающих с каждым из регистров. Шаблоны
легко настраивать. Изменив шаблон операции с регистром, мы
всегда можем изменить способ проведения в регистре всех документов определенного
типа. Это создает большую гибкость при разработке конфигурации.
Каждый шаблон имеет название операции и название автоматически формируемой хранимой
процедуры, которая создает набор проводок в формате таблицы соответствующего
многомерного регистра. Если мы перенастроим шаблон, программа автоматически
изменит текст этой хранимой процедуры. Каждый шаблон содержит,
кроме того, условие срабатывания, что позволяет по-
разному проводить одни и те же типы документов, в
зависимости от каких-то признаков в самих документах.
Кроме того, в шаблоне может быть указан диапазон дат
, для которых он действует. Это означает возможность провести
документы до какой-то даты с помощью одного шаблона
, а после этой даты – с помощью другого шаблона
.
Каждый шаблон содержит имя атрибута (поля) документа,
откуда берется дата операции.
Каждый шаблон содержит набор «схем записей в регистр»,
в каждой из которых указывается, откуда брать данные для
каждого поля регистра. Данные могут браться из полей документа
или иметь фиксированные значения, указанные в шаблоне явно.
Ниже показаны структуры таблиц, в которых хранятся сведения о
шаблонах операций с регистрами, на основе которых программа формирует
тексты соответствующих хранимых процедур.
Системная таблица REG_TEMPLATE
Название поля |
Тип данных |
Назначение |
REG_TEMPLATE_ID |
INTEGER |
Внутренний ID шаблона |
REG_ID |
INTEGER |
Внутренний ID регистра |
NAME |
VARCHAR(50) |
Название операции с регистром |
STOREDPROC_NAME |
VARCHAR(31) |
Название хранимой процедуры, возвращающей проводки в формате таблицы регистра |
SWITCH_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, в котором содержится условие проведения.
Если значение этого поля в документе равно значению поля SWITCH
_VALUE шаблона, то операция будет проведена. |
SWITCH_VALUE |
INTEGER |
Значение условия проведения |
OPER_DATE_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется дата операции |
DOC_TYPE_ID |
INTEGER |
Внутренний ID типа документа |
START_DATE |
DATE |
Стартовая дата диапазона срабатывания шаблона. Если NULL, то
начало диапазона дат совпадает с глобальной датой начала периода. |
END_DATE |
DATE |
Крайняя дата диапазона срабатывания шаблона. Если NULL, то
ограничений по сроку работы шаблона нет |
IS_CHANGED |
SMALLINT |
Признак того, что шаблон был изменен. Используется для
перепроведения всех документов этого типа с использованием данного шаблона.
0 – шаблон не изменялся
1 – шаблон
был изменен пользователем |
При создании нового шаблона значение поля REG_TEMPLATE_
ID формируется при помощи генератора REG_TEMPLATE_ID
_GEN.
Системная таблица REG_TEMPLATE_FIELDS
Название поля |
Тип данных |
Назначение |
REG_TEMPLATE_ID |
INTEGER |
Внутренний номер ID шаблона |
OPER_POS |
INTEGER |
Порядковый номер строки генерируемого набора |
FIELD_NAME |
VARCHAR(31) |
Имя поля в таблице регистра |
FIELD_SOURCE |
VARCHAR(31) |
Имя поля-источника в таблице документа |
INVERT_FLAG |
SMALLINT |
Признак того, что знак числа следует изменить на противоположный
(«минус»)
0 – знак не изменять
1 – изменить знак суммы |
INTEGER_VALUE |
INTEGER |
Явное целое значение |
VARCHAR_VALUE |
VARCHAR(50) |
Явное строковое значение |
В качестве примера приведем текст хранимой процедуры, автоматически сформированный
шаблоном проведения «документом межскладского перемещения» для складского регистра
:
CREATE PROCEDURE DISPLACEMENT_REG_TEMPLATE
(OP_DATE1 DATE, OP_DATE2
DATE, FOR_DOC_ID INTEGER, FOR
_DOC_N INTEGER)
RETURNS(
DOC_ID INTEGER, DOC_N INTEGER
, REG_TEMPLATE_ID INTEGER, OP_
DATE DATE,
ACC INTEGER, GOODS INTEGER, INCOME INTEGER,
INCOME_AMOUNT DECIMAL(18, 2),
OUTCOME INTEGER, OUTCOME_AMOUNT DECIMAL(18
, 2))
AS
DECLARE VARIABLE V1 INTEGER;
DECLARE VARIABLE V2 INTEGER;
DECLARE VARIABLE V3 DECIMAL(18,2);
DECLARE VARIABLE V4 INTEGER;
DECLARE VARIABLE V5 INTEGER;
BEGIN
/*Текст данной процедуры создан системой Allegro автоматически.*/
/*Не меняйте этот текст. Ваши изменения могут быть
утеряны*/
REG_TEMPLATE_ID = 101;
DOC_N = 0;
FOR SELECT
DISPLACEMENT.ID,
DISPLACEMENT.ADATE,
DISPLACEMENT.STORE1,
DISPLACEMENT.STORE2,
DISPLACEMENT_ITEM.N,
DISPLACEMENT_ITEM.AVG_ITEM_COST
,
DISPLACEMENT_ITEM.GOODS,
DISPLACEMENT_ITEM.QUANTITY
FROM
DISPLACEMENT, DISPLACEMENT_ITEM
WHERE
DISPLACEMENT.ID = DISPLACEMENT_ITEM.ID
AND
((:FOR_DOC_N IS NULL)
OR (DISPLACEMENT_ITEM.N = :FOR
_DOC_N)) AND
((:FOR_DOC_ID IS NULL)
OR (DISPLACEMENT.ID = :FOR_DOC
_ID)) AND
((:OP_DATE1 IS NULL) OR (
DISPLACEMENT.ADATE >= :OP_DATE1)) AND
((:OP_DATE2 IS NULL) OR (
DISPLACEMENT.ADATE - 1 < :OP_DATE2
))
INTO :DOC_ID, :OP_
DATE, :V1, :V2, :DOC
_N, :V3, :V4, :
V5
DO
BEGIN
ACC = V1;
GOODS = V4;
OUTCOME = V5;
OUTCOME_AMOUNT = V3;
INCOME = 0;
INCOME_AMOUNT = 0;
SUSPEND; /*waiting for fetch operation*/
ACC = V2;
GOODS = V4;
INCOME = V5;
INCOME_AMOUNT = V3;
OUTCOME = 0;
OUTCOME_AMOUNT = 0;
SUSPEND; /*waiting for fetch operation*/
END
END
С помощью простого запроса к этой процедуре мы можем,
например, получить все записи, которые необходимо вставить в
регистр для всех документов «межскладского перемещения»:
select * from DISPLACEMENT_REG_TEMPLATE (NULL,NULL,NULL,NULL)
Если нас интересуют записи для вставки в регистр для одного
отдельно взятого документа «межскладского перемещения», скажем с ID
=11043, то мы можем получить их с помощью
запроса:
select * from DISPLACEMENT_REG_TEMPLATE (NULL, NULL, 11043, NULL)
Мы можем также получить записи для одной отдельно взятой позиции
документа, например с N = 33900:
select * from DISPLACEMENT_REG_TEMPLATE (NULL, NULL, 11043, 33900)
Хранимая процедура, сформированная шаблоном может иметь различное количество выходных
параметров, так как оно зависит от количества полей в
конкретном регистре. Однако все такие хранимые процедуры имеют стандартные
входные параметры:
Входные параметры хранимой процедурой шаблона операции с регистром:
Название параметра |
Тип данных |
Назначение |
OP_DATE1 |
DATE |
Начало диапазона дат (NULL – диапазон не ограничен снизу
) |
OP_DATE1 |
DATE |
Конец диапазона дат (NULL – диапазон не ограничен сверху
) |
FOR_DOC_ID |
INTEGER |
Внутренний ID документа (NULL – все документы этого типа
) |
FOR_DOC_N |
INTEGER |
Внутренний номер позиции документа (NULL – все позиции) |
|