Files
St.Clair/MLMStripper/bin/Debug/FORM/FORM_VTE_SCHEDULING.mlm

546 lines
24 KiB
Plaintext

maintenance:
title: FORM_VTE_SCHEDULING ;;
mlmname: FORM_VTE_SCHEDULING;;
arden: version 2.5;;
version: 1.00;;
institution: St.Clair Hospital ;;
author: Sandy Zhang ;;
specialist: ;;
date: 2017-10-26;;
validation: testing;;
library:
purpose: Automatic scheduling of VTE Prophylaxis Meds (enoxaparin 30mg Q12 and Q24, enoxaparin 40mg Q24H, heparin, and rivaroxaban 10mg)
;;
explanation:
Change history
10.26.2017 SZ Created for CSR #33689 - CPOE-VTE auto schedule
;;
keywords: Automatic Medication Scheduling, VTE Scheduling
;;
citations:
;;
knowledge:
type: data-driven;;
data:
standard_libs := MLM {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}};
include standard_libs;
(this_communication,this_form,client_info_obj) := argument;
worksheetInfo := call {{{SINGLE-QUOTE}}}OrderEntryBatch{{{SINGLE-QUOTE}}}.GetCurrent;
error_message:="";
field_list := this_form.fields;
comm_primary_obj := this_communication.PrimaryObj;
order_set_name := comm_primary_obj.OrderSetName;
order_name := comm_primary_obj.Name;
continue_processing := false;
// Restrict who sees the "valdation" alerts
userguid := this_communication.userguid;
useridcode:= read last {" Select idcode from cv3user with (nolock) where guid = " || SQL(userguid)};
FireOnUser:= ("tspicuzzatest","dwarnicktest","ageorgulistest","dbellissimotest");
ClientGuid := this_communication.ClientGUID;
VisitGuid := this_communication.ClientVisitGUID;
ChartGuid := this_communication.ChartGuid;
CallingEvent := this_communication.CallingEvent;
CallingField := this_communication.CallingFieldName;
CurrentMinute:= extract minute NOW;
CurrentHour := extract hour NOW;
NextHour := extract hour NOW + 1;
HourAfterNext:= extract hour NOW + 2;
Included_Orders := ("Heparin Inj", "Enoxaparin Inj", "Rivaroxaban 10mg Tab");
// GATHER INFORMATION ABOUT THIS ORDER
Frequency := last of (field_list where field_list.DataItemName = "frequencycode");
FrequencyValue := Frequency.Value;
Route := last of (field_list where field_list.DataItemName = "orderroutecode");
RouteValue := Route.Value;
RequestedTime:= last of (field_list where field_list.DataItemName = "RequestedTime");
RequestedTimeValue := RequestedTime.value;
RequestedDate:= last of (field_list where field_list.DataItemName = "RequestedDate");
Dose:= last of (field_list where field_list.DataItemName = "DosageLow");
UOM:= last of (field_list where field_list.DataItemName = "Uom");
if (order_name = "Heparin Inj") and (Route.Value = "SQ") and (FrequencyValue.FrequencySummary = "Q8H" or FrequencyValue.FrequencySummary = "Q12H" or FrequencyValue.FrequencySummary = "Q6H") and (uom.Value = "units") then
continue_processing := true;
found_heparin := "yay we found heparin SQ 5000 units Q8 or Q12";
endif;
if (order_name = "Enoxaparin Inj") and (Route.Value = "SQ") and (FrequencyValue.FrequencySummary = "Q24H") and (dose.Value = 40) and (uom.Value = "mg") then
continue_processing := true;
found_enoxaparin_40 := "yay we found enoxaparin SQ 40mg Q24";
endif;
if (order_name = "Enoxaparin Inj") and (Route.Value = "SQ") and (FrequencyValue.FrequencySummary = "Q12H" or FrequencyValue.FrequencySummary = "Q24H") and (dose.Value = 30) and (uom.Value = "mg") then
continue_processing := true;
found_enoxaparin_30 := "yay we found enoxaparin SQ 30mg Q12 or Q24";
endif;
if (order_name = "Rivaroxaban 10mg Tab") and (FrequencyValue.FrequencySummary = "Q24H") then
continue_processing := true;
found_rivaroxaban_10 := "yay we found rivaroxaban 10mg Q24";
endif;
if ( continue_processing = true ) then
checkpoint_1 := "continue_processing = true";
// insert time when form is closing and there{{{SINGLE-QUOTE}}}s NO scheduled time
If (CallingEvent = "FormClose") and (not exist RequestedTimeValue.ReqTimeValue) then
checkpoint_2 := "form is closing and there{{{SINGLE-QUOTE}}}s NO scheduled time";
// Gather information about the drug
(DrugKey, TherapeuticCategory, ExcludedClassType, PrimaryTherapeuticCategory) := read last
{
" select dm.DrugKey, ocmi.TherapeuticCategory , "
|| " ( select top 1 ctv.Value "
|| " from cv3catalogclasstypevalue ctv with (nolock) "
|| " join CV3ClassType ct on ct.guid = ctv.ClassTypeGUID and ct.code = {{{SINGLE-QUOTE}}}PRX_AutoSched_Exclude_for_MLM{{{SINGLE-QUOTE}}} and ct.UserDictionaryCode = {{{SINGLE-QUOTE}}}Medication_Auto_Scheduling{{{SINGLE-QUOTE}}} "
|| " where ctv.Value = {{{SINGLE-QUOTE}}}Yes{{{SINGLE-QUOTE}}} and ctv.catalogmasterguid = " || this_communication.ItemID || " ) "
|| " ,case when CHARINDEX ({{{SINGLE-QUOTE}}}|{{{SINGLE-QUOTE}}},ocmi.TherapeuticCategory) > 0 "
|| " then substring (ocmi.TherapeuticCategory, 1, CHARINDEX ({{{SINGLE-QUOTE}}}|{{{SINGLE-QUOTE}}},ocmi.TherapeuticCategory)-2)"
|| " else ocmi.TherapeuticCategory "
|| " end "
|| " from CV3OrderCatalogMasterItem ocmi with (nolock) "
|| " join cv3drugmapping dm with (nolock) on dm.catalogitemguid = ocmi.guid "
|| " where ocmi.guid = " || this_communication.ItemID || " "
};
// Gather information about the frequency
// Determine Frequency Interval ( "Q3H" = "3" & "hr(s)" )
(FrequencyInterval,FrequencyTimeUOM) := read last
{
" select timefromvalue,TimeUom from CV3Frequency with (nolock) "
|| " where code = {{{SINGLE-QUOTE}}}" || FrequencyValue.FrequencySummary || "{{{SINGLE-QUOTE}}}"
};
// Determine if it is a QxH Frequency
If FrequencyValue.FrequencySummary matches pattern "Q%H" then
FrequencyQxH := "Yes";
else
FrequencyQxH := "No";
endif;
// Determine Schedule Type ("A" = "Fixed" start time...BID,QHS etc... "S" = "Variable" start time....Q4H, Q8H etc...)
ScheduleType := read last
{
" select case when SUBSTRING(value,CHARINDEX({{{SINGLE-QUOTE}}}|{{{SINGLE-QUOTE}}},Value)+1,LEN(1)) = {{{SINGLE-QUOTE}}}A{{{SINGLE-QUOTE}}} then {{{SINGLE-QUOTE}}}Fixed{{{SINGLE-QUOTE}}} else {{{SINGLE-QUOTE}}}Variable{{{SINGLE-QUOTE}}} end "
|| " from CV3UserDictionaryValue with (nolock) "
|| " WHERE UserDictionaryCode = {{{SINGLE-QUOTE}}}PRX_Dosing Frequency{{{SINGLE-QUOTE}}} AND Active = 1 AND Value like {{{SINGLE-QUOTE}}}" || FrequencyValue.FrequencySummary || "%{{{SINGLE-QUOTE}}} "
};
// Convert the Frequency Code to Doses Per Day
(DosesPerDay) := read last
{
" select count (fsd.ScheduledTime) from CV3CodedFreqTranslation cft with (nolock) "
|| " join CV3FixedScheduleDefinition fsd with (nolock) on fsd.ParentGUID = cft.guid "
|| " where cft.FrequencyCode = {{{SINGLE-QUOTE}}}" || FrequencyValue.FrequencySummary || "{{{SINGLE-QUOTE}}} and "
|| " FrequencyClass = {{{SINGLE-QUOTE}}}<Default>{{{SINGLE-QUOTE}}} and cft.active = 1 "
};
// For the selected Frequency, find the first dose of the day and next scheduled dose today
(NextScheduledDoseTomorrow,NextScheduledDoseToday) := read last
{
" select top 1 "
|| " (select top 1 fsdx.ScheduledTime from CV3FixedScheduleDefinition fsdx with (nolock) where fsdx.ParentGUID = cft.guid "
|| " order by fsdx.ScheduledTime), "
|| " (select top 1 fsdy.ScheduledTime from CV3FixedScheduleDefinition fsdy with (nolock) where fsdy.ParentGUID = cft.guid "
|| " and fsdy.ScheduledTime > REPLACE(CONVERT(VARCHAR(5), GETDATE(), 108), {{{SINGLE-QUOTE}}}:{{{SINGLE-QUOTE}}}, {{{SINGLE-QUOTE}}}{{{SINGLE-QUOTE}}}) "
|| " order by fsdy.ScheduledTime ) "
|| " from CV3CodedFreqTranslation cft with (nolock) "
|| " join CV3FixedScheduleDefinition fsd with (nolock) on fsd.ParentGUID = cft.guid "
|| " where cft.FrequencyCode = {{{SINGLE-QUOTE}}}" || FrequencyValue.FrequencySummary || "{{{SINGLE-QUOTE}}} and FrequencyClass = {{{SINGLE-QUOTE}}}<Default>{{{SINGLE-QUOTE}}} and cft.active = 1 "
};
// If there are no more scheduled doses for today, use the first scheduled dose tomorrow
If NextScheduledDoseToday is not null then
NextScheduledDoseTime:= NextScheduledDoseToday;
NextScheduledDoseDay := "today";
NextScheduledDoseDate:= (Now) FORMATTED WITH "%.2t";
else
NextScheduledDoseTime:= NextScheduledDoseTomorrow;
NextScheduledDoseDay := "tomorrow";
NextScheduledDoseDate:= (Now + 1 day) FORMATTED WITH "%.2t";
endif;
// format from 1600 to 16:00 and 900 to 09:00
NextScheduledDoseTime:= NextScheduledDoseTime formatted with "%4.4d"; // Zero Pad to 4 characters (900 becomes 0900)
NextScheduledDoseTime:= (SUBSTRING 2 CHARACTERS STARTING AT 1 FROM NextScheduledDoseTime) || ":" || // hours
(SUBSTRING 2 CHARACTERS STARTING AT 3 FROM NextScheduledDoseTime); // minutes
// -------------------------------------## Main Algorithm ##--------------------------------------------------
// ------------------ CHECK #1 ------------------
// Proceed if this is not a "one-time" order and not in a Hold session
If (FrequencyInterval is not null and
ScheduleType is not null and
worksheetinfo.sessiontype <> "Hold" ) then
checkpoint_3 := "order is not a one-time order and not in a Hold session";
// GATHER INFORMATION ABOUT MOST RECENTLY ADMINISTERED ORDER (past 1 days) OF THE SAME CATEGORY
(ExistingOrderLastGiven, ExistingOrderFrequency, ExistingOrderHoursSinceGiven,
ExistingOrderName, ExistingOrderTherapeuticCategory, ExistingOrderDrugKey,
ExistingRoute, ExistingNextTaskPending, ExistingNextTaskCanceled, ExistingOrderDose, ExistingOrderDoseUOM) := read last
{
" select oto.performedfromdtm, o.FrequencyCode, datediff (HH, oto.performedfromdtm, getdate()), "
|| " o.name, ocmi.TherapeuticCategory, dm.DrugKey, ot.OrderRoute "
|| " ,(select top 1 oto2.SignificantDtm from cv3ordertaskoccurrence oto2 with (nolock) "
|| " where oto2.clientguid = ot.clientguid and oto2.orderguid = o.guid and oto2.ordertaskguid = ot.guid "
|| " and oto2.SignificantDtm > getdate()-1 and oto2.taskstatuscode = {{{SINGLE-QUOTE}}}Pending{{{SINGLE-QUOTE}}}) "
|| " ,(select top 1 oto2.SignificantDtm from cv3ordertaskoccurrence oto2 with (nolock) "
|| " where oto2.clientguid = ot.clientguid and oto2.orderguid = o.guid and oto2.ordertaskguid = ot.guid "
|| " and oto2.SignificantDtm > getdate()-1 and oto2.taskstatuscode = {{{SINGLE-QUOTE}}}Canceled{{{SINGLE-QUOTE}}}), oto.TaskDose, oto.TaskUom "
|| " from cv3ordercatalogmasteritem ocmi with (nolock) "
|| " join cv3drugmapping dm with (nolock) on dm.catalogitemguid = ocmi.guid "
|| " join cv3order o with (nolock)on o.ordercatalogmasteritemguid = ocmi.guid "
|| " and o.ClientGUID = " || ClientGuid || " "
|| " and o.TypeCode = {{{SINGLE-QUOTE}}}Medication{{{SINGLE-QUOTE}}} and ocmi.TherapeuticCategory = {{{SINGLE-QUOTE}}}" || TherapeuticCategory || "{{{SINGLE-QUOTE}}} "
|| " join cv3ordertask ot with (nolock) on ot.clientguid = o.clientguid and ot.orderguid = o.guid "
|| " join cv3ordertaskoccurrence as oto with (nolock) on oto.clientguid = ot.clientguid and oto.orderguid = ot.orderguid "
|| " and oto.ordertaskguid = ot.guid and oto.SignificantDtm > getdate()-1 and oto.taskstatuscode = {{{SINGLE-QUOTE}}}Performed{{{SINGLE-QUOTE}}} "
|| " order by oto.performedfromdtm "
};
ExistingOrderDose := ExistingOrderDose as number;
(ExistingOrderInterval) := read last {"select timefromvalue from CV3Frequency with (nolock) where code = {{{SINGLE-QUOTE}}}" || ExistingOrderFrequency || "{{{SINGLE-QUOTE}}}"};
ExistingNextTaskPendingDate:= ExistingNextTaskPending FORMATTED WITH "%.2t";
ExistingNextTaskPendingTime:= extract hour ExistingNextTaskPending || ":" || extract minute ExistingNextTaskPending;
ExistingNextTaskCanceledDate:= ExistingNextTaskCanceled FORMATTED WITH "%.2t";
ExistingNextTaskCanceledTime:= extract hour ExistingNextTaskCanceled || ":" || extract minute ExistingNextTaskCanceled;
// Determine how the order compares to the most recently charted order of the same therapeutic category
DrugMatch := "No";
FrequencyMatch:= "No";
RouteMatch := "No";
DoseMatch := "No";
UOMMatch := "No";
matching_drug_cluster := "No";
// ------------------ CHECK #2 ------------------
// Searches patient chart for an order that matches the "Included_Orders" list
index_list_included_orders := 1 seqto (count Included_Orders);
matching_drug_list := ();
// loops existing orders for patient to see if there{{{SINGLE-QUOTE}}}s a match to "Included_Orders" list
for J in index_list_included_orders do
current_order_lookup := Included_Orders[J];
// looks back 1 day to see if there{{{SINGLE-QUOTE}}}s a previous order that was administered and matches the drug cluster list.
name_of_matching_drug := read last
{
"select ocmi.Name
from cv3ordercatalogmasteritem ocmi with (nolock)
join cv3drugmapping dm with (nolock) on dm.catalogitemguid = ocmi.guid
join cv3order o with (nolock)on o.ordercatalogmasteritemguid = ocmi.guid
join cv3ordertask ot with (nolock) on ot.clientguid = o.clientguid and ot.orderguid = o.guid
join cv3ordertaskoccurrence as oto with (nolock) on oto.clientguid = ot.clientguid and oto.orderguid = ot.orderguid
and oto.ordertaskguid = ot.guid and oto.SignificantDtm > getdate()-1 and oto.taskstatuscode = {{{SINGLE-QUOTE}}}Performed{{{SINGLE-QUOTE}}}
where o.ClientGUID = " || sql(ClientGuid) ||
"and o.chartguid = " || sql(ChartGuid) ||
"and o.clientvisitguid = " || sql(VisitGuid) ||
"and o.TypeCode = {{{SINGLE-QUOTE}}}Medication{{{SINGLE-QUOTE}}} and ocmi.TherapeuticCategory = {{{SINGLE-QUOTE}}}" || TherapeuticCategory || "{{{SINGLE-QUOTE}}}
and ocmi.Name like {{{SINGLE-QUOTE}}}%" || current_order_lookup || "%{{{SINGLE-QUOTE}}}"
};
if (exist name_of_matching_drug) then
check_2 := "Yes";
matching_drug_list := matching_drug_list || name_of_matching_drug;
endif;
enddo;
if (exist matching_drug_list) then
matching_drug_cluster := "Yes"; // move on to check #3
endif;
if (matching_drug_cluster = "No") then
Scenario := "1"; // move to scheduling routine
If ScheduleType = "Variable" then // variable is example: Q8H BID = Fixed
TargetHour := NextHour; // move to scheduling routine
TargetDate := NOW;
else
// Fixed Start Time = BID, QD, QHS
RequestedTimeValue.ReqTimeCode := "Scheduled/Start Time";
RequestedTimeValue.ReqTimeValue := NextScheduledDoseTime;
RequestedDate.Value := NextScheduledDoseDate;
endif;
endif; //if (matching_drug_cluster = "No") then
// ------------------ end of CHECK #2 ------------------
// current Drug{{{SINGLE-QUOTE}}}s key matches existing order{{{SINGLE-QUOTE}}}s drug key
if (DrugKey = ExistingOrderDrugKey) or (order_name = ExistingOrderName) then
DrugMatch := "Yes";
endif;
if FrequencyValue.FrequencySummary = ExistingOrderFrequency then
FrequencyMatch := "Yes";
endif;
if RouteValue = ExistingRoute then
RouteMatch := "Yes";
endif;
if dose.Value = ExistingOrderDose then
DoseMatch := "Yes";
endif;
if uom.Value = ExistingOrderDoseUOM then
UOMMatch := "Yes";
endif;
if (matching_drug_cluster = "Yes") then // carried over from check #2
// potential issue here is that SQL
// ------------------ CHECK #3 ------------------
if (DrugMatch = "Yes") then
check_3 := "yes";
// ------------------ CHECK #4 ------------------
if (FrequencyMatch = "Yes") then
check_4 := "No - Continue new order where previous order left off";
Scenario := "2";
// Same Drug / Same Frequency
// continue new order with same schedule as old order
If ExistingNextTaskPending is not null then
TargetHour := extract hour ExistingNextTaskPending; // this is the next scheduled dose
TargetDate := ExistingNextTaskPending;
else
TargetHour := extract hour ExistingNextTaskCanceled;
TargetDate := ExistingNextTaskCanceled;
endif;
// if targethour is null then take lastgiven + frequencyinterval
if (not exist TargetHour) then
TargetHour := extract hour ExistingOrderLastGiven + FrequencyInterval;
TargetDate := ExistingOrderLastGiven;
endif;
else // Yes path for part of CHECK #4
// schedule new order for last charted DTM + duration of new frequency
check_4 := "Yes - Schedule new order for last charted DTM + Duration of new frequency";
Scenario := "3";
// Same Drug / Different Frequency / QxH
TargetHour := extract hour ExistingOrderLastGiven + FrequencyInterval;
TargetDate := ExistingOrderLastGiven;
endif;// end of CHECK #4 // if (FrequencyMatch = "Yes") then
else // part of CHECK #3 // if (DrugMatch = "Yes") then
check_3 := "No";
// see if previous order (not-matching current order) was a "one time" order
// ------------------ CHECK #5 ------------------
// Different Drug // One-Time Dose??
If (ExistingOrderInterval is null) then // For Q12H, ExistingOrderInterval = 12. For BID, ExistingOrderInterval = 2. For Now, STAT, Once, ExistingOrderInterval = NULL
// Different Drug / One-Time Dose - Yes
check_5 := "Yes";
// ------------------ CHECK #6 ------------------
// check if last dose charted was heparin
if (ExistingOrderName = "Heparin Inj") then
check_6 := "Yes";
Scenario := "4";
// schedule new order 8 hour after last charted DTM
TargetHour := extract hour ExistingOrderLastGiven + 8;
TargetDate := ExistingOrderLastGiven;
else
check_6 := "No";
Scenario := "5";
// schedule new order 24 hour after last charted DTM
TargetHour := extract hour ExistingOrderLastGiven + 24;
TargetDate := ExistingOrderLastGiven;
endif; //if (ExistingOrderName = "Heparin Inj")
// ------------------ end of CHECK #6 ------------------
else // part of Check #5 // If (ExistingOrderInterval is null) then previous order{{{SINGLE-QUOTE}}}s last charted dose is a one-time order
// For Now, STAT, Once, ExistingOrderInterval = NULL
// Different Drug / One-Time Dose - No
check_5 := "No";
// ------------------ CHECK #7 ------------------
If (ExistingOrderHoursSinceGiven > ExistingOrderInterval) then
// Different Drug / Not One-Time Dose / Outside the Span
check_7 := "No";
Scenario := "7";
If ScheduleType = "Variable" then
// Variable Start Time
TargetHour := NextHour;
TargetDate := NOW;
else
// Fixed Start Time
RequestedTimeValue.ReqTimeCode := "Scheduled/Start Time";
RequestedTimeValue.ReqTimeValue := NextScheduledDoseTime;
RequestedDate.Value := NextScheduledDoseDate;
endif;
else // within span
check_7 := "Yes";
Scenario := "6";
// Different Drug / Not One-Time Dose / Within the Span
If ExistingNextTaskPending is not null then
ExistingNextTaskTime := ExistingNextTaskPendingTime;
ExistingNextTaskDate := ExistingNextTaskPendingDate;
ExistingNextTaskDTM := ExistingNextTaskPending FORMATTED WITH "%.4t";
CalculatedHour:= extract hour ExistingNextTaskPending;
RequestedTimeValue.ReqTimeCode := "Scheduled/Start Time";
RequestedTimeValue.ReqTimeValue := ExistingNextTaskTime;
RequestedDate.Value := ExistingNextTaskDate;
elseif ExistingNextTaskCanceledDate is not null then
ExistingNextTaskTime := ExistingNextTaskCanceledTime;
ExistingNextTaskDate := ExistingNextTaskCanceledDate;
ExistingNextTaskDTM := ExistingNextTaskCanceled FORMATTED WITH "%.4t";
CalculatedHour:= extract hour ExistingNextTaskCanceled;
RequestedTimeValue.ReqTimeCode := "Scheduled/Start Time";
RequestedTimeValue.ReqTimeValue := ExistingNextTaskTime;
RequestedDate.Value := ExistingNextTaskDate;
else
TargetHour := extract hour ExistingOrderLastGiven + ExistingOrderInterval;
TargetDate := ExistingOrderLastGiven;
endif; // Is there a Pending task (if not use next Canceled task)
endif; // Check #7 //If (ExistingOrderHoursSinceGiven > ExistingOrderInterval) then
endif; // Check #5 // If (ExistingOrderInterval is null) then
// ------------------ end of CHECK #5 ------------------
// is last dose charted a "one time" order?
endif;// end of CHECK #3 // if (DrugMatch = "Yes") then
endif; // if (matching_drug_cluster = "Yes") then // carried over from check #2
endif; // CHECK #1 // If (FrequencyInterval is not null and
// -------------------------------------## end of Main Algorithm ##--------------------------------------------------
// -------------------------------------## Scheduling Routine ##--------------------------------------------------
// SCHEDULED TIME ADJUSTMENTS - for variable start time frequencies
If TargetHour is not null and FrequencyTimeUOM = "hr(s)" then
// Adjust for Calculated Dose Hour greater than 24 (next dose falls after midnight today)
If (TargetHour < 24) then
// CalculatedHour := TargetHour formatted with "%2.2d"; 09.22.2017 DW HD# 2763521 This formatting introduced on 6/1/2015 created an issue with the top of the hour >=45 scheuling programming.
CalculatedHour := TargetHour;
ElseIf (TargetHour >= 24 and TargetHour < 48) then
CalculatedHour := TargetHour - 24;
TargetDate := TargetDate + 1 day;
ElseIf (TargetHour >= 48) then
CalculatedHour := TargetHour - 48;
TargetDate := TargetDate + 2 day;
endif;
// Adjust for Calculated Dose Time that is in the past...begin now (existing med has missed recent doses)
TimeNow := (extract year NOW) FORMATTED WITH "%2.2d" || (extract month NOW) FORMATTED WITH "%2.2d" ||
(extract day NOW) FORMATTED WITH "%2.2d" || (extract hour NOW) FORMATTED WITH "%2.2d" ||
(extract minute NOW) FORMATTED WITH "%2.2d";
TimeScheduled:= (extract year TargetDate) FORMATTED WITH "%2.2d" || (extract month TargetDate) FORMATTED WITH "%2.2d" ||
(extract day TargetDate) FORMATTED WITH "%2.2d" || CalculatedHour FORMATTED WITH "%2.2d" || "00";
if TimeScheduled < TimeNow then
CalculatedHour :=NextHour;
TargetDate := NOW;
endif;
// Adjust for Administration time calculated for < 15 minutes...offset the time by an hour
If CurrentMinute >= 45 and CalculatedHour = (EXTRACT HOUR Now) +1 then
CalculatedHour := CalculatedHour + 1; Scenario := Scenario || " B";
else
CalculatedHour := CalculatedHour ; Scenario := Scenario || " A";
endif;
// The Adjustments could have placed the start time to after midnight....if so, adjust date and hour
If CalculatedHour >= 24 then
CalculatedHour := CalculatedHour - 24;
a := "in calc hour";
TargetDate := TargetDate + 1 day;
endif;
// Format the date and time as required by the form fields
CalculatedTime := CalculatedHour || ":00";
CalculatedDate := TargetDate FORMATTED WITH "%.2t";
// Send the calculated time to the order form field
RequestedTimeValue.ReqTimeCode := "Scheduled/Start Time";
RequestedTimeValue.ReqTimeValue := CalculatedTime;
RequestedDate.Value := CalculatedDate;
endif; // Target Time (variable hourly shedules)
// -------------------------------------## end of Scheduling Routine ##--------------------------------------------------
endif; // If (CallingEvent = "FormClose") and (not exist RequestedTimeValue.ReqTimeValue) then
endif; // if ( continue_processing = true ) then
;;
priority: 50
;;
evoke: // no evoke
;;
logic: conclude true;
;;
action: return this_communication, this_form;
;;
Urgency: 50;;
end: