maintenance: title: BMI Checking;; mlmname: DOC_FUNC_CCHD_Screen;; arden: version 5.0;; version: 2.00;; institution: St.Clair Hospital;; author: Pam Roberts / Dr. Griffin & Dean Miklavic ;; specialist: Shawn Head ;; date: 2012-06-13;; validation: testing;; library: purpose: ;; explanation: Change history 06.13.2012 - create by STH 03.18-2013 - CSR #: 31350 - Modified to be "greater than OR equal to >=" instead of just "greaterthan >" ;; keywords: ;; knowledge: type: data-driven;; data: //Message box standard_libs := mlm {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}}; include standard_libs; using "ObjectsPlusXA.SCM.Forms"; using namespace "ObjectsPlusXA.SunriseClinicalManager.Forms"; obsitemcall := (); obsitemupdate1 := (); obsitemupdate2 := (); obsitemcallgrp1 := (); obsitemcallgrp2 := (); addobs := false; addobslistitems := ""; addobsvalue := ""; clearhrsold := false; /*********************************BEGIN EDIT SECTION*****************************************************/ //declare list items that will need read/calculated/updated/edited/ect. obsitemcallgrp1 := ("SCH_FBC_CHDS_Initial Date Time", "SCH_FBC_Init_Pulse Ox_Rt Hand", "SCH_FBC_Second_Pulse Ox_Rt Hand", "SCH_FBC_Third_Pulse Ox_Rt Hand"); obsitemcallgrp2 := ("", "SCH_FBC_Init_Pulse Ox_Foot", "SCH_FBC_Second_Pulse Ox_Foot", "SCH_FBC_Third_Pulse Ox_Foot"); obsitemupdate1 := ("SCH_FBC_Hourly Age", "SCH_FBC_Init_Pulse Ox Diff", "SCH_FBC_Second_Pulse Ox Diff", "SCH_FBC_Third_Pulse Ox Diff"); obsitemupdate2 := ("", "SCH_FBC_CHDS_Init_Pass Fail", "SCH_FBC_CHDS_Second_Pass Fail", "SCH_FBC_CHDS_Third_Pass Fail"); /*********************************END EDIT SECTION*****************************************************/ // Receive arguments from the structured note (thisDocumentCommunication) := argument; // Extract interesting parts of the object model (thisStructuredNoteDoc) := thisDocumentCommunication.DocumentConfigurationObj; (thisParameters) := thisStructuredNoteDoc.ParametersList; (thisObservations) := thisStructuredNoteDoc.ChartedObservationsList; // Identify the calling observation item callingobsvals := thisDocumentCommunication.CurrentObservationObj; callingobsname := first of (thisParameters where thisParameters.ParameterGUID = callingobsvals.ParameterGUID); callingobs := first of (thisobservations where thisobservations.ParameterGUID = callingobsname.ParameterGUID); callingobsval := callingobs.ValueObj.Value; // cyle through the both the obsitemcallgrp1 and obsitemcallgrp2 looking for the position and matching item name //in the list that matches the callingobsname. If it finds the config then it sets cfgposition equal to the location //in the list so it can be used through the rest of the MLM logic for knowing what item(s) need compared, updated, ect... //callingobsval will be equal to the value of obsitemcallgrp1 and callingobsval2 will be the value of the item obsitemcallgrp2 for x in (1 seqto (count(obsitemcallgrp1))) do if callingobsname.name = obsitemcallgrp1[x] then callingobsname2 := first of (thisParameters where thisParameters.Name = obsitemcallgrp2[x]); callingobs2 := first of (thisobservations where thisobservations.ParameterGUID = callingobsname2.ParameterGUID); callingobsval2 := callingobs2.ValueObj.Value; obsitemcall := obsitemcallgrp1; cfgposition := x; elseif callingobsname.name = obsitemcallgrp2[x] then callingobsname2 := first of (thisParameters where thisParameters.Name = obsitemcallgrp1[x]); callingobs2 := first of (thisobservations where thisobservations.ParameterGUID = callingobsname2.ParameterGUID); callingobsval2 := callingobs2.ValueObj.Value; obsitemcall := obsitemcallgrp2; cfgposition := x; endif; enddo; // Get the user, chart, client and visit GUIDs userGuid := thisDocumentCommunication.UserGUID; clientGuid := thisDocumentCommunication.ClientGUID; clientvisitGuid := thisDocumentCommunication.ClientVisitGUID; chartGuid := thisDocumentCommunication.ChartGUID; callingobsguid := callingobsvals.ParameterGUID; //get the admit date/time from the database to be used to calculate the hours old admitdttm := read last {"select AdmitDtm from CV3ClientVisit " || "where GUID = " || SQL(clientvisitGuid) //{{{SINGLE-QUOTE}}}9000002915600270{{{SINGLE-QUOTE}}} " || " and ClientGUID = " || SQL(clientGuid) }; //{{{SINGLE-QUOTE}}}9000001871400200{{{SINGLE-QUOTE}}}"}; // Create prototypes for the object types we{{{SINGLE-QUOTE}}}ll need to instantiate ObservationType := OBJECT [ObservationGUID, ClientDocumentGUID, ParameterGUID, DataType, ValueObj]; FreeTextValueType := OBJECT [Value]; NumericValueType := OBJECT [Value]; DateValueType := OBJECT [Value]; ListValueType := OBJECT [ListGuid,ListItemsList, SuggestedTextValue]; ListValueListItemType := OBJECT [ListItemGUID, Value, IsSelected]; //check to make sure the event is a charted observation and that the calling observation exists in //the list obsitemcall at position "cfgposition" determined in for loop above if thisDocumentCommunication.EventType = "ChartObservation" and callingobsname.Name = obsitemcall[cfgposition] then //get the observation information for the item(s) listed in obsitemupdate1[cfgposition] and obsitemupdate2[cfgposition] //these will be the items "updated" in the BEGIN UPDATE TO FORM SECTION updateobsparam1 := first of (thisParameters where thisParameters.Name = obsitemupdate1[cfgposition]); updateobsparam2 := first of (thisParameters where thisParameters.Name = obsitemupdate2[cfgposition]); updateobs1 := first of (thisobservations where thisobservations.ParameterGUID = updateobsparam1.ParameterGUID); updateobs2 := first of (thisobservations where thisobservations.ParameterGUID = updateobsparam2.ParameterGUID); updateobsval1 := updateobs1.ValueObj.Value; updateobsval2 := updateobs2.ValueObj.ListItemsList.IsSelected; //if the chartedobservation is in position 1 follow this logic. for this MLM this will be the admit date/time charted observation if cfgposition = 1 then //---------------------------BEGIN ADMIT DATE/TIME COMPARED TO INITIAL DATE/TIME ENTERED ON DOCUMENT--------------------------------// if callingobsval > admitdttm then //as long as the entered date/time is greater than the admit date/time then calculate the hours old and grad the whole number //without rounding. If the patient is 23 hours and 5 minutes old it will return 23. If the patient is 23 hours and 59 minutes it will //return 23 still per Dr. Griffin{{{SINGLE-QUOTE}}}s request calchours := (((callingobsval - admitdttm) / 60 seconds) / 60) formatted with "%.2f"; finddec := FIND "." IN STRING (calchours as string); calchours := SUBSTRING finddec-1 characters from calchours; addobsvalue := calchours; addobs := true; elseif callingobsval = "" or callingobsval is null then clearhrsold := true; elseif admitdttm > callingobsval then //if the admit date/time is greater than the entered date/time present this message to user so they know how to correct the issue. errormsg := "The Initial Screening Date/Time entered is prior to the patients Admit Date/Time. " || "Please enter an approriate date/time in the Initial Screening Date/Time field. " || "If the screening date/time entered is correct you will need to update the admission date/time in SCM. " || "If you are unable to update the admission date/time in SCM please call registration to have the admission date/time updated."; clearhrsold := true; endif; //if chearhrsold is set to true then delete the hrsold observation that was previously added to the document. if clearhrsold = true then MLM_update_value_observation := NEW ObservationType; MLM_update_value_observation.ClientDocumentGUID := thisStructuredNoteDoc.ClientDocumentGUID; MLM_update_value_observation.ParameterGUID := updateobsparam1.ParameterGUID; MLM_update_value_observation.DataType := "NumericValue"; MLM_update_value_observation.ValueObj := null; thisStructuredNoteDoc.ChartedObservationsList := (thisStructuredNoteDoc.ChartedObservationsList,MLM_update_value_observation); endif; //---------------------------END ADMIT DATE/TIME COMPARED TO INITIAL DATE/TIME ENTERED ON DOCUMENT--------------------------------// //if the chartedobservation is in position 2, 3, or 4 follow this logic (for this MLM these are the pulse ox reading initial, second, third elseif cfgposition >= 2 and cfgposition <= 4 then //--------------------------BEGIN CHECKING THE HAND AND FOOT PULSE OX DATA ENTERED ON DOCUMENT------------------------------------// if callingobsval = "" or callingobsval is null or callingobsval2 = "" or callingobsval2 is null then //if hand or foot pulse ox is null/blank then we will blank out the pulse ox % difference addobsvalue := ""; addobs := true; else //if there are values in both hand and foot pulse ox value then determine which is greater and subtracted the highest from the lowest if callingobsval >= callingobsval2 then addobsvalue := callingobsval - callingobsval2; else addobsvalue := callingobsval2 - callingobsval; endif; //logic provided by Dr. Griffen read as.... //If one Pulse Ox value is greater than 95 and the difference is less than 3, precheck the Pass Button. Otherwise select Fail. //If the difference is greater than 3, precheck the Fail Button. if (callingobsval >= 95 or callingobsval2 >= 95) and addobsvalue <= 3 then passfail := "Pass"; else passfail := "Fail"; endif; addobs := true; endif; //--------------------------END CHECKING THE HAND AND FOOT PULSE OX DATA ENTERED ON DOCUMENT------------------------------------// endif; //-------------------------------BEGIN UPDATE TO FORM SECTION--------------------------------------// //update the observations identified in obsitemupdate1 and obsitemupdate2 based on above logic as log as the logic set the addobs to true //and thdobsvalue has been determined through the logic above if addobs = true and addobsvalue <> "" then MLM_update_value_observation := NEW ObservationType; MLM_update_value_observation.ClientDocumentGUID := thisStructuredNoteDoc.ClientDocumentGUID; MLM_update_value_observation.ParameterGUID := updateobsparam1.ParameterGUID; MLM_update_value_observation.DataType := "NumericValue"; MLM_update_value_observation.ValueObj := NEW NumericValueType; MLM_update_value_observation.ValueObj.Value := addobsvalue; thisStructuredNoteDoc.ChartedObservationsList := (thisStructuredNoteDoc.ChartedObservationsList,MLM_update_value_observation); selectParameter := first of (thisParameters where thisParameters.Name = obsitemupdate2[cfgposition]); if (exists selectParameter) then this_currentObj := NEW ObservationType; this_currentObj.ClientDocumentGUID := thisStructuredNoteDoc.ClientDocumentGUID; this_currentObj.ParameterGUID := selectParameter.ParameterGUID; this_currentObj.DataType := "ListValue"; this_currentObj.ValueObj := NEW ListValueType; this_currentObj.ValueObj.ListGUID := selectParameter.ConfigurationObj.ListGUID; listItems := (); for item IN selectParameter.ConfigurationObj.ListItemsList Do selectedItem := NEW ListValueListItemType; selectedItem.ListItemGUID := item.ListItemGUID; selectedItem.Value := item.Value; if selectedItem.Value = passfail then selectedItem.IsSelected := true; else selectedItem.IsSelected := false; endif; listItems := (listItems, selectedItem); enddo; this_currentObj.ValueObj.ListItemsList := listItems; thisStructuredNoteDoc.ChartedObservationsList := (thisStructuredNoteDoc.ChartedObservationsList, this_currentObj); endif; //if the logic above has determined that we needed to update the observations in obsitemupdate1 and obsitemupdate2 //and the logic has found that the value needs to be null/blank/deleted then this logic will remove any values from the document that //needs removed. elseif addobs = true and addobsvalue = "" then MLM_update_value_observation := NEW ObservationType; MLM_update_value_observation.ClientDocumentGUID := thisStructuredNoteDoc.ClientDocumentGUID; MLM_update_value_observation.ParameterGUID := updateobsparam1.ParameterGUID; MLM_update_value_observation.DataType := "NumericValue"; MLM_update_value_observation.ValueObj := null; thisStructuredNoteDoc.ChartedObservationsList := (thisStructuredNoteDoc.ChartedObservationsList,MLM_update_value_observation); selectParameter := first of (thisParameters where thisParameters.Name = obsitemupdate2[cfgposition]); if (exists selectParameter) then this_currentObj := NEW ObservationType; this_currentObj.ClientDocumentGUID := thisStructuredNoteDoc.ClientDocumentGUID; this_currentObj.ParameterGUID := selectParameter.ParameterGUID; this_currentObj.DataType := "ListValue"; this_currentObj.ValueObj := null; thisStructuredNoteDoc.ChartedObservationsList := (thisStructuredNoteDoc.ChartedObservationsList, this_currentObj); endif; elseif errormsg <> "" then //if the errormsg has been set to something other than blank/null and neither udpate sections were called then display the error message to user dialogResult := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with errormsg,"Entered Date/Time before Admit Date/Time","OK" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}; endif; //-------------------------------END UPDATE TO FORM SECTION--------------------------------------// ENDIF; ;; evoke: ;; logic: conclude true; ;; action: return thisDocumentCommunication; ;; Urgency: 50;; end: