337 lines
15 KiB
Plaintext
337 lines
15 KiB
Plaintext
maintenance:
|
|
|
|
title: Generic Form Control for Order Sets;;
|
|
mlmname: FORM_Set_Generic_Item_Control;;
|
|
arden: version 2;;
|
|
version: 5.00;;
|
|
institution: St Clair;;
|
|
author: Shawn Head, Eclipsys Corp ext 7468;;
|
|
specialist: Shawn Head, Eclipsys Corp ext 7468;;
|
|
date: 2012-05-22;;
|
|
validation: testing;;
|
|
|
|
library:
|
|
purpose: Used to control grid items on order set forms.
|
|
;;
|
|
|
|
explanation: This MLM was developed to be used by the analysts to disable, enable, auto-select items on an order set
|
|
This will be accomplished by adding this generic MLM to the form field they want to trigger the MLM and then
|
|
using the Generic MLM configuration tool to develope the logic that needs added to the MLMGenericItemControl
|
|
item added to the end of the order set.
|
|
|
|
Change history
|
|
|
|
5-22-2012 STH - Copied Robert Spences MLM "FORM_Set_Generic_ReadOnly" to use as template.
|
|
8-28-2012 STH - CSR 30659 - Updated to add additional functionality and removed unnecessary code
|
|
1-23-2013 STH - CSR 31231 - Updated to add additional functionality for auto selecting "same name" items in the same grid
|
|
Also standarized the logic and configuration.
|
|
3-5-2013 STH - CSR 31231 - Updated to correct conflicting logic. Now MLM will process all "selected items" and then
|
|
circle back around to verify which items are still active and "de-selected" and then process
|
|
any required logic for the de-selected item configuration.
|
|
4-11-2013 STH - CSR 31297 - Update and validate the de-select logic section in the code to verify accuracy of functionality.
|
|
;;
|
|
keywords: Generic, FormOpen, Read Only, update items, CPOE, CPOE updates, CPOE items
|
|
;;
|
|
knowledge:
|
|
type: data-driven;;
|
|
data:
|
|
|
|
// This MLM is passed three arguments, of types
|
|
// communication_type, form_type and client info object respectively.
|
|
|
|
(this_communication, // Communication object
|
|
this_form, // Form object
|
|
client_info_obj //Arden ClientInfo object
|
|
) := argument;
|
|
|
|
|
|
/*******************Make Changes To Spelling And Flags In This Section*******************/
|
|
|
|
/* Set to true if a decision.log is needed.*/
|
|
log_execution_info := FALSE;
|
|
|
|
LegendIn := ();
|
|
LegendOut := ();
|
|
LegendIn := ("MOI","MOC","MOG","FO");
|
|
LegendOut := ("MultiOrderInline","MultiOrderCheckbox","MultiOrderGrid","FormOpen");
|
|
|
|
|
|
|
|
|
|
// Use String parse
|
|
str_parse := mlm {{{SINGLE-QUOTE}}}UTIL_STRING_PARSE{{{SINGLE-QUOTE}}}; //used to parse string data into a list
|
|
|
|
call_mlm_logic := mlm {{{SINGLE-QUOTE}}}FORM_SET_GENERIC_ITEM_LOGIC{{{SINGLE-QUOTE}}};
|
|
|
|
// Initialize error message
|
|
error_message:="";
|
|
|
|
// get the list of configured items to be updates based on the form item MLMGenericItemControl
|
|
field_list:= this_form.fields;
|
|
//build the variable "workfield" to have the datavalue from alldataitem(s) MLMGenericItemControl added to form
|
|
//this variable will be used to identify how to handle items on this form based on the configuration added.
|
|
// workfield will be in format aaa^b^xxx,xxx,xxx^y|aaa^b^xxx,xxx,xxx^y
|
|
// where aaa is one of MOI, MOC, MOG (MultiOrderInLine, MultiOrderCheckBox, or MultiOrderGrid)
|
|
// b is the occurrence number of the Inline, Check Box or Grid that has been added to the form.
|
|
//xxx,xxx,xxx is the list of "orderitems" from the orderitem catalog that will be added to the grid that need to trigger the MLM
|
|
//y will either be YES or NO depending on if the configuration should be single item select or not.
|
|
workfield2 := (field_list where field_list.DataItemName = "MLMGenericItemControl" );
|
|
ctusrcfgitems := count workfield2;
|
|
workfield := "";
|
|
for x in (1 seqto (ctusrcfgitems)) do
|
|
if workfield = "" then
|
|
if workfield2[x].value <> "" and workfield2[x].value is not null then
|
|
workfield := workfield2[x].value;
|
|
endif;
|
|
else
|
|
if workfield2[x].value <> "" and workfield2[x].value is not null then
|
|
workfield := workfield || workfield2[x].value;
|
|
endif;
|
|
endif;
|
|
enddo;
|
|
|
|
CallingEvent := this_communication.CallingEvent;
|
|
CallingField := this_communication.CallingFieldName;
|
|
|
|
//create a list to be used to store ALL items assigned to the calling form item (MOG, MOI, MOC)
|
|
calling_itemlist := ();
|
|
calling_itemcheck := ();
|
|
cfgcallorders := ();
|
|
cfgupdateorders := ();
|
|
|
|
//identify the "Control_MultiFieldOccNum" associated with the MultiOrder### (Grid, Item, Checkbox)
|
|
//based on the field calling the MLM. e.g (MultiOrderGrid(3) will return 3 in mfon and MultiOrderGrid for mfname
|
|
callfieldlgth := length of CallingField;
|
|
findpipe := FIND "|" IN STRING CallingField;
|
|
itemctlenght := callfieldlgth - findpipe;
|
|
itemstartpos := findpipe + 1;
|
|
mfon := substring itemctlenght characters starting at itemstartpos from CallingField;
|
|
mfname := substring callfieldlgth-itemctlenght-1 characters starting at 1 from CallingField;
|
|
|
|
//get the list of items in the MultiOrder field that called the MLM
|
|
calling_itemflds := last of (field_list where field_list.DataItemName = mfname
|
|
and field_List.Control_MultiFieldOccNum = (mfon as number));
|
|
calling_itemlist := calling_itemflds.Value;
|
|
calling_itemcheck := calling_itemlist.IsSelected;
|
|
calling_itemname1 := calling_itemlist.name;
|
|
|
|
//The Form only opens once so set the mfon to 1 for anytime the calling action is formopen
|
|
if (CallingEvent = "FormOpen") then
|
|
mfname := "FormOpen";
|
|
mfon := 1;
|
|
endif;
|
|
|
|
|
|
mlmconfigselecteditems := "";
|
|
mlmconfigdeselecteditems := "";
|
|
//------------------------------BEGIN SECTION 1---------------------------------------------
|
|
//search through the configuration added to the MLMGenericItemControl dataitem on the form and find the configuration matching
|
|
//the item that called the MLM. If you add this MLM to a MultiOrderGrid(30) this logic will search through the configuration
|
|
//added to the Data Value of the MLMGenericItemControl(s) dataitmes and find the entry for the correct configuration for the item that
|
|
//called the MLM. Once found it will set the variable for the calling items details and the update item details based on the configuration
|
|
for x in (1 seqto count LegendOut) do
|
|
|
|
//-----------------------------BEGIN SECTION 2--------------------------------------------
|
|
//This will verify that the calling form fields is one of the valid configured fields that can be used with this MLM
|
|
if mfname = LegendOut[x] then
|
|
matchconfig := LegendIn[x];
|
|
ListFields:=();
|
|
ListFields:= call str_parse with workfield,"|";
|
|
|
|
|
|
//---------------------BEGIN SECTION 3--------------------------------------------------
|
|
//loop through all configuration items added to MLMGenericItemControl and update form/grid/items based on configured logic.
|
|
//Each configuration section will be everything between the | is considered 1 configuration element/item.
|
|
for z in (1 seqto count ListFields) do
|
|
|
|
findconfigitem:= call str_parse with ListFields[z],"_";
|
|
cfgcallitemdtl := call str_parse with findconfigitem[1],"^";
|
|
|
|
//------------------BEGIN SECTION 4--------------------------------
|
|
//set these variables equal to the specific item/segment of the configuration
|
|
if ((cfgcallitemdtl[1] = matchconfig) and ((cfgcallitemdtl[2] = mfon) or ((cfgcallitemdtl[2] as number) = (mfon as number)))) then
|
|
cfgupdateitemdtl := call str_parse with findconfigitem[2],"^";
|
|
cfgcallitemtype := cfgcallitemdtl[1];
|
|
cfgcallitemnum := cfgcallitemdtl[2];
|
|
cfgcallorders := call str_parse with cfgcallitemdtl[3],",";
|
|
cfgcallsingleonly := cfgcallitemdtl[4];
|
|
|
|
else
|
|
cfgcallitemtype := null;
|
|
cfgcallitemnum := null;
|
|
cfgcallorders := null;
|
|
cfgcallsingleonly := null;
|
|
|
|
endif;
|
|
|
|
//------------------END SECTION 4--------------------------------
|
|
|
|
|
|
//--------------------BEGIN SETCTION 5-----------------------------------
|
|
//if there is at least 1 calling order item then set the list "call_itemlist2" equal to the value specific to that order item
|
|
//name in the grid
|
|
call_itemlist2 := ();
|
|
if (cfgcallorders[1] <> "") then
|
|
|
|
if (cfgcallsingleonly = "YES") then
|
|
call_itemlist2 := calling_itemflds.Value where calling_itemflds.Value.name is in cfgcallorders;
|
|
|
|
else
|
|
call_itemlist2 := calling_itemflds.Value where calling_itemflds.Value.name is in cfgcallorders and calling_itemflds.Value.IsReadOnly = false;
|
|
endif;
|
|
|
|
elseif cfgcallitemtype <> "" and cfgcallitemnum <> "" then
|
|
//if there are no order items defined in the configuration
|
|
// and there is a calling itemtype and number defined
|
|
//in the MLMGenericItemControl assume the calling item
|
|
//list is inclusive of all items added to the grid item that called this MLM
|
|
call_itemlist2 := calling_itemflds.Value;
|
|
endif;
|
|
|
|
//--------------------END SETCTION 5-----------------------------------
|
|
|
|
//build a list of item names and readonly values for those items
|
|
//so the MLM can verify at least 1 of the calling items are enabled.
|
|
//This allows for the MLM to only act on configuration and items
|
|
//that are enabled in the grid. This helps prevent contradicting
|
|
//configurations from overwritting as the MLM loops through all
|
|
//the configurations in MLMGenericItemControl
|
|
call_itemselected2 := ();
|
|
call_itemname2 := call_itemlist2.name;
|
|
call_itemenabled2 := call_itemlist2.Isreadonly;
|
|
callitemsreadonly := call_itemenabled2 where call_itemenabled2 = true;
|
|
|
|
itemct := count(call_itemname2);
|
|
roct := count(callitemsreadonly);
|
|
|
|
|
|
//-----------------BEGIN SECTION 6---------------------------------------
|
|
//Now we verify that there is at least 1 item in the call_itemname2 list
|
|
//and also verify that at least 1 item is enabled by comparing the
|
|
//number of items in the call_itemname2 list against the number of items
|
|
//in the callitemsreadonly list. If both lists are equals then this means
|
|
//that all items added to call_itemname2 are disabled so they could not have
|
|
//called the MLM so dont continue with any more logic in this section.
|
|
if itemct > 0 and (count(call_itemname2) > count(callitemsreadonly)) then
|
|
|
|
//Create a new list for the selection status of the calling item(s)
|
|
callitemselectedyn := false;
|
|
call_itemselected2 := call_itemlist2.IsSelected;
|
|
|
|
//cycles through all the items that were added to the list "call_itemselected2" and verifies if ANY of them are selected. if so this MLM
|
|
//will assume that the calling item was selected and act on it further down in the logic.
|
|
singleonlyselected := true where call_itemselected2 = true;
|
|
selectedenableditems := true where call_itemenabled2 = false and call_itemselected2 = true;
|
|
ctselecteditems := count(singleonlyselected);
|
|
ctselectedenableditems := count(selectedenableditems);
|
|
if cfgcallsingleonly = "YES" and ctselecteditems > 0 then
|
|
callitemselectedyn := true;
|
|
elseif ctselectedenableditems > 0 then
|
|
callitemselectedyn := true;
|
|
endif;
|
|
|
|
|
|
if callitemselectedyn = true or cfgcallitemtype = "FO" then
|
|
mlmconfigselecteditems := mlmconfigselecteditems || listfields[z] || "|";
|
|
elseif callitemselectedyn = false then
|
|
mlmconfigdeselecteditems := mlmconfigdeselecteditems || listfields[z] || "|";
|
|
endif;
|
|
|
|
|
|
endif;
|
|
enddo;
|
|
|
|
//This section is the section executed for any "selected" items in the calling field that match the
|
|
//MLM logic added to the order set form
|
|
if mlmconfigselecteditems[1] <> "" then
|
|
//testcallselected := "callingselected";
|
|
//break;
|
|
(this_communication, this_form) := call call_mlm_logic with (this_communication, this_form,client_info_obj,mlmconfigselecteditems,true,matchconfig, mfon);
|
|
endif;
|
|
|
|
|
|
|
|
//This section will parse through the MLM configuration for the "deselected items" and verify if there are
|
|
//any items that are still "enabled" and "de-selected". If so then the MLM will process the logic for
|
|
//how to handle the items in the calling form field based on the fact that the item is deselcted.
|
|
deselectedfields := call str_parse with mlmconfigdeselecteditems,"|";
|
|
|
|
//get the list of items in the MultiOrder field that called the MLM
|
|
deselected_itemflds := last of (field_list where field_list.DataItemName = mfname
|
|
and field_List.Control_MultiFieldOccNum = (mfon as number));
|
|
|
|
findconfigitem := "";
|
|
cfgcallitemdtl := "";
|
|
|
|
updatedeselecteditems := "";
|
|
|
|
|
|
for w in (1 seqto count(deselectedfields)) do
|
|
//msginfo := "entered forw loop";
|
|
//break;
|
|
if deselectedfields[w] <> "" then
|
|
//msginfo := "entered if deselectedfields[w] logic";
|
|
//break;
|
|
findconfigitem:= call str_parse with deselectedfields[w],"_";
|
|
cfgcallitemdtl := call str_parse with findconfigitem[1],"^";
|
|
|
|
//set these variables equal to the specific item/segment of the configuration
|
|
if ((cfgcallitemdtl[1] = matchconfig) and ((cfgcallitemdtl[2] = mfon) or ((cfgcallitemdtl[2] as number) = (mfon as number)))) then
|
|
cfgupdateitemdtl := call str_parse with findconfigitem[2],"^";
|
|
cfgcallitemtype := cfgcallitemdtl[1];
|
|
cfgcallitemnum := cfgcallitemdtl[2];
|
|
cfgcallorders := call str_parse with cfgcallitemdtl[3],",";
|
|
cfgcallsingleonly := cfgcallitemdtl[4];
|
|
else
|
|
cfgupdateitemdtl := null;
|
|
cfgcallitemtype := null;
|
|
cfgcallitemnum := null;
|
|
cfgcallorders := null;
|
|
cfgcallsingleonly := null;
|
|
endif;
|
|
|
|
|
|
|
|
if (cfgcallorders[1] <> "") then
|
|
deselectedvalues := deselected_itemflds.Value where deselected_itemflds.Value.name is in cfgcallorders;
|
|
deselectednames := deselectedvalues.name where deselectedvalues.IsSelected = false and deselectedvalues.IsReadOnly = false;
|
|
elseif cfgcallitemtype <> "" and cfgcallitemnum <> "" then
|
|
deselectednames := deselected_itemflds.Value where deselected_itemflds.Value.IsSelected = false and deselected_itemflds.Value.IsReadOnly = false;
|
|
endif;
|
|
|
|
|
|
if count(deselectednames) > 0 then
|
|
updatedeselecteditems := updatedeselecteditems || deselectedfields[w] || "|";
|
|
endif;
|
|
|
|
|
|
endif;
|
|
enddo;
|
|
|
|
|
|
|
|
//if there are items in the calling form filed that are de-selected AND these items
|
|
//match the MLM configuration then we will call the process to update the items based on the
|
|
//MLM configuration logic and the fact that the item is deselected.
|
|
if count(updatedeselecteditems) > 0 and count(deselected_itemlist) > 0 and updatedeselecteditems[1] <> "" then
|
|
//testcalldeselected := "call deselected";
|
|
//break;
|
|
(this_communication, this_form) := call call_mlm_logic with (this_communication, this_form,client_info_obj,updatedeselecteditems,false,matchconfig,mfon);
|
|
endif;
|
|
|
|
endif;
|
|
enddo;
|
|
|
|
;;
|
|
evoke: // No evoke statement
|
|
;;
|
|
logic:
|
|
|
|
conclude true;
|
|
;;
|
|
action:
|
|
// This MLM returns two parameters, of types communication_type and form_type respectively.
|
|
return this_communication, this_form;
|
|
;;
|
|
end:
|