Firebird: автоопределение из DEPO как на MSSQL — реквизиты организации и поиск без учёта регистра

Проверено по шагам мастера, что bj берёт из DEPO сам: подготовка базы, префикс счетов (шаг 3), реквизиты
(шаг 4), готовность (шаг 10), ручной ввод, подбор клиента для портфеля ЛК.
- Реквизиты (Det01): счёт НРД ссылается на исходную версию лица, а ИНН НРД бывает только в новых (в исходной —
  ИНН НДЦ) — лицо по любой версии (ID или SELF_ID; ИНН НРД или MNEM «НДЦ»); номер счёта — и «счёт/раздел»,
  не только «счёт/LEI/код/раздел». Счёт НРД — тот, с которым записан выбранный раздел (пара «раздел + счёт»
  — по ней процедуры находят место хранения), а не самый частый. Для MSSQL — только шире: прежнее находится.
- Поиск по ФИО, договору и счёту — без учёта регистра, как в MSSQL (Cyrillic_General_CI_AS): в базе Fancy
  с кодировкой NONE регистр кириллицы различается — Firebird-варианты сравнивают в WIN1251 (подбор клиента
  для портфеля ЛК — запросы вынесены в fsql/lkportfolio.go, поиск и список договоров).
- На копии базы: шаг 4 — счёт, код, разделы, ИНН и наименования организации; поиск «бр-1147», «бубликов»
  находит; FBLivePrepare — 103 из 103.

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 20:09:59 +03:00
parent 312e4f70f1
commit 03918b1e58
9 changed files with 104 additions and 19 deletions
+7 -3
View File
@@ -3,9 +3,13 @@ package fsql
// Автоопределение реквизитов депозитария в DEPO (Fancy) для первичной настройки.
// Det01 — счета депозитария в НРД: в DEPO это счета «лица НКО АО НРД» (ИНН 7702165310 одинаков у всех
// клиентов Fancy). NUMBER = <депозитарный счёт>/<LEI>/<код>/<раздел>.
var Det01 = `SELECT c.NUMBER, ISNULL(c.STATE,0), ISNULL(c.NAME,'') FROM OD_CLIENTS c JOIN OD_FACES f ON f.ID=c.FACE
WHERE f.INN='7702165310' AND c.NUMBER LIKE '%/%/%/%' ORDER BY c.STATE, c.NUMBER`
// клиентов Fancy; кодировщик НРД — MNEM «НДЦ»). Счёт ссылается на исходную версию лица (SELF_ID), а ИНН НРД
// бывает только в новых (в исходной — прежний ИНН НДЦ), поэтому лицо — по любой версии. NUMBER —
// <депозитарный счёт>/<LEI>/<код>/<раздел> или <депозитарный счёт>/<раздел> (обезличенная база Fancy на Firebird).
var Det01 = `SELECT c.NUMBER, ISNULL(c.STATE,0), ISNULL(c.NAME,'') FROM OD_CLIENTS c
WHERE c.NUMBER LIKE '%/%' AND EXISTS (SELECT 1 FROM OD_FACES f WHERE (f.ID = c.FACE OR f.SELF_ID = c.FACE)
AND (f.INN = '7702165310' OR f.MNEM = N'НДЦ'))
ORDER BY c.STATE, c.NUMBER`
// Det03 — карточка организации по коду участника НРД: действующая версия лица (кодер ссылается на исходную
// запись SELF_ID, действующая — LAST_FLAG=1) и юридические наименования из OD_U_FACES. NAME в OD_FACES —
+20
View File
@@ -94,6 +94,26 @@ var FB = map[string]string{
(SELECT FIRST 1 CAST(x.RATE AS DOUBLE PRECISION) FROM OD_VALUES_RATES x WHERE x.VALUE_ID = v.ID AND x.MARKET = 0 AND x.RATE > 0 ORDER BY x.OFICDATE DESC)
FROM OD_VALUES v WHERE v.V_TYPE = 1`,
// Поиск по ФИО, договору и счёту без учёта регистра, как в MSSQL (Cyrillic_General_CI_AS): в базе Fancy с
// кодировкой NONE сравнение и UPPER различают регистр кириллицы — сравниваем в WIN1251.
Lkp01: `SELECT FIRST 50 COALESCE(p.PORT_NUM,''), COALESCE(f.NAME,''), c.NUMBER
FROM OD_CLIENTS c JOIN OD_FACES f ON f.ID=c.FACE LEFT JOIN OD_CLIENTS_PORTS p ON p.CLIENT=c.ID
WHERE c.NUMBER LIKE @pre AND c.STATE=0 AND c.D_CLOSE IS NULL
AND (UPPER(CAST(f.NAME AS VARCHAR(255) CHARACTER SET WIN1251)) LIKE UPPER(CAST(@q AS VARCHAR(260) CHARACTER SET WIN1251))
OR UPPER(CAST(p.PORT_NUM AS VARCHAR(255) CHARACTER SET WIN1251)) LIKE UPPER(CAST(@q AS VARCHAR(260) CHARACTER SET WIN1251))
OR UPPER(CAST(c.NUMBER AS VARCHAR(255) CHARACTER SET WIN1251)) LIKE UPPER(CAST(@q AS VARCHAR(260) CHARACTER SET WIN1251)))
ORDER BY f.NAME`,
QDb02: `SELECT FIRST (%d) DISTINCT PORT_NUM FROM OD_CLIENTS_PORTS
WHERE UPPER(CAST(PORT_NUM AS VARCHAR(255) CHARACTER SET WIN1251)) LIKE UPPER(CAST(@p1 AS VARCHAR(260) CHARACTER SET WIN1251)) ORDER BY PORT_NUM`,
Dp02: `SELECT FIRST (%d) p.PORT_NUM, COUNT(DISTINCT rst.VALUE_ID)
FROM OD_CLIENTS_PORTS p
JOIN OD_CLIENTS c ON c.ID = p.CLIENT
JOIN OD_RESTS rst ON rst.REG_1 = c.ID
JOIN OD_VALUES v ON v.ID = rst.VALUE_ID AND v.V_TYPE = 2
WHERE CAST(rst.K AS DOUBLE PRECISION) <> 0 AND (CAST(@p1 AS VARCHAR(255)) = ''
OR UPPER(CAST(p.PORT_NUM AS VARCHAR(255) CHARACTER SET WIN1251)) LIKE UPPER(CAST(@p2 AS VARCHAR(260) CHARACTER SET WIN1251)))
GROUP BY p.PORT_NUM ORDER BY p.PORT_NUM`,
// SELECT без FROM в Firebird нет
QEvPosted: `SELECT (SELECT COUNT(*) FROM FTV_M2M WHERE GUID=@g),
(SELECT COUNT(*) FROM FTV_M2M_EVENTS WHERE GUID=@g AND EVENT_TYPE='BJ_ORDER_ACCEPTED' AND STATE='SUCCESS'),
+12
View File
@@ -0,0 +1,12 @@
package fsql
// Lkp01 — поиск клиента для синхронизации портфеля ЛК: по ФИО, договору или счёту (до 50).
var Lkp01 = `SELECT TOP 50 ISNULL(p.PORT_NUM,''), ISNULL(f.NAME,''), c.NUMBER
FROM OD_CLIENTS c JOIN OD_FACES f ON f.ID=c.FACE LEFT JOIN OD_CLIENTS_PORTS p ON p.CLIENT=c.ID
WHERE c.NUMBER LIKE @pre AND c.STATE=0 AND c.D_CLOSE IS NULL AND (f.NAME LIKE @q OR p.PORT_NUM LIKE @q OR c.NUMBER LIKE @q)
ORDER BY f.NAME`
// Lkp02 — все открытые торговые счета с портфелем (режим «для всех клиентов»).
var Lkp02 = `SELECT ISNULL(p.PORT_NUM,''), c.NUMBER
FROM OD_CLIENTS c LEFT JOIN OD_CLIENTS_PORTS p ON p.CLIENT=c.ID
WHERE c.NUMBER LIKE @pre AND c.STATE=0 AND c.D_CLOSE IS NULL AND p.PORT_NUM IS NOT NULL`