Сервисы AIS LPU

Posted: 13th Август 2018 by lis in АИС ЛПУ, Витакарта

Сервис для приема вызовов со скорой помощи — VitacardService

Проблема:

При выполнении запроса из связанного сервера через openrowset:

select *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\temp\Таблица соответ.xlsx', [Лист1$])

останавливается служба сервера и в панели результата запроса выходит сообщение об ошибке:

Сообщение 109, уровень 20, состояние 0, строка 0
Ошибка на транспортном уровне при получении результатов с сервера. (provider: Shared Memory Provider, error: 0 — Канал был закрыт.)

На сервере установлен MSSQL 2012 SP4.

Решение:

Чтобы сервер не крашился нужно установить хотфикс:

Статья: https://support.microsoft.com/en-us/help/2859413/sql-server-service-crashes-when-you-run-a-linked-server-query-on-a-win

Прямая ссылка на хотфикс: https://support.microsoft.com/ru-ru/hotfix/kbhotfix?kbnum=2859413&kbln=en-US

 

После этого запрос стал выдавать следующую ошибку:

Не удалось получить требуемый интерфейс («IID_IDBCreateCommand») от поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера

 

Данную проблему удалось решить следующим образом:

В свойствах провайдера нужно включит галочку: Allow inprocess (Допускать в ходе процесса)

Далее ПУСК — выполнить: Dcomcnfg

Службы компонентов — Мой компьютер — Настройка DCOM — MSDAINITIALIZE, щелкаем правой кнопкой, переходим на вкладку безопасность и во всех трёх группах переводим пульку на «Настроить», в каждой группе щелкаем кнопку «Изменить» и если у вас служба сервера стартует под учетной записью MSSQLSERVER, добавляем в каждой группе полные права для этой учетной записи. После этого запрос стал выполняться правильно.

Задача: Дан список из 1000 чисел, в каждом числе по 5 цифр:

12345

12346

12342

12341

12121

нужно каждое число заключить в кавычки:

‘12345’

Перейти к статье »

Для привязки выполнения рутинных запросов к горячим клавишам в SQL Server Management Studio есть механим, который доступен по следующему пути в русскоязычной версии:

«Сервис» — «Параметры» — «Среда» — «Клавиатура» — «Сочетания клавиш для запроса»

и по этому в англоязычной:

«Tools» — «Options» — «Environment» — «Keyboard» — «Query Shortcuts»

Там уже существует несколько привязок сочетаний клавиш к системным хранимым процедурам, например: alt+f1 вызывает системную переменную sp_help, в которую в качестве параметра передает выделенный текст.

Для ускорения работы с SSMS я советую добавить следующие запросы:

1. select * from

2. select top (100) * from

3. select count(*) from

Теперь, например, чтобы узнать количество записей в какой-либо таблице достаточно выделить текст с именем этой таблицы в SSMS и нажать комбинацию клавиш, к которой вы привязали запрос select count(*) from

На сервере для прозрачной авторизации (с помощью учетной записи Windows) используется отдельный порт для подключения клиента. Если в серверном конфиге блок для подключения уже прописан, то можете переходить к настройке клиентов, если же блок для подключения клиентов с Windows-авторизацией отсутствует, то его необходимо добавить и перезапустить службу для применения изменений.

<configuration>
  <system.runtime.remoting>
      <channels>
        <-- блок для подключения клиентов с Windows-авторизацией -->
        <channel ref="tcp" name="tcp0" port="32750" secure="true">
          <serverProviders>
            <provider type="GEst.Remoting.SspiServerSinkProvider, VCLib.Server" compression="false" notCompressedRequestLength="1024" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
        <-- конец блок для подключения клиентов с Windows-авторизацией -->

        <-- блок для подключения клиентов с обычной авторизацией по логину и паролю -->
        <channel ref="tcp" name="tcp1" port="32751">
          <serverProviders>
            <provider type="GEst.Remoting.BasicServerSinkProvider, VCLib.Server" encryption="false" compression="false" notCompressedRequestLength="1024" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
        <-- конец блок для подключения клиентов с обычной авторизацией по логину и паролю -->
      </channels>
    </application>
  </system.runtime.remoting>

Перейти к статье »

Чтобы в АИС ЛПУ (Витакарта) запретить создавать новых пользователей с простыми паролями можно создать валидацию с проверкой по регулярному выражению:

Создаем валидацию на сущности USERS

текст валидации:

Перейти к статье »

Ошибка при выгрузке заявочного списка из АИС ЛПУ (Витакарта):

Перейти к статье »

Задача: получить набор данных из Excel-файла в виде результата запроса SQL.

Все необходимые опции, заранее, были включены следующим скриптом:

Перейти к статье »

НАПОМИНАЮ, ЧТО ПЕРЕД ТЕМ, КАК ВЫ БУДЕТЕ ЧТО-ТО ДЕЛАТЬ С РАБОЧЕЙ БД ОБЯЗАТЕЛЬНО НУЖНО СДЕЛАТЬ ЕЁ БЭКАП!

Я совсем недавно стал практиковаться с SQL и, начал осознавать, что многие рутинные задачи манипулирования данными можно решить посредством паттернов (шаблонов). Другими словами, например, если стоит задача избавиться от дублирующихся записей в какой-либо таблице, нет необходимости каждый раз «изобретать велосипед», достаточно взять за основу шаблон кода, немного переписать его под нужную таблицу и скрипт избавления от дубликатов готов.

Данное решение мне показал мой наставник по SQL — Ильнур, и я решил увековечить его в своем блоге.

Для примера в этой статье я буду рассматривать поиск дубликатов-сотрудников, в таблице T_WORKER, перепривязку всех внешних ключей на одного из сотрудника-дубликата, с целью оставить одного из дубликатов полностью без зависимых записей в других таблицах, и дальнейшее удаление всех сотрудников-дубликатов, оставив из каждой дублирующейся записи только одну. Следующий скрипт:

Перейти к статье »

Для того, чтобы не допустить изменения какого-либо поля у существующего объекта можно построить валидацию по примеру со следующей:

Данная валидация запрещает изменение кода врача у уже существующих врачей. Построена на сущности POST.

Текстовый вид валидации:

(if ({ObjectProperties / Fields / Code} & 8 > 0 And {ObjectProperties / IsNew} = False) "Код врача недоступен для редактирования!" else Null())