231 lines
9.4 KiB
Plaintext
231 lines
9.4 KiB
Plaintext
maintenance:
|
||
|
||
title: Generic Lookup;;
|
||
mlmname: ACS_result_impression_Lookup;;
|
||
arden: version 2.5;;
|
||
version: 5.00;;
|
||
institution: Allscripts;;
|
||
author: Allscripts Custom Services;;
|
||
specialist: Allscripts Custom Services;;
|
||
date: 2011-11-05;;
|
||
validation: testing;;
|
||
|
||
library:
|
||
purpose: lookup and parse out the "IMPRESSION" from a set of patient{{{SINGLE-QUOTE}}}s results.
|
||
;;
|
||
explanation:
|
||
;;
|
||
keywords:
|
||
;;
|
||
knowledge:
|
||
type: data-driven;;
|
||
data:
|
||
/****************** Make Your code stretch NO WIDER THAN THIS! *************************/
|
||
(Client_guid,
|
||
Client_visit_guid,
|
||
Client_chart_guid,
|
||
Getdata_from,//“historical” or “current” (use SQL or current object navigation)
|
||
Data_value_type,//Object to retrieve (“HealthIssue”, “order”, etc.)
|
||
Data_item,//Attribute to retrieve (“name”, “itemname”, “typecode”, “code”, etc.)
|
||
Filterable_item,//Filterable attribute (“name”, “itemname”, “typecode”, “code”, etc.)
|
||
Filterable_operator,//Filterable operator (“=”, “<>”, “in”, “matches pattern”, etc.)
|
||
Filterable_value,//Filterable value(s)(“chronic”, “atb”,“(‘480.00’,’480.30’)", etc.)
|
||
Additional_condition)//Additional condition(s)
|
||
//(“orderstatuslevelnum between 55 and 60”,
|
||
//“performedtm > dateadd(-24, hh, getdate()”, etc.)
|
||
:= ARGUMENT;
|
||
|
||
//setting for
|
||
current:= Now - 8 years ; //24 hours;
|
||
|
||
//initialize
|
||
strFilterSQL :="";
|
||
|
||
if called_by_editor then
|
||
(client_guid, client_visit_guid, client_chart_guid) :=
|
||
read last {clientvisit: clientguid, guid, chartguid};
|
||
Getdata_from := "Historical";
|
||
Data_value_type := "Results";
|
||
Data_item := "text_val";
|
||
Filterable_item := "r.code"; // "itemname";
|
||
filterable_operator := "="; // "like";
|
||
filterable_value := "Medical Imaging"; // "chest";
|
||
endif;
|
||
|
||
IF any(exists Filterable_item AND (not (Filterable_item is in ("", "No"))))
|
||
AND any(exists Filterable_operator AND (not(Filterable_operator is in ("", "No"))))
|
||
AND any(exists Filterable_value AND (not (Filterable_value is in ("", "No")))) THEN
|
||
strFilterSQL := Filterable_item || " " || Filterable_operator || " ";
|
||
IF Filterable_operator = "IN" THEN
|
||
strFilterSQL := strFilterSQL || "(" || Filterable_value || ")";
|
||
ELSEIF Filterable_operator ="LIKE" THEN
|
||
strFilterSQL := strFilterSQL || "{{{SINGLE-QUOTE}}}%" || Filterable_value|| "%{{{SINGLE-QUOTE}}}";
|
||
ELSE
|
||
strFilterSQL := strFilterSQL || SQL(Filterable_value);
|
||
ENDIF;
|
||
ENDIF;
|
||
if any(exists Additional_condition AND (not (Additional_condition is in ("", "No")))) then
|
||
strFilterSQL := strFilterSQL || " and " ||Additional_condition;
|
||
endif;
|
||
// add filter for time, if not present
|
||
if not(strFilterSQL matches pattern "%where%performeddtm%") then
|
||
strFilterSQL := strFilterSQL || " and b.entered >= " || sql(current) ;
|
||
endif;
|
||
|
||
(result_items, result_times, result_impressions) := read
|
||
// set up (temporary) tables for data entry
|
||
{" declare @txt_src table (titem varchar(125), "
|
||
||" tguid numeric(16,0), ttime datetime, tln int, ttext varchar(255)) "
|
||
||" declare @maxln table (tguid numeric(16,0), mln int) "
|
||
||" declare @txt_imp table "
|
||
||" (id numeric(16,0) not null, "
|
||
||" item varchar(125) null, "
|
||
||" obs_time datetime null, "
|
||
||" min_line_num int null, "
|
||
||" curr_line_num int null, "
|
||
||" max_line_num int null, "
|
||
||" obs_text varchar(8000) null) "
|
||
|
||
// pull patient specific data for processing
|
||
||" insert @txt_src "
|
||
||" select b.itemname, t.ObservationGUID, o.performeddtm, t.LineNum, t.text "
|
||
||" from CV3BasicObservation b "
|
||
||" join CV3TextualObservationLine t on t.ClientGUID = b.ClientGUID "
|
||
||" and b.GUID = t.ObservationGUID "
|
||
||" join cv3order o on o.clientguid = b.clientguid "
|
||
||" and o.chartguid = b.chartguid "
|
||
||" and o.clientvisitguid = b.clientvisitguid "
|
||
||" and o.guid = b.orderguid "
|
||
||" join cv3ordercatalogmasteritem ocmi on ocmi.GUID = o.OrderCatalogMasterItemGUID "
|
||
||" left outer join CV3OrderReviewCategory r on r.GUID = ocmi.OrderReviewCategoryGUID "
|
||
||" where b.ClientGUID = " || sql(client_guid)
|
||
||" and b.ChartGUID = " || sql(client_chart_guid)
|
||
||" and b.ClientVisitGUID = " || sql(client_visit_guid)
|
||
// ||" and b.entered >= " || sql(current)
|
||
||" and b.IsTextual = 1 "
|
||
||" and b.IsHistory = 0 "
|
||
||" and " || strFilterSQL
|
||
|
||
// remove white spaces
|
||
||" while (select max(patindex({{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}+char(10)+{{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}, ttext)) from @txt_src) > 0 "
|
||
||" begin "
|
||
||" update @txt_src " // remove the carriage return
|
||
||" set ttext = stuff(ttext, patindex({{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}+char(10)+{{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}, ttext), 1, null) "
|
||
||" where patindex({{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}+char(10)+{{{SINGLE-QUOTE}}}%{{{SINGLE-QUOTE}}}, ttext) > 0 "
|
||
||" end "
|
||
|
||
// initialize the table
|
||
||" insert @txt_imp " // get starting line
|
||
||" select distinct tguid, titem, ttime, 0,0, null, {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}} "
|
||
||" from @txt_src "
|
||
|
||
// get only the impression fragment, starting at {{{SINGLE-QUOTE}}}IMPRESSION:{{{SINGLE-QUOTE}}}
|
||
||" update @txt_imp " // get starting line
|
||
||" set min_line_num = tln, curr_line_num = tln, obs_text = "
|
||
||" substring(tTEXT, PATINDEX({{{SINGLE-QUOTE}}}%impression%{{{SINGLE-QUOTE}}}, ttext), DATALENGTH(ttext) "
|
||
||" - PATINDEX({{{SINGLE-QUOTE}}}%impression%{{{SINGLE-QUOTE}}}, ttext)) "
|
||
||" from @txt_src "
|
||
||" where tguid = id "
|
||
||" and tTEXT like {{{SINGLE-QUOTE}}}%impression%{{{SINGLE-QUOTE}}} "
|
||
|
||
// update the max_line_num to the {{{SINGLE-QUOTE}}}dictated by{{{SINGLE-QUOTE}}} end, if exist
|
||
||" update @txt_imp "
|
||
||" set max_line_num = tln "
|
||
||" from @txt_src "
|
||
||" where id = tguid "
|
||
||" and tln > min_line_num "
|
||
// ||" and obs_text like {{{SINGLE-QUOTE}}}%dictated%{{{SINGLE-QUOTE}}} "
|
||
||" and obs_text like {{{SINGLE-QUOTE}}}%dictat%{{{SINGLE-QUOTE}}} " // Added By Shivprasad CSR : 32844
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
// if no {{{SINGLE-QUOTE}}}dictated by{{{SINGLE-QUOTE}}} ending, go to end of blob
|
||
||" insert @maxln "
|
||
||" select tguid, mln = MAX(tln) "
|
||
||" from @txt_src "
|
||
||" group by tguid "
|
||
|
||
// no {{{SINGLE-QUOTE}}}dictated{{{SINGLE-QUOTE}}} found: set max_line_num to end of blob
|
||
||" update @txt_imp "
|
||
||" set max_line_num = mln "
|
||
||" from @maxln "
|
||
||" where id = tguid "
|
||
||" and max_line_num is null "
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
// iterate/append all lines between min and max line numbers
|
||
||" while (select count(*) "
|
||
||" from @txt_imp where (max_line_num - curr_line_num) > 0 ) > 0 "
|
||
||" begin "
|
||
||" update @txt_imp "
|
||
||" set curr_line_num = tln, "
|
||
||" obs_text = obs_text + tTEXT "
|
||
||" from @txt_src "
|
||
||" where id = tguid "
|
||
||" and curr_line_num < max_line_num "
|
||
||" and tln = curr_line_num + 1 "
|
||
||" end "
|
||
|
||
// truncate text to {{{SINGLE-QUOTE}}}dictated{{{SINGLE-QUOTE}}}
|
||
||" update @txt_imp "
|
||
// ||" set obs_text = SUBSTRING(obs_text, 1, patindex({{{SINGLE-QUOTE}}}%dictated%{{{SINGLE-QUOTE}}}, obs_text) + 7) "
|
||
// ||" where patindex({{{SINGLE-QUOTE}}}%dictated%{{{SINGLE-QUOTE}}}, obs_text) > 0 "
|
||
||" set obs_text = SUBSTRING(obs_text, 1, patindex({{{SINGLE-QUOTE}}}%dictat%{{{SINGLE-QUOTE}}}, obs_text) + 8 ) " // Added By Shivprasad CSR : 32844
|
||
||" where patindex({{{SINGLE-QUOTE}}}%dictat%{{{SINGLE-QUOTE}}}, obs_text) > 0 "
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
// Now add the addendum, if it exists, useing the same logic as above
|
||
||" update @txt_imp "
|
||
||" set min_line_num = tln, curr_line_num = tln, max_line_num = null, "
|
||
||" obs_text = obs_text + {{{SINGLE-QUOTE}}} +++++{{{SINGLE-QUOTE}}} + "
|
||
||" substring(tTEXT, PATINDEX({{{SINGLE-QUOTE}}}%ADDENDUM%{{{SINGLE-QUOTE}}}, ttext), "
|
||
||" DATALENGTH(ttext) - PATINDEX({{{SINGLE-QUOTE}}}%ADDENDUM%{{{SINGLE-QUOTE}}}, ttext)) "
|
||
||" from @txt_src "
|
||
||" where id = tguid "
|
||
||" and tln >= curr_line_num "
|
||
||" and tTEXT like {{{SINGLE-QUOTE}}}%ADDENDUM%{{{SINGLE-QUOTE}}} "
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
||" update @txt_imp "
|
||
||" set max_line_num = tln "
|
||
||" from @txt_src "
|
||
||" where id = tguid "
|
||
||" and tln >= curr_line_num "
|
||
||" and tTEXT like {{{SINGLE-QUOTE}}}%LAST PAGE%{{{SINGLE-QUOTE}}} " // never found this...
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
||" update @txt_imp "
|
||
||" set max_line_num = mln "
|
||
||" from @maxln "
|
||
||" where id = tguid "
|
||
||" and max_line_num is null "
|
||
||" and not (obs_text = {{{SINGLE-QUOTE}}}(no IMPRESSION found){{{SINGLE-QUOTE}}}) "
|
||
|
||
||" while (select count(*) "
|
||
||" from @txt_imp where (max_line_num - curr_line_num) > 0 ) > 0 "
|
||
||" begin "
|
||
||" update @txt_imp "
|
||
||" set curr_line_num = tln, "
|
||
||" obs_text = obs_text + tTEXT "
|
||
||" from @txt_src "
|
||
||" where id = tguid "
|
||
||" and curr_line_num < max_line_num "
|
||
||" and tln = curr_line_num + 1 "
|
||
||" end "
|
||
|
||
||" select item, obs_time, obs_text "
|
||
||" from @txt_imp "
|
||
};
|
||
|
||
//break;
|
||
;;
|
||
priority: 50
|
||
;;
|
||
evoke:
|
||
;;
|
||
logic: conclude true;
|
||
;;
|
||
action: return result_items, result_times, result_impressions;
|
||
;;
|
||
Urgency: 50;;
|
||
end:
|