Skip to content

Instantly share code, notes, and snippets.

@atronah
Created November 12, 2019 10:42
Show Gist options
  • Save atronah/d2dd0df7252e5082983aad34d971b696 to your computer and use it in GitHub Desktop.
Save atronah/d2dd0df7252e5082983aad34d971b696 to your computer and use it in GitHub Desktop.
РЕГИЗ.Справочники: Шаблон создания процедуры-обработчика загруженной версии справочника
/*
Скрипт создания процедуры-обработчика, который будет обновлять DICINFO-копию справочника на основе загруженной из РЕГИЗ новой версии.
Загрузка подразумевается через `SyncManager.exe` в режиме `Справочнике FHIR (API)`
из Сервиса Терминологии РЕГИЗ:
- Web-интерфейс тестового стенда: `http://r78-rc.zdrav.netrika.ru/nsiui`
- RESTful Сервис тестового стенда: `http://r78-rc.zdrav.netrika.ru/nsi/fhir/term`
В скрипте необходимо заменить следующие `placeholder`-ы:
- <refbook_name> - Название справочника латиницей с учетом ограничения именования объектов в СУБД FB
*/
set term ^ ;
-- Обработчик для загруженной версии справочника сервиса Терминологии
create or alter procedure mds_nterm_<refbook_name>_loader(
syncrefid type of column sync_reference.syncrefid, -- Идентификатор описания используемого для загрузки справочника/правила
syncverid type of column sync_refversions.syncverid -- Идентификатор версии загрузки
)
returns(
error_code smallint
, error_text ttext1024
, refid type of column refdic.refid
, refcode type of column sync_reference.refcode
, reftable type of column sync_reference.reftable
, vernum type of column sync_refversions.vernum
, verdate type of column sync_refversions.verdate
)
as
declare code varchar(255);
declare display varchar(1024);
declare version varchar(255);
declare contains varchar(4096);
declare syncrecid bigint;
declare dicid type of column dicinfo.dicid;
declare cnt bigint;
declare extra_field_name varchar(31);
declare extra_field_source_code varchar(31);
begin
error_code = 0;
error_text = '';
select refcode, reftable
from sync_reference
where syncrefid = :syncrefid
into refcode, reftable;
if (not exists(select rdb$relation_name
from rdb$relations
where rdb$relation_name = upper(:reftable)
-- The type of the relation object being described: 0 - system or user-defined table
and coalesce(rdb$relation_type, 0) = 0
-- indicates whether the table or view is user-defined (value 0) or system-defined (value 1 or greater)
and coalesce(rdb$system_flag, 0) = 0)
) then execute procedure raise_exception('Не найдена таблица @1 с данными справочника', 1, :reftable);
select max(refid), count(refid)
from refdic
where refcode = :refcode
into refid, cnt;
if (refid is null)
then execute procedure raise_exception('Не найден DICINFO-справочник с кодом @1', 2, :refcode);
if (cnt > 1)
then execute procedure raise_exception('Найдено несколько DICINFO-справочников с кодом @1', 2, :refcode);
select vernum, verdate
from sync_refversions
where syncverid = :syncverid
into vernum, verdate;
if (verdate is null)
then execute procedure raise_exception('Не указана дата обрабатываемой версии @1 (syncverid = @2)', 3, :vernum, :syncverid);
for execute statement
('select syncrecid, code, display, version, contains from ' || :reftable || ' where syncverid = :syncverid')
(syncverid := :syncverid)
into syncrecid, code, display, version, contains
do
begin
dicid = null;
select max(dicid), count(dicid)
from dicinfo
where refid = :refid
and rekvtext1 = :code
into dicid, cnt;
if (cnt > 1)
then execute procedure raise_exception('Найдено несколько записей с кодом @1 в DICINFO-справочнике @2 (refid=@3) ', 4, :code, :refcode, :refid);
if (dicid is null)
then dicid = next value for dic_gen;
update or insert into dicinfo (dicid, refid, dicname, simplename, rekvtext1, txtcode, rekvint1, disdate, modifydate)
values (:dicid, :refid, left(:display, 2048), left(:display, 255), left(:code, 255), left(:version, 24), :syncrecid, null, 'now');
end
-- Установка даты неактуальности для все записей, которые были в прошлой версии, но отсутствуют в обрабатываемой
execute statement ('update dicinfo as d
set d.disdate = :verdate
where d.refid = :refid
and not exists(select src.syncrecid
from ' || reftable || ' as src
where src.syncverid = :syncverid
and src.code = d.rekvtext1)')
(verdate := :verdate
, refid := :refid
, syncverid := syncverid);
suspend;
end^
set term ; ^
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment