SQL-запросы для МИС САМСОН

MySQL, MSSQL, PostgreSQL и пр.

Модератор: DNK

SQL-запросы для МИС САМСОН

Сообщение max » 15 дек 2014, 14:18

Доброго времени суток! Т.к. в используемой МИС на данный момент отсутствует возможность формирования отчетности по рецептам,
задался вопросом, создания отчета в МИС САМСОН по выписанным льготным рецептам при помощи SQL.

Интересует следующее:

Есть таблица actionproperty_blankserialnumber, в которой хранятся данные - серия и номер выписанного льготного рецепта. Не могу найти связь этой таблицы, с другими таблицами содержащих данные о выписанном льготном рецепте. Это нужно для того, чтобы при выгрузке данных пациентов получивших рецепт, выгружать и номер рецепта.

С какой из таблиц БД имеет связь таблица actionproperty_blankserialnumber?
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение max » 16 дек 2014, 13:16

Урааа...нашлось...теперь дело сдвинется с мертвой точки...!!!

наводка тем кому интересно:

поле id таблицы actionproperty_blankserialnumber совпадает с полем id таблицы actionproperty, ну а дальше понятно будет куда ковырять...
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение max » 17 дек 2014, 16:15

На досуге написал набросок по выборке информации по рецептам, можно использовать, как для федеральных так и для региональных рецептов, нужно только параметры в скрипте поменять.
Скрипт работает на dbForge Studio for MySQL, для других сред нужно будет подправлять синтаксис.

Код: выделить все
USE s11;
SELECT *
    FROM (SELECT
    c.id AS Номер_карты,
    CONCAT(c.lastName,' ',c.firstName,' ',c.patrName) AS Пациент,
    c.birthDate AS ДатаР,
    c.SNILS AS СНИЛС,
    CAST(e.createDatetime AS DATE) as Дата_выписки,
    ab.value AS СН_Рецепта
    from client c
INNER JOIN  event e
    ON c.id = e.client_id
INNER JOIN action a
    ON a.event_id = e.id
INNER JOIN actionproperty a1
    ON a.id = a1.action_id
INNER JOIN actionproperty_blankserialnumber ab
    ON a1.id = ab.id
WHERE a.actionType_id = '52220') сс


По возможности доработаю дальше...ну или кто-то из форумчан допилит!
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение max » 18 дек 2014, 13:44

Проверка пересечения посещений с диспансеризацией.
Если нет возможности напрямую создавать запросы к БД САМСОН, а при формировании счетов долго идет проверка на ошибки,что занимает тоже приличное время, можно сократить кол-во повторных формирований счетов и проверок к минимуму, что сэкономит время. Для этого формируем реестры счетов, без проверки, далее смотрим скрипт.
Скрипт написан для выполнения на SQL Server 2012, для корректного выполнения на других версиях SQL возможно нужно будет править код
Код: выделить все

if object_id('tempdb..#tabl') is not null drop table #tabl  -- проверка на существование таблицы
/**--Создание временной таблицы  персональных счетов по диспансеризации в МИС САМСОН--**/
create table #tabl
    (ISTI FLOAT,
    FIO nvarchar(20),
   IMA nvarchar(15),
   OTCH nvarchar(15),
   KUSL nvarchar(30),
   DATR datetime,
   DATN datetime,
   DATO datetime)
/**--Заносим данные в созданную таблицу--**/
   insert into #tabl
