На вкладке SQL (подготовка) (рис. 14.1.6) в окне Настройка импорта можно указать скрипт инициализации, выполнение которого подготавливает импортируемые данные в таблицах импорта к быстрой обработке и переносу в системные таблицы.
Рисунок 14.1.6. SQL (подготовка)
С помощью скрипта инициализации можно создать в таблицах импорта сервисные поля и инициализировать их значения, создать индексы, загрузить дополнительные данные в буферные таблицы, сформировать логи и т.п.
Примеры применения скрипта инициализации:
·создание в таблицах импорта отдельных полей для пациентов, прикреплений и медицинских программ, куда будет прописываться признак новой записи (такие записи отсутствуют в базе данных МЕДИАЛОГ по ключам поиска), и их заполнение;
·обновление названий медицинских программ, наборов услуг и прочих справочных данных, для которых уникальным остается код, совпадающий в таблице импорта и в базе данных МЕДИАЛОГ;
·добавление новых медицинских программ, наборов услуг, типов рисков и т.п. в соответствующие справочники;
·добавление новых и обновление существующих условий страхования по медицинcким программам;
·обнуление значений ID в таблицах импорта для подготовки к следующему импорту.
При написании скрипта используется синтаксис языка SQL, в том числе поддерживается использование оператора GO.
Оператор GO всегда должен идти в отдельной строке. Оператор GO поддерживается только в скрипте инициализации.
Пример скрипта инициализации
При импорте прикреплений пациентов скриптом инициализации можно явно указать ID пациента, прописав значение в поле _PATIENTS_ID основной таблицы импорта. В этом случае система при обработке импортируемых данных не будет искать пациентов по ФИО и прочим атрибутам, а сразу использует заданный уникальный номер пациента. Таким образом, время импорта значительно сократится.
/* Добавляем поле "Признак существования прикрепления в базе данных МЕДИАЛОГ" в таблицу импорта. */
alter table [dbo].[IMP_INSURANSE] add IS_EXIST int
GO
set NOCOUNT on
declare @INSURANSE_ID int
exec IMP_FIND_EXIST_PAT
-------------------------ПРОЦЕДУРА. НАЧАЛО ОПИСАНИЯ-------------------------
set ANSI_NULLS on
GO
set QUOTED_IDENTIFIER on
GO
create PROCEDURE [dbo].[IMP_FIND_EXIST_PAT]
as
BEGIN
set NOCOUNT on
/* Для ускорения импорта прикреплений проставляем безусловный PATIENTS_ID для тех записей, в которых пациент совпадает по признаку [ФИО + номер полиса] с пациентом в базе данных МЕДИАЛОГ. */
update IMP_INSURANSE
set PATIENTS_ID = fm_cp.PATIENTS_ID
from IMP_INSURANSE as imp_i
inner join PATIENTS as pat
on (imp_i.SURNAME = pat.NOM
and imp_i.FIRST_NAME = pat.PRENOM
and imp_i.SEC_NAME = pat.PATRONYME)
inner join FM_CLINK_PATIENTS as fm_cp
on (fm_cp.PATIENTS_ID = pat.PATIENTS_ID
and fm_cp.POLICE = imp_i.POLICY)
/* Для каждой записи о прикреплении пациента в таблице импорта определяем новое прикрепление или нет, определяя соответствие в базе данных МЕДИАЛОГ по коду медицинской программы, полису, дате начала и дате окончания прикрепления. Проставляем признак IMP_INSURANCE.IS_EXIST = 0 для новой записи, IMP_INSURANCE.IS_EXIST = 1 для существующей. При этом учитывается договор, так как может быть случай, когда одно и тоже прикрепление, для одной и той же по коду медпрограммы присутствует в разных договорах. */
update IMP_INSURANCE
set IS_EXIST = case when isnull(fm_cp.FM_CLINK_PATIENTS_ID, 0) = 0
then 0 else 1 end
from IMP_INSURANCE as imp_i
left join FM_CONTR as fm_cr
on fm_cr.CODE = imp_i.CONTR_CODE
left join FM_CLINK as fm_c
on (fm_c.CODE = imp_i.CLINK_CODE
and fm_c.FM_CONTR_ID = fm_cr.FM_CONTR_ID)
left join FM_CLINK_PATIENTS as fm_cp
on (fm_c.FM_CLINK_ID = fm_cp.FM_CLINK_ID
and fm_cp.POLICE = imp_i.POLICY
and fm_cp.DATE_FROM = imp_i.DATE_FRM
and fm_cp.DATE_TO = imp_i.DATE_TO
and fm_cp.PATIENTS_ID = imp_i._PATIENTS_ID)
END
-----------------------------ПРОЦЕДУРА. КОНЕЦ ОПИСАНИЯ-------------------