Created
November 12, 2019 10:42
-
-
Save atronah/d2dd0df7252e5082983aad34d971b696 to your computer and use it in GitHub Desktop.
РЕГИЗ.Справочники: Шаблон создания процедуры-обработчика загруженной версии справочника
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Скрипт создания процедуры-обработчика, который будет обновлять 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