DEPO Firebird: проверка на реальной базе Fancy — генераторы, диалект 1, дата без времени

Обезличенная база Fancy (Firebird 2.5.9, диалект 1, кодировка NONE) с UDF ib_Fansy и штатными
триггерами: установка, HANDBOOK, поручения IN/OUT, события до BJ_EXECUTED, операции и проводки, ошибки.
- генераторы OD_DOCS_ID_GEN / OD_DOLS_ID_GEN (как в Fancy);
- COMMENT без кавычек: в диалекте 1 "..." — строка;
- FTV_M2M_DAY: дата без времени (в диалекте 1 CAST AS DATE время не отрезает);
- README: установка в WIN1251, что подтвердилось, что проверить у клиента (UDF, кодировщик M2M, оператор).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-27 17:31:29 +03:00
parent 56efa9266c
commit ee857b089a
6 changed files with 110 additions and 69 deletions
@@ -19,7 +19,7 @@ BEGIN
TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
TIMEBEG TIMESTAMP, TIMEBEG TIMESTAMP,
TIMEEND TIMESTAMP, TIMEEND TIMESTAMP,
"COMMENT" BLOB SUB_TYPE TEXT, COMMENT BLOB SUB_TYPE TEXT,
DIRECTION VARCHAR(4) NOT NULL, DIRECTION VARCHAR(4) NOT NULL,
CONTRAGENT_M2M_CODE VARCHAR(255) NOT NULL, CONTRAGENT_M2M_CODE VARCHAR(255) NOT NULL,
DEPONENT_NAME VARCHAR(255) NOT NULL, DEPONENT_NAME VARCHAR(255) NOT NULL,
@@ -48,7 +48,7 @@ BEGIN
SHARE INTEGER, SHARE INTEGER,
PLACE INTEGER, PLACE INTEGER,
DEPO INTEGER, DEPO INTEGER,
"COMMENT" BLOB SUB_TYPE TEXT)'; COMMENT BLOB SUB_TYPE TEXT)';
IF (NOT EXISTS (SELECT 1 FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'FTV_M2M_EVENTS')) THEN IF (NOT EXISTS (SELECT 1 FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'FTV_M2M_EVENTS')) THEN
EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_EVENTS ( EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_EVENTS (
@@ -59,7 +59,7 @@ BEGIN
TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
TIMEBEG TIMESTAMP, TIMEBEG TIMESTAMP,
TIMEEND TIMESTAMP, TIMEEND TIMESTAMP,
"COMMENT" BLOB SUB_TYPE TEXT, COMMENT BLOB SUB_TYPE TEXT,
EVENT_TYPE VARCHAR(64) NOT NULL, EVENT_TYPE VARCHAR(64) NOT NULL,
EVENT_DATE TIMESTAMP NOT NULL, EVENT_DATE TIMESTAMP NOT NULL,
M2M_REJECT_CODE VARCHAR(1000), M2M_REJECT_CODE VARCHAR(1000),
@@ -85,7 +85,7 @@ BEGIN
EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_SETTINGS ( EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_SETTINGS (
NAME VARCHAR(64) NOT NULL PRIMARY KEY, NAME VARCHAR(64) NOT NULL PRIMARY KEY,
VAL INTEGER, VAL INTEGER,
"COMMENT" VARCHAR(255))'; COMMENT VARCHAR(255))';
IF (NOT EXISTS (SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = 'FTV_M2M_GEN')) THEN IF (NOT EXISTS (SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = 'FTV_M2M_GEN')) THEN
EXECUTE STATEMENT 'CREATE GENERATOR FTV_M2M_GEN'; EXECUTE STATEMENT 'CREATE GENERATOR FTV_M2M_GEN';
@@ -145,23 +145,23 @@ SET TERM ^ ;
EXECUTE BLOCK AS EXECUTE BLOCK AS
BEGIN BEGIN
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'WHOS')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'WHOS')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('WHOS', NULL, 'OD_DOCS.WHOS — юрлицо-депозитарий (Фонтвьель: 383118)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('WHOS', NULL, 'OD_DOCS.WHOS — юрлицо-депозитарий (Фонтвьель: 383118)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'OPER_USER')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'OPER_USER')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('OPER_USER', NULL, 'OD_OPERATORS.ID — оператор проводок (Фонтвьель: 84, SYSDBA)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('OPER_USER', NULL, 'OD_OPERATORS.ID — оператор проводок (Фонтвьель: 84, SYSDBA)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_CAT')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_CAT')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('FILER_CAT', NULL, 'OD_DOC_CATS.ID категории D_FILER — входящая запись (Фонтвьель: 255)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('FILER_CAT', NULL, 'OD_DOC_CATS.ID категории D_FILER — входящая запись (Фонтвьель: 255)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'D_NUM')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'D_NUM')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('D_NUM', NULL, 'OD_BALANCES.ID — 98010 НОСТРО депо базовый (Фонтвьель: 313)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('D_NUM', NULL, 'OD_BALANCES.ID — 98010 НОСТРО депо базовый (Фонтвьель: 313)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'K_NUM')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'K_NUM')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('K_NUM', NULL, 'OD_BALANCES.ID — 98070 ЦБ на торгах (Фонтвьель: 836)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('K_NUM', NULL, 'OD_BALANCES.ID — 98070 ЦБ на торгах (Фонтвьель: 836)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'MARKET')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'MARKET')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('MARKET', NULL, 'OD_FACES.SELF_ID — ПАО Московская Биржа (Фонтвьель: 8106)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('MARKET', NULL, 'OD_FACES.SELF_ID — ПАО Московская Биржа (Фонтвьель: 8106)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'B_TYPE')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'B_TYPE')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('B_TYPE', NULL, 'OD_SYS_TABS DEPO96_DCLA.NUM — «Отчёт депозитария» (Фонтвьель: 31)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('B_TYPE', NULL, 'OD_SYS_TABS DEPO96_DCLA.NUM — «Отчёт депозитария» (Фонтвьель: 31)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'CORR_FACE')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'CORR_FACE')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('CORR_FACE', NULL, 'OD_FACES.SELF_ID — НКО АО НРД, корреспондент входящей записи (Фонтвьель: 18174)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('CORR_FACE', NULL, 'OD_FACES.SELF_ID — НКО АО НРД, корреспондент входящей записи (Фонтвьель: 18174)');
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_RUBRICA')) THEN IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_RUBRICA')) THEN
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('FILER_RUBRICA', NULL, 'D_FILER.RUBRICA для отчёта НРД (Фонтвьель: 5, «уточнить в депозитарии»)'); INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('FILER_RUBRICA', NULL, 'D_FILER.RUBRICA для отчёта НРД (Фонтвьель: 5, «уточнить в депозитарии»)');
END^ END^
SET TERM ; ^ SET TERM ; ^
@@ -1,6 +1,6 @@
/* Bridge&Join — процедуры обработки M2M для Fancy DEPO на Firebird 2.5. /* Bridge&Join — процедуры обработки M2M для Fancy DEPO на Firebird 2.5.
Перенос процедур MSSQL-версии (Фонтвьель, тексты от 22.10.2026, OPERATION — от 24.10.2026) на PSQL. Логика та же; отличия: Перенос процедур MSSQL-версии (Фонтвьель, тексты от 22.10.2026, OPERATION — от 24.10.2026) на PSQL. Логика та же; отличия:
- raiserror → FTV_M2M_FAIL: текст причины кладётся в контекст транзакции и поднимается исключение FTV_M2M_ERROR; - raiserror — FTV_M2M_FAIL: текст причины кладётся в контекст транзакции и поднимается исключение FTV_M2M_ERROR;
FTV_M2M_JOB пишет этот текст в COMMENT (в Firebird 2.5 текст исключения в WHEN не доступен; контекст FTV_M2M_JOB пишет этот текст в COMMENT (в Firebird 2.5 текст исключения в WHEN не доступен; контекст
возвращает строку без кодировки — приводится к WIN1251, кодировке базы Fancy); возвращает строку без кодировки — приводится к WIN1251, кодировке базы Fancy);
- ошибка записи откатывает только её изменения (WHEN ANY = точка сохранения), в MSSQL-версии изменения - ошибка записи откатывает только её изменения (WHEN ANY = точка сохранения), в MSSQL-версии изменения
@@ -11,7 +11,10 @@
- SELECT … INTO, который в MSSQL молча брал последнюю из нескольких строк, — SELECT FIRST 1; - SELECT … INTO, который в MSSQL молча брал последнюю из нескольких строк, — SELECT FIRST 1;
- в цикле по строкам поручения бумага/счета сбрасываются перед поиском (в MSSQL ненайденное значение - в цикле по строкам поручения бумага/счета сбрасываются перед поиском (в MSSQL ненайденное значение
оставалось от предыдущей строки). оставалось от предыдущей строки).
Порядок создания: вспомогательные → WIRING → OPERATION → UPDATE_HANDBOOK → EVENTS → CREATE → JOB. */ Тексты работают в обоих диалектах: база Fancy — диалект 1 (DATE хранит и время, "…" — строка, а не имя),
поэтому COMMENT без кавычек, а дата без времени — через FTV_M2M_DAY. Проверено 27.10.2026 на обезличенной
базе Fancy (Firebird 2.5, диалект 1, кодировка NONE) с UDF ib_Fansy и штатными триггерами.
Порядок создания: вспомогательные, WIRING, OPERATION, UPDATE_HANDBOOK, EVENTS, CREATE, JOB. */
SET TERM ^ ; SET TERM ^ ;
@@ -42,6 +45,14 @@ BEGIN
LPAD(CAST(FLOOR(EXTRACT(SECOND FROM T)) AS INTEGER), 2, '0'); LPAD(CAST(FLOOR(EXTRACT(SECOND FROM T)) AS INTEGER), 2, '0');
END^ END^
/* Дата без времени (CONVERT(DATE, …) MSSQL-версии). В диалекте 1 CAST(… AS DATE) время не отрезает. */
CREATE OR ALTER PROCEDURE FTV_M2M_DAY (T TIMESTAMP) RETURNS (D TIMESTAMP) AS
BEGIN
D = NULL;
IF (T IS NOT NULL) THEN
D = CAST(EXTRACT(YEAR FROM T) || '-' || EXTRACT(MONTH FROM T) || '-' || EXTRACT(DAY FROM T) AS TIMESTAMP);
END^
/* Директива «Обработать» для документа «Зачисление» или «Списание». Значения берутся только из самого /* Директива «Обработать» для документа «Зачисление» или «Списание». Значения берутся только из самого
документа; M2M-поручение и трансферные таблицы не используются. */ документа; M2M-поручение и трансферные таблицы не используются. */
@@ -151,7 +162,7 @@ DECLARE VARIABLE CLISER_ID INTEGER;
DECLARE VARIABLE CLISER_NUM VARCHAR(64); DECLARE VARIABLE CLISER_NUM VARCHAR(64);
DECLARE VARIABLE CLISER_DATE TIMESTAMP; DECLARE VARIABLE CLISER_DATE TIMESTAMP;
DECLARE VARIABLE DIRECTION VARCHAR(64); DECLARE VARIABLE DIRECTION VARCHAR(64);
DECLARE VARIABLE DD_DATE DATE; DECLARE VARIABLE DD_DATE TIMESTAMP;
DECLARE VARIABLE DD_NUM VARCHAR(64); DECLARE VARIABLE DD_NUM VARCHAR(64);
DECLARE VARIABLE SHARE INTEGER; DECLARE VARIABLE SHARE INTEGER;
DECLARE VARIABLE AMOUNT NUMERIC(18,7); DECLARE VARIABLE AMOUNT NUMERIC(18,7);
@@ -167,7 +178,7 @@ DECLARE VARIABLE FILER_DATE TIMESTAMP;
DECLARE VARIABLE STEP_ID INTEGER; DECLARE VARIABLE STEP_ID INTEGER;
DECLARE VARIABLE P VARCHAR(4000); DECLARE VARIABLE P VARCHAR(4000);
DECLARE VARIABLE REP_NUM VARCHAR(255); DECLARE VARIABLE REP_NUM VARCHAR(255);
DECLARE VARIABLE REP_DATE DATE; DECLARE VARIABLE REP_DATE TIMESTAMP;
DECLARE VARIABLE CMT VARCHAR(4000); DECLARE VARIABLE CMT VARCHAR(4000);
BEGIN BEGIN
EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS; EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS;
@@ -181,7 +192,7 @@ BEGIN
SELECT FIRST 1 H.DOC, D.NUM, D.D_DATE, SELECT FIRST 1 H.DOC, D.NUM, D.D_DATE,
CASE WHEN DC.SYS_NAME = 'I_CLISER_M2M_ZACH' THEN 'IN' WHEN DC.SYS_NAME = 'I_CLISER_M2M_SPIS' THEN 'OUT' END, CASE WHEN DC.SYS_NAME = 'I_CLISER_M2M_ZACH' THEN 'IN' WHEN DC.SYS_NAME = 'I_CLISER_M2M_SPIS' THEN 'OUT' END,
CAST(D.D_DATE AS DATE), D.NUM, F.SHARE, F.AMOUNT, F.CLIENT, H.DEPONENT, F.PLACE D.D_DATE, D.NUM, F.SHARE, F.AMOUNT, F.CLIENT, H.DEPONENT, F.PLACE
FROM D_CLISER_M2M_DOL F FROM D_CLISER_M2M_DOL F
LEFT JOIN OD_DOLS L ON L.ID = F.DOL LEFT JOIN OD_DOLS L ON L.ID = F.DOL
LEFT JOIN OD_DOCS D ON D.ID = L.DOC LEFT JOIN OD_DOCS D ON D.ID = L.DOC
@@ -192,6 +203,7 @@ BEGIN
IF (CLISER_ID IS NULL) THEN IF (CLISER_ID IS NULL) THEN
EXECUTE PROCEDURE FTV_M2M_FAIL('Не найдено M2M-поручение по GUID + REFERENCE'); EXECUTE PROCEDURE FTV_M2M_FAIL('Не найдено M2M-поручение по GUID + REFERENCE');
EXECUTE PROCEDURE FTV_M2M_DAY(:DD_DATE) RETURNING_VALUES :DD_DATE;
/* Направление */ /* Направление */
SELECT FIRST 1 DC.ID FROM OD_DOC_CATS DC SELECT FIRST 1 DC.ID FROM OD_DOC_CATS DC
@@ -199,7 +211,7 @@ BEGIN
INTO :D_CAT; INTO :D_CAT;
/* ID и номер операции */ /* ID и номер операции */
OPER_ID = GEN_ID(OD_DOC_ID_GEN, 1); OPER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :OPER_DATE, NULL, :OPER_ID) RETURNING_VALUES :NUM, :NEW_DATE; EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :OPER_DATE, NULL, :OPER_ID) RETURNING_VALUES :NUM, :NEW_DATE;
NUM = NUM || '_' || REFERENCE; NUM = NUM || '_' || REFERENCE;
@@ -212,14 +224,14 @@ BEGIN
(MSSQL-версия, правка программиста 24.10.2026). */ (MSSQL-версия, правка программиста 24.10.2026). */
P = TRIM(PARAMETERS); P = TRIM(PARAMETERS);
REP_NUM = LEFT(P, POSITION(' ' IN P || ' ') - 1); REP_NUM = LEFT(P, POSITION(' ' IN P || ' ') - 1);
REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS DATE); REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS TIMESTAMP);
IF (DIRECTION = 'IN') THEN IF (DIRECTION = 'IN') THEN
BEGIN BEGIN
CMT = 'Перевод M2M (без поручения), GUID ' || GUID || ', референс ' || REFERENCE; CMT = 'Перевод M2M (без поручения), GUID ' || GUID || ', референс ' || REFERENCE;
INSERT INTO U_OP_INV_ZACH INSERT INTO U_OP_INV_ZACH
(DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET, (DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET,
CONDITION, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT") CONDITION, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, COMMENT)
VALUES VALUES
(:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET, (:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET,
NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT);
@@ -229,20 +241,20 @@ BEGIN
CMT = 'Перевод M2M, GUID ' || GUID || ', референс ' || REFERENCE; CMT = 'Перевод M2M, GUID ' || GUID || ', референс ' || REFERENCE;
INSERT INTO U_OP_INV_SPIS INSERT INTO U_OP_INV_SPIS
(DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET, (DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET,
OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT") OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, COMMENT)
VALUES VALUES
(:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET, (:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET,
NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT);
END END
/* Входящая запись (отчёт НРД) */ /* Входящая запись (отчёт НРД) */
FILER_ID = GEN_ID(OD_DOC_ID_GEN, 1); FILER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
FILER_DATE = CURRENT_TIMESTAMP; FILER_DATE = CURRENT_TIMESTAMP;
EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE; EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE;
INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS) INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS)
VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS); VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS);
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, "COMMENT", DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS) INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
VALUES (:FILER_ID, 8, :RUBRICA, 'Отчет (перевод через MOEX-МОСТ)', :REP_NUM, :REP_DATE, :CORR_FACE, VALUES (:FILER_ID, 8, :RUBRICA, 'Отчет (перевод через MOEX-МОСТ)', :REP_NUM, :REP_DATE, :CORR_FACE,
:FACE, :CLIENT, :PLACE, :FILER_DATE, NULL, 'MS010 / ' || :GUID || ' / ' || :REFERENCE); :FACE, :CLIENT, :PLACE, :FILER_DATE, NULL, 'MS010 / ' || :GUID || ' / ' || :REFERENCE);
@@ -362,7 +374,7 @@ DECLARE VARIABLE CLIENT INTEGER;
DECLARE VARIABLE FACE INTEGER; DECLARE VARIABLE FACE INTEGER;
DECLARE VARIABLE CLISER_ID INTEGER; DECLARE VARIABLE CLISER_ID INTEGER;
DECLARE VARIABLE DOL_ID INTEGER; DECLARE VARIABLE DOL_ID INTEGER;
DECLARE VARIABLE DD_DATE DATE; DECLARE VARIABLE DD_DATE TIMESTAMP;
DECLARE VARIABLE DD_NUM VARCHAR(64); DECLARE VARIABLE DD_NUM VARCHAR(64);
DECLARE VARIABLE OPER_ID INTEGER; DECLARE VARIABLE OPER_ID INTEGER;
DECLARE VARIABLE ST INTEGER; DECLARE VARIABLE ST INTEGER;
@@ -370,7 +382,7 @@ DECLARE VARIABLE EV_S VARCHAR(19);
DECLARE VARIABLE NOW_S VARCHAR(19); DECLARE VARIABLE NOW_S VARCHAR(19);
BEGIN BEGIN
SELECT FIRST 1 ME.GUID, ME.REFERENCE, ME.EVENT_TYPE, ME.EVENT_DATE, ME.M2M_REJECT_CODE, ME.PARAMETERS, M.DIRECTION, SELECT FIRST 1 ME.GUID, ME.REFERENCE, ME.EVENT_TYPE, ME.EVENT_DATE, ME.M2M_REJECT_CODE, ME.PARAMETERS, M.DIRECTION,
H.DOC, F.DOL, CAST(D.D_DATE AS DATE), D.NUM, F.SHARE, F.AMOUNT, F.PLACE, F.CLIENT, H.DEPONENT H.DOC, F.DOL, D.D_DATE, D.NUM, F.SHARE, F.AMOUNT, F.PLACE, F.CLIENT, H.DEPONENT
FROM FTV_M2M_EVENTS ME FROM FTV_M2M_EVENTS ME
LEFT JOIN FTV_M2M M ON M.GUID = ME.GUID LEFT JOIN FTV_M2M M ON M.GUID = ME.GUID
LEFT JOIN D_CLISER_M2M_DOL F ON F.DOL_REF = ME.REFERENCE LEFT JOIN D_CLISER_M2M_DOL F ON F.DOL_REF = ME.REFERENCE
@@ -384,7 +396,7 @@ BEGIN
IF (EVENT_TYPE = 'HANDBOOK') THEN IF (EVENT_TYPE = 'HANDBOOK') THEN
BEGIN BEGIN
EXECUTE PROCEDURE FTV_M2M_UPDATE_HANDBOOK RETURNING_VALUES :CMT; EXECUTE PROCEDURE FTV_M2M_UPDATE_HANDBOOK RETURNING_VALUES :CMT;
UPDATE FTV_M2M_EVENTS SET "COMMENT" = :CMT WHERE ID = :ID; UPDATE FTV_M2M_EVENTS SET COMMENT = :CMT WHERE ID = :ID;
EXIT; EXIT;
END END
@@ -399,7 +411,7 @@ BEGIN
/* 3. Признак документа */ /* 3. Признак документа */
EXECUTE PROCEDURE FTV_M2M_DT(:EVENT_DATE) RETURNING_VALUES :EV_S; EXECUTE PROCEDURE FTV_M2M_DT(:EVENT_DATE) RETURNING_VALUES :EV_S;
EXECUTE PROCEDURE FTV_M2M_DT(CURRENT_TIMESTAMP) RETURNING_VALUES :NOW_S; EXECUTE PROCEDURE FTV_M2M_DT(CURRENT_TIMESTAMP) RETURNING_VALUES :NOW_S;
INSERT INTO OD_INVALIDS (DOC, STATUS, "COMMENT", DO_ING) INSERT INTO OD_INVALIDS (DOC, STATUS, COMMENT, DO_ING)
VALUES (:CLISER_ID, 0, VALUES (:CLISER_ID, 0,
:EV_S || ' - ' || :EVENT_TYPE || COALESCE(' (референс - ' || :REFERENCE || ')', '') || COALESCE(' (параметры - ' || :PARAMETERS || ')', ''), :EV_S || ' - ' || :EVENT_TYPE || COALESCE(' (референс - ' || :REFERENCE || ')', '') || COALESCE(' (параметры - ' || :PARAMETERS || ')', ''),
'Время начала обработки: ' || :NOW_S); 'Время начала обработки: ' || :NOW_S);
@@ -474,6 +486,7 @@ DECLARE VARIABLE FILER_ID INTEGER;
DECLARE VARIABLE FILER_NUM VARCHAR(255); DECLARE VARIABLE FILER_NUM VARCHAR(255);
DECLARE VARIABLE FILER_DATE TIMESTAMP; DECLARE VARIABLE FILER_DATE TIMESTAMP;
DECLARE VARIABLE DOL_ID INTEGER; DECLARE VARIABLE DOL_ID INTEGER;
DECLARE VARIABLE D_DAY TIMESTAMP;
BEGIN BEGIN
EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS; EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS;
@@ -508,7 +521,7 @@ BEGIN
INTO :DEPONENT; INTO :DEPONENT;
/* 1.5. Шапка документа */ /* 1.5. Шапка документа */
CLISER_ID = GEN_ID(OD_DOC_ID_GEN, 1); CLISER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
D_DATE = CURRENT_TIMESTAMP; D_DATE = CURRENT_TIMESTAMP;
EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :D_DATE, NULL, :CLISER_ID) RETURNING_VALUES :NUM, :NEW_DATE; EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :D_DATE, NULL, :CLISER_ID) RETURNING_VALUES :NUM, :NEW_DATE;
@@ -549,7 +562,7 @@ BEGIN
/* Счёт клиента */ /* Счёт клиента */
SELECT FIRST 1 C.ID FROM OD_CLIENTS C WHERE C.NUMBER = :DEPO_NUMBER INTO :DEPO; SELECT FIRST 1 C.ID FROM OD_CLIENTS C WHERE C.NUMBER = :DEPO_NUMBER INTO :DEPO;
DOL_ID = GEN_ID(OD_DOL_ID_GEN, 1); DOL_ID = GEN_ID(OD_DOLS_ID_GEN, 1);
INSERT INTO OD_DOLS (ID, DOC) VALUES (:DOL_ID, :CLISER_ID); INSERT INTO OD_DOLS (ID, DOC) VALUES (:DOL_ID, :CLISER_ID);
INSERT INTO D_CLISER_M2M_DOL (DOL, SHARE, AMOUNT, DOL_REF, PLACE, CLIENT) VALUES (:DOL_ID, :SHARE, :AMOUNT, :REFERENCE, :PLACE, :DEPO); INSERT INTO D_CLISER_M2M_DOL (DOL, SHARE, AMOUNT, DOL_REF, PLACE, CLIENT) VALUES (:DOL_ID, :SHARE, :AMOUNT, :REFERENCE, :PLACE, :DEPO);
@@ -561,13 +574,14 @@ BEGIN
IF (DIRECTION = 'OUT') THEN IF (DIRECTION = 'OUT') THEN
BEGIN BEGIN
EXECUTE PROCEDURE FTV_M2M_GET('FILER_CAT') RETURNING_VALUES :FILER_CAT; EXECUTE PROCEDURE FTV_M2M_GET('FILER_CAT') RETURNING_VALUES :FILER_CAT;
FILER_ID = GEN_ID(OD_DOC_ID_GEN, 1); FILER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
FILER_DATE = CURRENT_TIMESTAMP; FILER_DATE = CURRENT_TIMESTAMP;
EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE; EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE;
EXECUTE PROCEDURE FTV_M2M_DAY(:D_DATE) RETURNING_VALUES :D_DAY;
INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS) INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS)
VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS); VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS);
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, "COMMENT", DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS) INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
VALUES (:FILER_ID, 7, 8, 'M2M поручение на списание через MOEX-МОСТ', :NUM, CAST(:D_DATE AS DATE), :DEPONENT, :DEPONENT, VALUES (:FILER_ID, 7, 8, 'M2M поручение на списание через MOEX-МОСТ', :NUM, :D_DAY, :DEPONENT, :DEPONENT,
:DEPO, :PLACE, :FILER_DATE, :D_CAT, :GUID); :DEPO, :PLACE, :FILER_DATE, :D_CAT, :GUID);
/* Связываем с M2M-поручением */ /* Связываем с M2M-поручением */
UPDATE OD_DOCS SET ID = 0, KVIT = :FILER_ID WHERE ID = :CLISER_ID; UPDATE OD_DOCS SET ID = 0, KVIT = :FILER_ID WHERE ID = :CLISER_ID;
@@ -597,7 +611,7 @@ BEGIN
CMT = COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'FTV_M2M_ERR') AS VARCHAR(255) CHARACTER SET WIN1251), 'ошибка Fancy') || ' // FTV_M2M_PROCESS_CREATE // SQLCODE ' || SQLCODE || ', GDSCODE ' || GDSCODE; CMT = COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'FTV_M2M_ERR') AS VARCHAR(255) CHARACTER SET WIN1251), 'ошибка Fancy') || ' // FTV_M2M_PROCESS_CREATE // SQLCODE ' || SQLCODE || ', GDSCODE ' || GDSCODE;
END END
END END
UPDATE FTV_M2M SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, "COMMENT" = :CMT WHERE ID = :ID; UPDATE FTV_M2M SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, COMMENT = :CMT WHERE ID = :ID;
END END
/* НОВЫЕ СОБЫТИЯ */ /* НОВЫЕ СОБЫТИЯ */
@@ -616,7 +630,7 @@ BEGIN
END END
/* без ошибки COMMENT не трогаем: в нём отчёт справочника (HANDBOOK) */ /* без ошибки COMMENT не трогаем: в нём отчёт справочника (HANDBOOK) */
IF (CMT IS NOT NULL) THEN IF (CMT IS NOT NULL) THEN
UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, "COMMENT" = :CMT WHERE ID = :ID; UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, COMMENT = :CMT WHERE ID = :ID;
ELSE ELSE
UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP WHERE ID = :ID; UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP WHERE ID = :ID;
END END
@@ -33,6 +33,7 @@ GRANT EXECUTE ON PROCEDURE FU_NEXT_DOC_NUM TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_FAIL;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_FAIL; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_FAIL;
@@ -70,6 +71,7 @@ GRANT EXECUTE ON PROCEDURE FU_NEXT_DOC_NUM TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_GET;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_GET; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_GET;
@@ -145,6 +147,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_WIRING;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_WIRING; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_WIRING;
@@ -182,6 +185,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_OPERATION
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_OPERATION; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
@@ -219,6 +223,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
@@ -256,6 +261,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_EVENTS; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
@@ -293,6 +299,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_CREATE;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_CREATE; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_CREATE;
@@ -330,6 +337,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_JOB;
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_JOB; GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_JOB;
+45 -26
View File
@@ -6,42 +6,61 @@
| Файл | Что делает | | Файл | Что делает |
|---|---| |---|---|
| `00_FTV_M2M_TABLES.sql` | таблицы `FTV_M2M*`, генераторы и триггеры ID, исключение `FTV_M2M_ERROR`, таблица привязок `FTV_M2M_SETTINGS` | | `00_FTV_M2M_TABLES.sql` | таблицы `FTV_M2M*`, генераторы и триггеры ID, исключение `FTV_M2M_ERROR`, таблица привязок `FTV_M2M_SETTINGS` |
| `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` | | `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT/DAY` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` |
| `20_FTV_M2M_GRANTS.sql` | права процедурам на таблицы Fancy и логину bj (`:BJ_USER`) на `FTV_M2M_JOB` и таблицы обмена | | `20_FTV_M2M_GRANTS.sql` | права процедурам на таблицы Fancy и логину bj (`:BJ_USER`) на `FTV_M2M_JOB` и таблицы обмена |
| `test/` | заглушки таблиц Fancy (по схеме MSSQL), прогон всех веток на встроенном Firebird 2.5.9 | | `test/` | заглушки таблиц Fancy (по схеме MSSQL), прогон всех веток на встроенном Firebird 2.5.9 |
Порядок установки: 00 → заполнить `FTV_M2M_SETTINGS` → 10 → 20 (под SYSDBA или владельцем базы). Порядок установки: 00 → заполнить `FTV_M2M_SETTINGS` → 10 → 20 (под SYSDBA или владельцем базы).
## Проверить и уточнить на базе клиента Файлы — в UTF-8, а база Fancy обычно в кодировке NONE с данными в WIN1251. Ставить в WIN1251, иначе русские
тексты процедур попадут в базу в UTF-8:
Процедуры проверены только на заглушках, собранных по схеме Fancy MSSQL. Fancy на MSSQL — перевод ```
Firebird-версии (`GEN_ID`, `f_*`, триггер `OD_DOCS_BU v4.59`), поэтому имена таблиц и колонок, скорее всего, iconv -f utf-8 -t cp1251 10_FTV_M2M_PROCS.sql > 10.sql
совпадают. Подтвердить на копии базы клиента: isql -ch WIN1251 -user SYSDBA -i 10.sql <сервер>:<путь к базе>
```
1. **Генераторы ID**: `OD_DOC_ID_GEN`, `OD_DOL_ID_GEN`, `OD_STEPS_ID_GEN`, `OD_FACES_ID_GEN` — есть ли с такими (в IBExpert — кодировка подключения WIN1251, файл открыть в UTF-8).
именами (`SELECT RDB$GENERATOR_NAME FROM RDB$GENERATORS`).
2. **`FU_NEXT_DOC_NUM`**: параметры `(CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)`, возвращает `(NUM, NEW_DATE)`; ## Проверено на базе Fancy
выполняемая (`EXECUTE PROCEDURE`), а не селективная.
3. **`OD_PR_INS_WIRS`**: 31 входной параметр в порядке MSSQL-версии, 4 выходных (`NEW_ID, WIR_LIST, DEB_ID, KRD_ID`). 27.10.2026, обезличенная база Fancy: Firebird 2.5.9, ODS 11.2, диалект 1, кодировка NONE, UDF `ib_Fansy` и
4. **`D_CLISER_M2M.DOC_GUID`**: тип колонки. Процедуры пишут GUID строкой `CHAR(36)` в верхнем регистре; если штатные триггеры Fancy. Прошли установка 00–20, справочник участников (HANDBOOK), поручения IN и OUT, события до
в Fancy это `CHAR(16) CHARACTER SET OCTETS` или строка с фигурными скобками — менять сравнение и запись. `BJ_EXECUTED`: операции зачисления и списания, входящие записи по отчёту НРД, проводки через `OD_PR_INS_WIRS`.
5. **Флаги**: `OD_FACES.LAST_FLAG = 1`, `E_DATE = '9999-01-01'`, `OD_CLIENTS_REC.E_DATE = '9999-01-01'` — те же Ошибки (неизвестный контрагент, повтор GUID, неизвестное событие, нет строки поручения) — текст в `COMMENT`.
значения в Firebird-версии (не `'T'`/`'F'`).
6. **Оператор**: под каким логином bj подключается к базе и заведён ли он в `OD_OPERATORS` (`USER_ID` = логин). Подтвердилось: имена и колонки таблиц; `FU_NEXT_DOC_NUM (CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)` — выполняемая,
`FU_NEXT_DOC_NUM` берёт `WHOS` и префикс номера из `OD_OPERATORS`/`OD_SETS` по текущему пользователю; триггеры принимает `SYS_NAME` или ID категории; `OD_PR_INS_WIRS` — 31 входной и 4 выходных параметра; `D_CLISER_M2M.DOC_GUID`
Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). В MSSQL-версии это обходилось `execute as SYSDBA`. — `VARCHAR(36)`; флаги `LAST_FLAG = 1`, `E_DATE = '9999-01-01'`; категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`,
7. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT` `D_FILER`; состояние `WAIT_RESP_DECIS`; кодировщик НДЦ; таблицы `D_CLISER_M2M*`, `U_OP_INV_ZACH/SPIS`.
Исправлено по итогам: генераторы `OD_DOCS_ID_GEN`/`OD_DOLS_ID_GEN`; `COMMENT` без кавычек (в диалекте 1 `"…"` —
строка); дата без времени — через `FTV_M2M_DAY` (в диалекте 1 `CAST(… AS DATE)` время не отрезает).
## Проверить у клиента
1. **UDF Fancy `ib_Fansy`**: без неё не читаются `OD_DOCS`, `OD_BALANCES` и не ставятся процедуры (вычисляемые
поля и триггеры Fancy). На сервере Fancy она есть всегда. Тестовый стенд без Windows — Firebird 2.5 для
Windows под wine с `ib_Fansy.dll` той же разрядности.
2. **Кодировщик M2M** — юрлицо `OD_FACES` с `MNEM = 'M2M'`. В проверенной базе его не было; без него HANDBOOK и
создание поручений падают с понятной ошибкой. Завести в Fancy или так (остальные поля заполнят триггеры Fancy):
`INSERT INTO OD_FACES (ID, S_TYPE, NAME, MNEM) VALUES (GEN_ID(OD_FACES_ID_GEN, 1), 1, 'Кодировщик M2M (справочник участников НРД)', 'M2M');`
3. **Оператор**: логин, под которым bj вызывает `FTV_M2M_JOB`, должен быть в `OD_OPERATORS` (`USER_ID` = логин,
`U_FACE` = `OD_SETS.WHOS`). `FU_NEXT_DOC_NUM` берёт депозитарий и префикс номера по текущему пользователю;
триггеры Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). Проверено под SYSDBA.
4. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT`
(категория `D_FILER`), `D_NUM`/`K_NUM` (балансовые счета 98010 и 98070), `MARKET` (Мосбиржа), `B_TYPE` (категория `D_FILER`), `D_NUM`/`K_NUM` (балансовые счета 98010 и 98070), `MARKET` (Мосбиржа), `B_TYPE`
(«Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`. («Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`. В проверенной базе счета,
8. **Справочники по имени**: категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`; состояния `WAIT_RESP_DECIS`, категория, биржа и тип основания совпали с Фонтвьель (313, 836, 255, 8106, 31) — справочники поставки Fancy;
`WAIT_OPER`; директива `PROCESS`; кодировщики `OD_FACES.MNEM = 'M2M'` и `'НДЦ'`. Таблицы `D_CLISER_M2M`, `WHOS` и `CORR_FACE` — свои (`OD_SETS.WHOS`; НРД — юрлицо с `MNEM = 'НДЦ'`).
`D_CLISER_M2M_DOL`, `U_OP_INV_ZACH/SPIS` — пользовательские (настройка M2M в Fancy), у клиента их может не быть. 5. **Кодировка и диалект**: `RDB$DATABASE.RDB$CHARACTER_SET_NAME`, `MON$DATABASE.MON$SQL_DIALECT`. При NONE или
9. **Кодировка базы**: WIN1251 (`RDB$DATABASE.RDB$CHARACTER_SET_NAME`). Текст ошибки из контекста приводится к WIN1251 — ставить в WIN1251 (см. выше); текст ошибки в `FTV_M2M_JOB` приводится к WIN1251.
WIN1251 — при другой кодировке поменять в `FTV_M2M_JOB`. 6. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; в проверенной базе поручения
10. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; сверить с `OD_DOC_STATES`. дошли до `STATE = 2`, сверить с `OD_DOC_STATES` клиента.
## Открытые вопросы логики (те же, что в MSSQL-версии) ## Открытые вопросы логики (те же, что в MSSQL-версии)
- `BJ_ORDER_REJECTED` не обрабатывается — уходит в «неизвестное событие» (вопрос программисту от 16.10.2026). - `BJ_ORDER_REJECTED` не обрабатывается — уходит в «неизвестное событие» (вопрос программисту от 16.10.2026).
- `BJ_CP_CONFIRM` с направлением OUT перехватывается веткой `BJ_DECISION_CONFIRM` выше. - `BJ_CP_CONFIRM` с направлением OUT перехватывается веткой `BJ_DECISION_CONFIRM` выше.
- Депонент не найден — поручение создаётся без депонента, ошибки нет. - Депонент не найден — поручение создаётся без депонента, ошибки нет. Ищется по имени и серии+номеру документа:
при пустой серии (`NULL`) не находится.
@@ -37,12 +37,12 @@ COMMIT;
EXECUTE PROCEDURE FTV_M2M_JOB; EXECUTE PROCEDURE FTV_M2M_JOB;
COMMIT; COMMIT;
SET LIST ON; SET LIST ON;
SELECT ID, GUID, STATE, DOC, CONTRAGENT, DEPONENT, CAST("COMMENT" AS VARCHAR(300)) C FROM FTV_M2M; SELECT ID, GUID, STATE, DOC, CONTRAGENT, DEPONENT, CAST(COMMENT AS VARCHAR(300)) C FROM FTV_M2M;
SELECT ID, STATE, DOC, DOL, SHARE, PLACE, DEPO FROM FTV_M2M_LINES; SELECT ID, STATE, DOC, DOL, SHARE, PLACE, DEPO FROM FTV_M2M_LINES;
SELECT ID, EVENT_TYPE, STATE, CAST("COMMENT" AS VARCHAR(600)) C FROM FTV_M2M_EVENTS; SELECT ID, EVENT_TYPE, STATE, CAST(COMMENT AS VARCHAR(600)) C FROM FTV_M2M_EVENTS;
SELECT ID, NUM, D_CAT, STATE, KVIT, WHOS FROM OD_DOCS ORDER BY ID; SELECT ID, NUM, D_CAT, STATE, KVIT, WHOS FROM OD_DOCS ORDER BY ID;
SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, B_DATE, CAST("COMMENT" AS VARCHAR(300)) C FROM U_OP_INV_ZACH; SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, B_DATE, CAST(COMMENT AS VARCHAR(300)) C FROM U_OP_INV_ZACH;
SELECT DOC, RUBRICA, DOC_NUM, DOC_DATE, CORR_FACE, MESS FROM D_FILER; SELECT DOC, RUBRICA, DOC_NUM, DOC_DATE, CORR_FACE, MESS FROM D_FILER;
SELECT DOC, CAST("COMMENT" AS VARCHAR(300)) C, CAST(DO_ING AS VARCHAR(100)) D FROM OD_INVALIDS; SELECT DOC, CAST(COMMENT AS VARCHAR(300)) C, CAST(DO_ING AS VARCHAR(100)) D FROM OD_INVALIDS;
SELECT CODE, CODER, FACE FROM OD_FACE_CODERS; SELECT CODE, CODER, FACE FROM OD_FACE_CODERS;
SELECT ID, DOC, A_DOC, S_TYPE, OUT_STATE, OPER FROM OD_STEPS; SELECT ID, DOC, A_DOC, S_TYPE, OUT_STATE, OPER FROM OD_STEPS;
@@ -584,13 +584,13 @@ CREATE TABLE U_OP_INV_ZACH (
"REESTR" INTEGER, "REESTR" INTEGER,
"CONDITION" INTEGER); "CONDITION" INTEGER);
CREATE GENERATOR OD_DOC_ID_GEN; CREATE GENERATOR OD_DOCS_ID_GEN;
SET GENERATOR OD_DOC_ID_GEN TO 1000; SET GENERATOR OD_DOCS_ID_GEN TO 1000;
CREATE GENERATOR OD_DOL_ID_GEN; CREATE GENERATOR OD_DOLS_ID_GEN;
SET GENERATOR OD_DOL_ID_GEN TO 1000; SET GENERATOR OD_DOLS_ID_GEN TO 1000;
CREATE GENERATOR OD_STEPS_ID_GEN; CREATE GENERATOR OD_STEPS_ID_GEN;