Блокировка периода (постановка)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | Мы добавили в блокировку периода возможность исключать некоторые типы документов. За определение: подпадает конкретный тип под блокировку или нет, отвечает процедура [[gd_p_exclude_block_dt]], которая возвращает 1, если переданный идентификатор типа документа не блокируется и 0 в противном случае. Процедура формируется в окне [[Tgd_dlgOptions]] при выборе типов документов исключаемых из блокировки. Системными составляющими механизма блокировки периода являются генераторы [[gd_g_block]] и [[gd_g_block_group]]. Первый хранит дату, до которой документы считаются заблокированными, а второй -- битовую маску групп пользователей, на которых распространяется блокировка. Механизм реализуется с помощью 12 триггеров, по три на каждую из четырех таблиц: [[gd_document]], [[ac_entry]], [[ac_record]] и [[inv_movement]]. | + | Мы добавили в блокировку периода возможность исключать некоторые типы документов. За определение: подпадает конкретный тип под блокировку или нет, отвечает процедура [[gd_p_exclude_block_dt]], которая возвращает 1, если переданный идентификатор типа документа не блокируется и 0 в противном случае. Процедура формируется в окне [[Tgd_dlgOptions]] при выборе типов документов исключаемых из блокировки. Системными составляющими механизма блокировки периода являются генераторы [[gd_g_block]] и [[gd_g_block_group]]. Первый хранит дату, до которой документы считаются заблокированными, а второй -- битовую маску групп пользователей, на которых распространяется блокировка. Механизм реализуется с помощью 12 триггеров, по три на каждую из четырех таблиц: [[gd_document]], [[ac_entry]], [[ac_record]] и [[inv_movement]]. Существующий триггер блокировки периода выглядит следующим образом: |
| + | CREATE TRIGGER ac_bi_entry_block FOR ac_entry | ||
| + | INACTIVE | ||
| + | BEFORE INSERT | ||
| + | POSITION 28017 | ||
| + | AS | ||
| + | DECLARE VARIABLE IG INTEGER; | ||
| + | DECLARE VARIABLE BG INTEGER; | ||
| + | DECLARE VARIABLE DT INTEGER; | ||
| + | DECLARE VARIABLE F INTEGER; | ||
| + | BEGIN | ||
| + | IF ((NEW.entrydate - CAST('17.11.1858' AS DATE)) < GEN_ID(gd_g_block, 0)) THEN | ||
| + | BEGIN | ||
| + | SELECT d.documenttypekey | ||
| + | FROM gd_document d | ||
| + | JOIN ac_record r ON r.documentkey = d.id | ||
| + | WHERE | ||
| + | r.id = NEW.recordkey | ||
| + | INTO | ||
| + | :DT; | ||
| + | |||
| + | EXECUTE PROCEDURE gd_p_exclude_block_dt (:DT) | ||
| + | RETURNING_VALUES :F; | ||
| + | |||
| + | IF(:F = 0) THEN | ||
| + | BEGIN | ||
| + | BG = GEN_ID(gd_g_block_group, 0); | ||
| + | IF (:BG = 0) THEN | ||
| + | BEGIN | ||
| + | EXCEPTION gd_e_block; | ||
| + | END ELSE | ||
| + | BEGIN | ||
| + | SELECT ingroup FROM gd_user WHERE ibname = CURRENT_USER | ||
| + | INTO :IG; | ||
| + | IF (BIN_AND(:BG, :IG) = 0) THEN | ||
| + | BEGIN | ||
| + | EXCEPTION gd_e_block; | ||
| + | END | ||
| + | END | ||
| + | END | ||
| + | END | ||
| + | END | ||
| + | |||
| + | |||
| + | На сегодняшний день у некоторых из наших клиентов возникла необходимость устанавливать разные периоды блокировки для разных типов документов. | ||
[[Category:Постановка]] | [[Category:Постановка]] | ||
Версия 18:13, 21 марта 2007
Мы добавили в блокировку периода возможность исключать некоторые типы документов. За определение: подпадает конкретный тип под блокировку или нет, отвечает процедура gd_p_exclude_block_dt, которая возвращает 1, если переданный идентификатор типа документа не блокируется и 0 в противном случае. Процедура формируется в окне Tgd_dlgOptions при выборе типов документов исключаемых из блокировки. Системными составляющими механизма блокировки периода являются генераторы gd_g_block и gd_g_block_group. Первый хранит дату, до которой документы считаются заблокированными, а второй -- битовую маску групп пользователей, на которых распространяется блокировка. Механизм реализуется с помощью 12 триггеров, по три на каждую из четырех таблиц: gd_document, ac_entry, ac_record и inv_movement. Существующий триггер блокировки периода выглядит следующим образом:
CREATE TRIGGER ac_bi_entry_block FOR ac_entry
INACTIVE
BEFORE INSERT
POSITION 28017
AS
DECLARE VARIABLE IG INTEGER;
DECLARE VARIABLE BG INTEGER;
DECLARE VARIABLE DT INTEGER;
DECLARE VARIABLE F INTEGER;
BEGIN
IF ((NEW.entrydate - CAST('17.11.1858' AS DATE)) < GEN_ID(gd_g_block, 0)) THEN
BEGIN
SELECT d.documenttypekey
FROM gd_document d
JOIN ac_record r ON r.documentkey = d.id
WHERE
r.id = NEW.recordkey
INTO
:DT;
EXECUTE PROCEDURE gd_p_exclude_block_dt (:DT)
RETURNING_VALUES :F;
IF(:F = 0) THEN
BEGIN
BG = GEN_ID(gd_g_block_group, 0);
IF (:BG = 0) THEN
BEGIN
EXCEPTION gd_e_block;
END ELSE
BEGIN
SELECT ingroup FROM gd_user WHERE ibname = CURRENT_USER
INTO :IG;
IF (BIN_AND(:BG, :IG) = 0) THEN
BEGIN
EXCEPTION gd_e_block;
END
END
END
END
END
На сегодняшний день у некоторых из наших клиентов возникла необходимость устанавливать разные периоды блокировки для разных типов документов.