select *
FROM
(SELECT P.ISTI AS [ISTI],
P.FIO AS [FIO], P.IMA AS [IMA], P.OTCH AS [OTCH],
U.KUSL AS [KUSL],
P.DATR AS [DATR],
U.DATN AS [DATN],
U.DATO AS [DATO]
from
opendatasource
('Microsoft.ACE.OLEDB.12.0',
'Data Source=F:\;
Extended Properties=DBASE IV')...[P02025.DBF] P /*файлы из реестра счетов по диспансеризации*/
inner join
opendatasource
('Microsoft.ACE.OLEDB.12.0',
'Data Source=F:\;
Extended Properties=DBASE IV')...[U02025.DBF] U
ON P.SN = U.SN
WHERE left(U.KUSL, 7) = 'B04.047') D
/*************************************/

if object_id('tempdb..#tab2') is not null drop table #tab2  -- проверка на существование таблицы
/**--Создание временной таблицы  персональных счетов по ОМС в МИС САМСОН--**/
create table #tab2
    (ISTI FLOAT,
    FIO nvarchar(20),
   IMA nvarchar(15),
   OTCH nvarchar(15),
   KUSL nvarchar(30),
   DATR datetime,
   DATN datetime,
   DATO datetime)
/**--Заносим данные в созданную таблицу--**/
   insert into #tab2
select *
FROM
(SELECT P.ISTI AS [ISTI],
P.FIO AS [FIO], P.IMA AS [IMA], P.OTCH AS [OTCH],
U.KUSL AS [KUSL],
P.DATR AS [DATR],
U.DATN AS [DATN],
U.DATO AS [DATO]
from
opendatasource
('Microsoft.ACE.OLEDB.12.0',
'Data Source=F:\;
Extended Properties=DBASE IV')...[P0202.DBF] P /*файлы из реестра счетов по посещениям*/
inner join
opendatasource
('Microsoft.ACE.OLEDB.12.0',
'Data Source=F:\;
Extended Properties=DBASE IV')...[U0202.DBF] U
ON P.SN = U.SN
WHERE left(U.KUSL, 7) = 'B01.047') Z
/**--Вывод задублированного посещения--**/
select I.ISTI as [ИСТОРИЯ БОЛ],I.FIO+ ' ' + I.IMA + ' ' + I.OTCH AS [ФИО],
CAST(I.DATR AS DATE) AS [Дата рождения]
FROM #tabl I
inner join #tab2 J
ON I.ISTI =  J.ISTI
WHERE I.DATN = J.DATN
AND I.DATO = J.DATO
order by ФИО

Так же можно проверить счета скриптами и на другие ошибки.
После исправления ошибок, переформировываем счета с контролем ошибок!
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение max » 18 дек 2014, 14:07

Если нужно быстро получить информацию, о том сколько отдельно на каждого врача создано карт по диспансеризации (в примере выгружается первый этап) за определенный период, то нужно выполнить этот маленький скрипт приведенный ниже.
Скрипт работает на dbForge Studio for MySQL, для других сред нужно будет подправлять синтаксис.
Код: выделить все
USE s11
SELECT p.Врач,
  p.Этап1
  FROM
  (SELECT CONCAT(per.lastName,' ',per.firstName,' ',per.patrName) AS Врач,
    COUNT(*) AS Этап1
  FROM event e
  inner join person per
on e.setPerson_id = per.id
  WHERE e.eventType_id IN (61,63,65,67,81)
  and e.setDate >= '20141201' /*указываем нужные даты*/
  AND e.setDate <= '20141225'
  GROUP BY CONCAT(per.lastName,' ',per.firstName,' ',per.patrName)) p
  union all
select 'Всего',
(select COUNT(*)
from event l
WHERE l.eventType_id IN (61,63,65,67,81)
  and l.setDate >= '20141201' /*указываем нужные даты*/
  AND l.setDate <= '20141225')
 
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение Vady » 18 дек 2014, 14:24

Vady
 
Сообщений: 9
Зарегистрирован: 08 ноя 2014, 22:31
Регион: Смоленская область
Муниципальное образование: Велижский район
Наименование организации: ОГБУЗ "Велижская ЦРБ"
Рабочий телефон: 84813241868

SQL-запросы для МИС САМСОН

Сообщение max » 29 дек 2014, 12:10

Выкладываю скрипт по проверке двух распространенных ошибок:
1) Пересечение специальностей в один день;
2) Пересечение посещений с диспансеризацией.
Скрипт необходимо выполнять перед началом формирования реестров счетов.
Скрипт работает на dbForge Studio for MySQL, для других сред нужно будет подправлять синтаксис.
Код: выделить все
/*Проверка ошибок перед формированием реестров счетов*/
USE s11;
/*Проверяем пересечение специальностей в один день*/
SELECT  e.client_id as Номер_карты, /*выводим номер истории болезни пациента*/
       CONCAT(c.lastName,' ',c.firstName,' ',c.patrName) AS ФИО, /*выводим фио пациента*/
        c.birthDate AS Дата_рождения,
        CAST(e.execDate as Date) as Дата_посещения,
        'Пересечение посещений в один день одной специальности' AS Ошибка 
FROM event e
  INNER JOIN vrbperson v
    ON e.execPerson_id = v.id
  INNER JOIN client c
    ON e.client_id = c.id
  WHERE e.execDate BETWEEN '20141201' AND '20141230' /*указываем период проверки*/
    AND e.eventType_id IN (2, 4, 81) /*типы посещений*/
GROUP BY e.client_id, e.execDate, v.speciality_id
HAVING COUNT(*)>1
/*Проверяем на пересечение посещений с диспансеризацией*/
UNION ALL
  SELECT e1.client_id AS Номер_карты,
         e1.ФИО,
         e1.Дата_рождения,
         CAST(e1.execDate as Date) as Дата_посещения,
        'Пересечение посещения с диспансеризацией' AS Ошибка
    FROM
    (SELECT e.client_id,
      CONCAT(c.lastName,' ',c.firstName,' ',c.patrName) AS ФИО,
      c.birthDate AS Дата_рождения,
      e.execDate,
      v.speciality_id
      FROM event e
         INNER JOIN vrbperson v
           ON e.execPerson_id = v.id
         INNER JOIN client c
    ON e.client_id = c.id
         WHERE e.execDate BETWEEN '20141201' AND '20141231' /*указываем период проверки*/
           AND e.eventType_id IN (2, 4, 81)) e1
         INNER JOIN
     (SELECT e.client_id, e.execDate, v.speciality_id
       FROM event e
          INNER JOIN vrbperson v
            ON e.execPerson_id = v.id
          WHERE e.execDate BETWEEN '20141201' AND '20141231' /*указываем период проверки*/
            AND e.eventType_id IN (61, 62, 63, 64, 65, 66, 67, 68)) e2
            ON e1.client_id = e2.client_id
            AND e1.execDate = e2.execDate
            AND e1.speciality_id = e2.speciality_id
 

Если найдены ошибки,то исправляем их до формирования реестров счетов.
Результат выполнения на изображении:
Вложения
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение max » 27 фев 2015, 12:58

Всем привет!

Возможно кому-то пригодится, у кого база КПС САМСОН версии 14100 (ниже, возможно, тоже будет работать, не проверял) . Если кто-то обратил внимание, то после того, как начали по-новому создавать обращения, отчетные формы начали естественно выдавать не ту инфу которая нужна.

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

Скрипт работает на dbForge Studio for MySQL, для других сред нужно будет по необходимости подправлять синтаксис.

Код: выделить все
SET@a='20150201';  /*Год,месяц,число*/
SET@b='20150228';  /*Год,месяц,число*/
  SELECT s.Врач,s.Посещения
    FROM
  (SELECT
        CONCAT(p.lastName,' ',p.firstName,' ',p.patrName) AS Врач,
        COUNT(a.id) AS Посещения
  FROM person p
        INNER JOIN event e
  ON p.id=e.setPerson_id
        INNER JOIN action a
  ON e.id=a.event_id
        INNER JOIN actiontype a1
  ON a1.id = a.actionType_id
        WHERE e.eventType_id IN ('2','4')
          AND a.actionType_id NOT IN ('52754','52759','52760','52761','52758','52757','52756','52755')
          AND a1.code in ('В01.047.005','В01.047.006','В01.047.001','В01.047.002','В01.047.014','В01.047.018',
          'В01.029.001','В01.029.002','В01.028.001','В01.028.002','В01.023.001','В01.023.002',
          'В01.015.001','В01.015.002','В01.053.001','В01.053.002','В01.057.001','В01.057.002',
          'В01.058.001','В01.058.002','В04.001.007')
          AND e.setDate >= @a
          AND e.setDate <= @b
  GROUP BY Врач) s
    UNION ALL
    SELECT 'Всего', SUM(s1.Посещения)
    FROM
         (SELECT
        CONCAT(p.lastName,' ',p.firstName,' ',p.patrName) AS Врач,
        COUNT(a.id) AS Посещения
  FROM person p
        INNER JOIN event e
  ON p.id=e.setPerson_id
        INNER JOIN action a
  ON e.id=a.event_id
        INNER JOIN actiontype a1
  ON a1.id = a.actionType_id
        WHERE e.eventType_id IN ('2','4')
          AND a.actionType_id NOT IN ('52754','52759','52760','52761','52758','52757','52756','52755')
          AND a1.code in ('В01.047.005','В01.047.006','В01.047.001','В01.047.002','В01.047.014','В01.047.018',
          'В01.029.001','В01.029.002','В01.028.001','В01.028.002','В01.023.001','В01.023.002',
          'В01.015.001','В01.015.002','В01.053.001','В01.053.002','В01.057.001','В01.057.002',
          'В01.058.001','В01.058.002','В04.001.007')
          AND e.setDate >= @a
          AND e.setDate <= @b
  GROUP BY Врач) s1

Вложения
Результат выполнения скрипта
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473

SQL-запросы для МИС САМСОН

Сообщение Denis » 23 апр 2015, 10:43

Интересует внедрение в проверку реестров скриптика для 290 ошибки - "сумма к оплате по случаю заболевания равна 0"

т.к. в SQL запросах только начал осваиваться, спрошу:
SELECT P.* FROM rbCheckAccauntsP P WHERE P.SUMMA_I = 0

Будет удовлетворять требованиям? Или нужно подбирать сумму полей из U?
работает вроде. Проверил на отказах.
МБУЗ г. Сочи "Стоматологическая поликлиника №2"
Denis
 
Сообщений: 31
Зарегистрирован: 20 авг 2014, 09:20
Регион: Краснодарский Край
Муниципальное образование: г. Сочи
Наименование организации: МБУЗ г. Сочи "Стоматологическая поликлиника №2"
Рабочий телефон: 89002786009

SQL-запросы для МИС САМСОН

Сообщение max » 24 апр 2015, 12:30

Denis писал(а):Будет удовлетворять требованиям? Или нужно подбирать сумму полей из U?
работает вроде. Проверил на отказах.


Ну если после выявления таковых и устранения возврат по данной ошибке не приходит, то значит все отлично.

А суммы файла U и P можно сопоставить между собой на отличие стоимости файла услуг и файла содержащего паспортную часть, бывает такое (редко), что сумма файла услуг больше суммы файла P, что тоже приводит к возврату всего счета.
Михайличенко Максим
МБУЗ "Городская многопрофильная больница" г. Армавир
МБУЗ "Детская городская больница" г. Армавир
сот.: 8 (918) 23-93-473
Аватар пользователя
max
 
Сообщений: 70
Зарегистрирован: 14 авг 2014, 10:58
Регион: Краснодарский край
Муниципальное образование: Армавир
Наименование организации: МБУЗ "Городская многопрофильная больница" г.Армавир
Рабочий телефон: 89182393473


Вернуться в СУБД



Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1