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

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

Так как все действия по перепроведению документов производятся на сервере , это происходит без ощутимых затрат времени (практически мгновенно ).



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