Skip to content

Instantly share code, notes, and snippets.

@atronah
Last active November 12, 2019 10:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atronah/78622c0c8b4f305ba4b689de7053905d to your computer and use it in GitHub Desktop.
Save atronah/78622c0c8b4f305ba4b689de7053905d to your computer and use it in GitHub Desktop.
РЕГИЗ.Справочники: Шаблон создания DICINFO-копии справочника
/*
Скрипт создания DICINFO-копии, в которой будут значения из последней загруженной и обработанной версии справочника РЕГИЗ.
Данный справочник предполагается использовать в МИС (как справочник параметров ИБ, как классификатор НСИ, как справочник для выболра значений в атрибуте сущности и т.д.).
**Внимание:** В данном скрипте поиск справочника среди имеющихся в МИС осуществляется по `REFDIC.REFCODE = :OID`
(в новых версиях, вероятно, стоит использовать `REFDIC.OID = :OID`)
Загрузка подразумевается через `SyncManager.exe` в режиме `Справочнике FHIR (API)`
из Сервиса Терминологии РЕГИЗ:
- Web-интерфейс тестового стенда: `http://r78-rc.zdrav.netrika.ru/nsiui`
- RESTful Сервис тестового стенда: `http://r78-rc.zdrav.netrika.ru/nsi/fhir/term`
В скрипте необходимо заменить следующие `placeholder`-ы:
- <oid> - OID справочника
- <refbook_title> - Название справочника
*/
set term ^ ;
execute block
as
declare cnt smallint;
declare is_simple_dicinfo_ref smallint;
declare refid type of column refdic.refid;
declare refcode type of column refdic.refcode;
declare refname type of column refdic.refname;
declare reftype type of column refdic.reftype;
declare extref type of column refdic.extref;
declare systemtype type of column refdic.systemtype;
declare sqlopen type of column refdic.sqlopen;
declare sqlinsert type of column refdic.sqlinsert;
declare sqldelete type of column refdic.sqldelete;
declare mis_table varchar(31);
declare mis_id_field varchar(31);
declare mis_table_cond varchar(255);
declare name_title type of column refdicdet.headername;
declare id_title type of column refdicdet.headername;
declare id_sqllookup type of column refdicdet.sqllookup;
declare extra_fields varchar(1024);
begin
refcode = '<oid>';
refname = '<refbook_title>';
refid = null;
reftype = 1; -- Тип справочника: 1 - плоский; 2 - мастер-детальный (мастер); 3 - мастер-детальный (детальный) - не используется; 4 - древовидный, зависимость по dicinfo.parentdicid
systemtype = 2; -- Тип справочника: 0 - DicInfo; 2 - SQL запросы - при редактировании проверяются запросы на корректность
refname = 'РЕГИЗ. ' || refname || ' (' || refcode || ' )';
select
max(refid), count(refid)
from refdic
where refcode = :refcode
into refid, cnt;
if (cnt > 1)
then execute procedure raise_exception('Несколько справочников с кодом @1', 2, :refcode);
if (refid is null)
then refid = next value for refid_gen;
-- Для редактирования справочника через Классификаторы НСИ
extref = 1; -- 1 - внешний справочник (нужно для отображения в Классификаторы НСИ);
sqlopen = 'select dicid, dicname, rekvtext1 as ext_code, txtcode as ext_version from dicinfo where refid = ' || refid || ' order by 3';
sqlinsert = null;
sqldelete = null;
-- Создание/обновление справочника
update or insert into refdic(refid, reftype, refcode, refname, extref, systemtype, sqlopen, sqlinsert, sqldelete)
values (:refid, :reftype, :refcode, :refname, :extref, :systemtype, :sqlopen, :sqlinsert, :sqldelete);
-- Создание/обновление полей справочника
merge into refdicdet as cur
using ( -- Поля справочника
select rd.refid
, fields.sortorder
, fields.c as columnname
, fields.n as headername
, fields.st as sourcetype
, fields.q as sqllookup
, fields.inv as invisible
, fields.tn as tablename
from refdic as rd
left join ( select 'dicid' as c, 'Идентификатор записи' as n
, null as st, null as q
, 1 as inv -- 1 - Не отображать
, 'dicinfo' tn
, 30 as sortorder
from rdb$database
union
select 'ext_code' as c, 'Внешний код' as n
, 0 as st -- Тип значения: 0 - Текст
, null as q
, 0 as inv, :mis_table tn
, 50 as sortorder
from rdb$database
union
select 'dicname' as c, :name_title as n
, 0 as st -- Тип значения: 0 - Текст
, null as q
, 0 as inv, :mis_table tn
, 60 as sortorder
from rdb$database
union
select 'ext_version' as c, 'Версия' as n
, 0 as st -- Тип значения: 0 - Текст
, null as q, 0 as inv
, :mis_table tn
, 90 as sortorder
from rdb$database
) as fields on 1 = 1
where rd.refcode = :refcode
order by 1, 2
) as upd
on cur.refid = upd.refid and cur.columnname = upd.columnname
when not matched then insert (refdicdetid, refid, columnname, headername, sourcetype, sqllookup, invisible, tablename, sortorder)
values (next value for refdicdet_gen, upd.refid, trim(upd.columnname), trim(upd.headername)
, upd.sourcetype, trim(upd.sqllookup), upd.invisible, trim(upd.tablename), upd.sortorder)
when matched then update
set headername = trim(upd.headername)
, sqllookup = trim(upd.sqllookup);
end^
set term ; ^
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment