<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en_US" lang="en_US"> <head> <title> GmManualReportGeneratorRu < Gnumed < Foswiki</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name="robots" content="noindex" /> <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="WebRss.html" /> <link rel="icon" href="../rsrc/System/ProjectLogos/favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="../rsrc/System/ProjectLogos/favicon.ico" type="image/x-icon" /> <link rel="alternate" href="http://wiki.gnumed.de/bin/edit/Gnumed/GmManualReportGeneratorRu?t=1362919418" type="application/x-wiki" title="edit GmManualReportGeneratorRu" /> <meta name="description" content="GmManualReportGeneratorRu" /> <!--[if IE]></base><![endif]--> <style type="text/css" media="all"> @import url('../rsrc/System/SkinTemplates/base.css'); </style> <style type="text/css" media="all"> @import url('../rsrc/System/SkinTemplates/default.css'); </style> <!--[if IE]><style type="text/css" media="screen"> pre { overflow-x:auto; padding-bottom:expression(this.scrollWidth > this.offsetWidth ? 16 : 0); } </style> <![endif]--> <meta name="foswiki.PUBURL" content="http://wiki.gnumed.de/pub" /> <!-- PUBURL --> <meta name="foswiki.PUBURLPATH" content="/pub" /> <!-- PUBURLPATH --> <meta name="foswiki.SCRIPTSUFFIX" content="" /> <!-- SCRIPTSUFFIX --> <meta name="foswiki.SCRIPTURL" content="http://wiki.gnumed.de/bin" /> <!-- SCRIPTURL --> <meta name="foswiki.SCRIPTURLPATH" content="/bin" /> <!-- SCRIPTURLPATH --> <meta name="foswiki.SERVERTIME" content="10%20Mar%202013%20-%2013:43" /> <!-- SERVERTIME --> <meta name="foswiki.SKIN" content="twikinet%2c%20pattern" /> <!-- SKIN --> <meta name="foswiki.SYSTEMWEB" content="System" /> <!-- SYSTEMWEB --> <meta name="foswiki.TOPIC" content="GmManualReportGeneratorRu" /> <!-- TOPIC --> <meta name="foswiki.USERNAME" content="KarstenHilbert" /> <!-- USERNAME --> <meta name="foswiki.USERSWEB" content="Main" /> <!-- USERSWEB --> <meta name="foswiki.WEB" content="Gnumed" /> <!-- WEB --> <meta name="foswiki.WIKINAME" content="KarstenHilbert" /> <!-- WIKINAME --> <meta name="foswiki.WIKIUSERNAME" content="Main.KarstenHilbert" /> <!-- WIKIUSERNAME --> <meta name="foswiki.NAMEFILTER" content="%5b%5cs%5c*%3f~%5e%5c%24%40%25%60%22'%26%3b%7c%3c%3e%5c%5b%5c%5d%23%5cx00-%5cx1f%5d" /> <!-- NAMEFILTER --><!--JQUERYPLUGIN::FOSWIKI::META--> <script type='text/javascript' src='../rsrc/System/JQueryPlugin/jquery-1.4.3.js'></script><!--JQUERYPLUGIN--> <script type='text/javascript' src='../rsrc/System/JQueryPlugin/plugins/livequery/jquery.livequery.js'></script><!--JQUERYPLUGIN::LIVEQUERY--> <script type='text/javascript' src='../rsrc/System/JQueryPlugin/plugins/foswiki/jquery.foswiki.js'></script><!--JQUERYPLUGIN::FOSWIKI--> <script type='text/javascript' src='../rsrc/System/JSTreeContrib/jquery.jstree.js'></script><!--JQUERYPLUGIN::JSTREE--> </head> <body class=""><div class="foswikiPage"> <a name="PageTop"></a> <p></p> <p></p> <h1><a name="GNUmed"></a> Генератор отчётов GNUmed </h1> <p></p> GNUmed предлагает два принципиально разных способа для поиска в базе данных: <p></p> <ol> <li> по EMR текущего активного пациента </li> <li> по всей медицинской базе данных, независимо от активного пациента </li></ol> <p></p> Второй подход иногда называют <em>интеллектуальным анализом данных</em>. GNUmed имеет плагин, называемый <em>Отчеты</em>, для создания отчетов общесистемной базы данных. <p></p> <h2><a name="A_"></a> Область действия </h2> <p></p> Плагин предназначен для создания простых отчетов. Мощность этого средства не выходит за рамки того, что можно сделать в PostgreSQL. Однако, можно расширить <a href="PostgreSQLRu.html" target="_top">PostgreSQL</a> <a href="http://www.joeconway.com/plr/" target="_top">процедурным языком "R"</a> (на самом деле, <a href="http://www.postgresql.org/docs/8.2/static/external-pl.html" target="_top">любым другим</a>), чтобы значительно высвободить статистическую мощь напрямую из SQL-запроса. <p></p> Для чего-либо более сложного (например, последующей обработке результатов отчета), нужно обратиться к пользовательским сценариям, генераторам страндартных отчетов или средствам интеллектуального анализа данных, таким как NetEpi. <p></p> <h2><a name="A_AN1"></a> Использование </h2> <p></p> <h3><a name="A_AN2"></a> Создание отчетов </h3> <p></p> Для создания отчета из базы данных необходимо выполнить запрос SQL. Запрос должен вводиться в поле <em>Команда (SQL)</em> плагина <em>Отчеты</em>. Нажмите далее кнопку <em>[Пуск]</em>. Результаты будут показаны в списке внизу. Столбцы списка будут соответствовать столбцам таблиц(ы) базы данных, собирающих данные из запроса. Можно использовать SQL <a href="http://www.postgresql.org/docs/8.2/static/queries-select-lists.html#QUERIES-COLUMN-LABELS" target="_top">синтаксис псевдонимов столбца</a> <em>AS</em>, чтобы имена столбцов базы данных отражались ('преобразовывались'), КАК более понятные обозначения. <p></p> Вот некоторые подсказки: <p></p> <ul> <li> не нужно беспокоиться о начальных или конечных пробелах/символах переноса строк </li> <li> запрос может занимать несколько строк </li> <li> не нужно - но можно - заканчивать запрос точкой с запятой (";") </li> <li> можно вставить текст запроса откуда-нибудь через буфер обмена </li> <li> можно перетащить файл в плагин <em>Отчеты</em> и GNUmed интерпретирует его содержимое, как запрос для выполнения <ul> <li> обратите внимание, что нужно перетащить файл в область плагина <strong>вне</strong> рабочего поля команды запроса (будет улучшено позднее). </li></ul> </li></ul> <p></p> <ul> <li> плагин искусственно <strong>ограничит список результатов до 1000 строк</strong> (одной тысячи) для некоторой защиты от запросов, исходящих от берсерка </li></ul> <p></p> <ul> <li> запросы запускаются <strong>только на чтение</strong> с учетными данными пользователя, который вошел в этот клиент <ul> <li> возможны без записи в базу данных, даже не как побочный эффект запроса <code>select my_writing_func()</code> </li></ul> </li></ul> <p></p> <ul> <li> можно сделать запрос, возвращающий столбец с именем <code>pk_patient</code> <ul> <li> можно дважды кликнуть по любой строке в списке результатов, которая активирует пациента, определенного в базе данных по ID в <code>pk_patient</code> </li> <li> если такого столбца нет, ничего не случится (кроме отображаемого сообщения об ошибке) </li> <li> учтите, что можно, конечно, сделать запрос, возвращающий произвольное число в столбце с именем <code>pk_patient</code>, в этом случае соответствующий пациент, действительно, активируется двойным кликом строки, но может и нет, на самом деле, любая другая значимая корреляция пациента с этой строкой </li></ul> </li></ul> <p></p> <ul> <li> можно ограничить запрос для текущего активного пациента, включив в оператор WHERE поле подстановки $<ID_active_patient>$ с чем-то вроде: <code><table_or_view_relatable_to.pk_identity> = $<ID_active_patient>$</code> или подобным </li></ul> <p></p> <pre> EXISTS ( SELECT 1 FROM table_or_view_containing_else_relatable_to_pk_patient WHERE column_containing_pk = $<ID_active_patient>$ ) ; </pre> <p></p> <h3><a name="A_AN3"></a> Визуализация отчетов </h3> <p></p> Нажатие кнопки <em>[Визуализировать]</em> позволит выбрать столбец из списка результатов отчета из каждой x- и y- оси. Данные в этих столбцах извлекаются из отчета и отправляются для отображения в <a href="http://www.gnuplot.info/" target="_top">gnuplot</a>. <p></p> <h3><a name="A_AN4"></a> Повторное использование определения отчета </h3> <p></p> Поле <em>Отчет</em> действует как phrasewheel, предлагая имена отчетов, которые были ранее сохранены в базе данных. Можно ввести либо часть названия вашей части запроса (например, имя таблицы) и выбрать в появившемся раскрывающемся списке совпадений. Соответствующий запрос загрузится из базы данных. <p></p> Если нажать <em>[Сохранить]</em>, определение отчета будет сохранено в базе данных. Если имя отчета уже известно в базе данных, имеющееся определение отчета будет перезаписано. Если не будет создано новое определение отчета. <p></p> Нажатие <em>[Поделиться]</em> вышлет определение отчета (<strong>имя и запрос - больше ничего</strong>) в список рассылки сообщества GNUmed для совместного использования. Оно будет анонимным. Если для него нужно получить авторство, то таковое необходимо активно приписать в списке рассылки. <p></p> Учтите, что <em>результаты</em> отчета сохраняются только до тех пор, пока экземпляр клиента, в котором они были произведены, остается открытым. Однако, они сохранятся при изменении активного пациента. <p></p> Для вашей ориентировки кнопка <em>[Схема]</em> приведет к <a href="DatabaseSchemaRu.html">документации схемы базы данных GNUmed в нашей вики</a>. <p></p> <h3><a name="A_AN5"></a> Запросы на выборку </h3> <p></p> Сколько неисключенных пациентов остается в базе данных практики? <pre> select count(*) from dem.identity where deleted is FALSE / TRUE where deceased is NULL / NOT NULL </pre> <p></p> Перечислить моих пациентов в этой базе данных (надеюсь, меньше 1024): <pre> select lastnames, firstnames, title, pk_identity AS pk_patient from dem.v_basic_person where dem.v_basic_person.lastnames is NOT NULL order by lastnames, firstnames </pre> <p></p> Перечислить пациентов с отдельным почтовым кодом <pre> select number, street, dem.v_basic_person.lastnames, dem.v_basic_person.preferred, dem.v_basic_person.firstnames, suburb, urb, postcode, pk_identity as pk_patient from dem.v_basic_person inner join dem.v_pat_addresses using (pk_identity) where LOWER(dem.v_pat_addresses.postcode) = 'inputDesiredPostalCodeHereInLowerCase' order by street, number </pre> <p></p> Перечислить пациентов, ожидающих более 14 дней (без указания waiting_zone): <pre> select lastnames, firstnames, title, comment, waiting_time_formatted, pk_identity as pk_patient from clin.v_waiting_list where waiting_time < '14 days' and waiting_zone is NULL </pre> <p></p> A query that (new in gnumed_v9) can search for patients based on the diagnostic code <pre> select * from dem.v_basic_person inner join clin.v_coded_item_narrative using (pk_identity) where code = ... and coding_system = ... and soap_cat = ... ; </pre> <p></p> Запрос по условию других полей (и образцовых значений), которые можно изменять и использовать, помогающий в поиске пациента, когда стандартное поле поиска не позволяет найти пациента, включая, возможно, каналы связи (номера телефонов). Такой запрос может быть <p></p> <pre> select * from dem.v_basic_person inner join dem.v_person_comms / dem.v_person_jobs / dem.v_external_ids4identity using (pk_identity) where dem.v_person_comms.url = ... / dem.v_person_jobs.l10n_occupation = ... / dem.v_external_ids4identity.value = ... ; </pre> <p></p> Запрос, выбирающий сообщения из таблицы аудита для входящих, удаленные в течение последних 7 дней, упорядоченные по последнему измененному <p></p> <pre> SELECT * FROM audit.log_message_inbox WHERE fk_staff = <staff ID of provider> AND audit_action = 'DELETE' AND audit_when > (now() - '7 days'::interval) ORDER BY <audit_when / orig_when / modified_when> DESC ; </pre> <p></p> Запрос, определяющий авторегистрацию физических лиц, например в результате импорта данных <p></p> <pre> SELECT * from dem.clin_ext_id_type, dem.identity where dem.clin_ext_id_type.name = "lab autoimport fake person" WHERE dem.clin_ext_id_type.fk_person = dem.identity.pk ; </pre> <p></p> Между Карстен и Джим была, конечно неофициальная, дискуссия "о теории первичной медпомощи" при моделировании уровней врачебной диагностики. Как только оно будет внесено в обращения, это создало бы интересные запросы по результату <p></p> <pre> The patients I would most worry about would be those who - remain our responsibility (they did not abandon us) --> last seen in the most recent 6 (?) months - and have an active issue or episode of certainty of A or B or C that is --> persisting over multiple encounters >= 2 encounters if symptom(s) are "alarming" or "worsening" >= 3 encounters if B or C Many patients have a chronic single symptoms at level A, and maybe a chronic symptom complex at level B, but &#8211; as long as their episode is not worsening (or provided the patient's episodes are not becoming more frequent which would be a separate clinically informative query) &#8211; then it may be tolerable to optionally and by default omit such patients with chronicity of > 6 or 9 months from inclusion in the result of a query if the purpose is "who must I make sure I do not overlook a condition that I should perhaps be diagnosing?" </pre> <p></p> <h3><a name="A_AN6"></a> Примечание по бэкэнду </h3> <p></p> Запросы отчета хранятся в cfg.report_query. <p></p> <a name="TopicEnd"></a> <p></p> <p></p> <p></p> <p></p> </div> </body></html>