I've been working on a production VFE form, editing and upgrading it, for some time. I have my edits done, but realized I needed to create new function libraries so that I can load it alongside production without causing issues with on-hold documents (right?).
This is where my troubles began... The form was originally written 3+ years ago, and appears to be different than how VFE now handles user-defined function library files... The .txt and .lib files for the current form are nearly identical. The new .txt and .lib files (created today from VFE) are very different--the .txt files state they point to Text Components in the EMR.
I'm having problems getting the new form with the new function libraries to work. I have a checkbox with the following chart translation that "inserts" the data into the chart note. Here is the checkbox's coding:
{
IF DOCUMENT.SHOWAUDIOGRAM = "" then "" else FMT("\r\nAudiogram:", "B,U,2") + "\r\n" +
/**LIBRARY::RightAudiogramv5**/RightAudiogramv5() +
if DOCUMENT.RIGHTEARCOMMENTS = "" then "" else CFMT(DOCUMENT.RIGHTEARCOMMENTS, "", "Right Ear Comments: ", "B", "") + "\r\n" endif +
if DOCUMENT.ACR125NR = "NR" then FMT("No Response at AC 125 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR250NR = "NR" then FMT("No Response at AC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR500NR = "NR" then FMT("No Response at AC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR750NR = "NR" then FMT("No Response at AC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR1000NR = "NR" then FMT("No Response at AC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR1500NR = "NR" then FMT("No Response at AC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR2000NR = "NR" then FMT("No Response at AC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR3000NR = "NR" then FMT("No Response at AC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR4000NR = "NR" then FMT("No Response at AC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR6000NR = "NR" then FMT("No Response at AC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR8000NR = "NR" then FMT("No Response at AC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR10000NR = "NR" then FMT("No Response at AC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR12000NR = "NR" then FMT("No Response at AC 12000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR250NR = "NR" then FMT("No Response at BC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR500NR = "NR" then FMT("No Response at BC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR750NR = "NR" then FMT("No Response at BC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR1000NR = "NR" then FMT("No Response at BC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR1500NR = "NR" then FMT("No Response at BC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR2000NR = "NR" then FMT("No Response at BC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR3000NR = "NR" then FMT("No Response at BC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR4000NR = "NR" then FMT("No Response at BC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR6000NR = "NR" then FMT("No Response at BC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR8000NR = "NR" then FMT("No Response at BC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR10000NR = "NR" then FMT("No Response at BC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR12000NR = "NR" then FMT("No Response at BC 12000 dB","") + "\r\n" else "" endif +
/**LIBRARY::LeftAudiogramv5**/LeftAudiogramv5() +
if DOCUMENT.LEFTEARCOMMENTS = "" then "" else CFMT(DOCUMENT.LEFTEARCOMMENTS, "", "Left Ear Comments: ", "B", "") + "\r\n" endif +
if DOCUMENT.ACL125NR = "NR" then FMT("No Response at AC 125 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL250NR = "NR" then FMT("No Response at AC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL500NR = "NR" then FMT("No Response at AC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL750NR = "NR" then FMT("No Response at AC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL1000NR = "NR" then FMT("No Response at AC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL1500NR = "NR" then FMT("No Response at AC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL2000NR = "NR" then FMT("No Response at AC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL3000NR = "NR" then FMT("No Response at AC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL4000NR = "NR" then FMT("No Response at AC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL6000NR = "NR" then FMT("No Response at AC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL8000NR = "NR" then FMT("No Response at AC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL10000NR = "NR" then FMT("No Response at AC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL12000NR = "NR" then FMT("No Response at AC 12000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL250NR = "NR" then FMT("No Response at BC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL500NR = "NR" then FMT("No Response at BC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL750NR = "NR" then FMT("No Response at BC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL1000NR = "NR" then FMT("No Response at BC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL1500NR = "NR" then FMT("No Response at BC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL2000NR = "NR" then FMT("No Response at BC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL3000NR = "NR" then FMT("No Response at BC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL4000NR = "NR" then FMT("No Response at BC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL6000NR = "NR" then FMT("No Response at BC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL8000NR = "NR" then FMT("No Response at BC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL10000NR = "NR" then FMT("No Response at BC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL12000NR = "NR" then FMT("No Response at BC 12000 dB","") + "\r\n" else "" endif
endif
}
Below is the error/text translation dropped into the note when I try to use the checkbox:
{/*VARIABLES FOR MEL BUILT-IN SYMBOLS USED IN FORM*/
<-VOID{/*START OF FORM TRANSLATION BODY*/
<-VOID
{IF DOCUMENT.SHOWAUDIOGRAM_4741_636_1426532138 = "" then "" else FMT("\r\nAudiogram:", "B,U,2") + "\r\n" +
RightAudiogramv5() +
if DOCUMENT.RIGHTEARCOMMENTS = "" then "" else CFMT(DOCUMENT.RIGHTEARCOMMENTS, "", "Right Ear Comments: ", "B", "") + "\r\n" endif +
if DOCUMENT.ACR125NR = "NR" then FMT("No Response at AC 125 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR250NR = "NR" then FMT("No Response at AC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR500NR = "NR" then FMT("No Response at AC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR750NR = "NR" then FMT("No Response at AC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR1000NR = "NR" then FMT("No Response at AC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR1500NR = "NR" then FMT("No Response at AC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR2000NR = "NR" then FMT("No Response at AC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR3000NR = "NR" then FMT("No Response at AC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR4000NR = "NR" then FMT("No Response at AC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR6000NR = "NR" then FMT("No Response at AC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR8000NR = "NR" then FMT("No Response at AC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR10000NR = "NR" then FMT("No Response at AC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACR12000NR = "NR" then FMT("No Response at AC 12000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR250NR = "NR" then FMT("No Response at BC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR500NR = "NR" then FMT("No Response at BC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR750NR = "NR" then FMT("No Response at BC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR1000NR = "NR" then FMT("No Response at BC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR1500NR = "NR" then FMT("No Response at BC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR2000NR = "NR" then FMT("No Response at BC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR3000NR = "NR" then FMT("No Response at BC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR4000NR = "NR" then FMT("No Response at BC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR6000NR = "NR" then FMT("No Response at BC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR8000NR = "NR" then FMT("No Response at BC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR10000NR = "NR" then FMT("No Response at BC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCR12000NR = "NR" then FMT("No Response at BC 12000 dB","") + "\r\n" else "" endif +
LeftAudiogramv5() +
if DOCUMENT.LEFTEARCOMMENTS = "" then "" else CFMT(DOCUMENT.LEFTEARCOMMENTS, "", "Left Ear Comments: ", "B", "") + "\r\n" endif +
if DOCUMENT.ACL125NR = "NR" then FMT("No Response at AC 125 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL250NR = "NR" then FMT("No Response at AC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL500NR = "NR" then FMT("No Response at AC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL750NR = "NR" then FMT("No Response at AC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL1000NR = "NR" then FMT("No Response at AC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL1500NR = "NR" then FMT("No Response at AC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL2000NR = "NR" then FMT("No Response at AC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL3000NR = "NR" then FMT("No Response at AC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL4000NR = "NR" then FMT("No Response at AC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL6000NR = "NR" then FMT("No Response at AC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL8000NR = "NR" then FMT("No Response at AC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL10000NR = "NR" then FMT("No Response at AC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.ACL12000NR = "NR" then FMT("No Response at AC 12000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL250NR = "NR" then FMT("No Response at BC 250 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL500NR = "NR" then FMT("No Response at BC 500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL750NR = "NR" then FMT("No Response at BC 750 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL1000NR = "NR" then FMT("No Response at BC 1000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL1500NR = "NR" then FMT("No Response at BC 1500 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL2000NR = "NR" then FMT("No Response at BC 2000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL3000NR = "NR" then FMT("No Response at BC 3000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL4000NR = "NR" then FMT("No Response at BC 4000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL6000NR = "NR" then FMT("No Response at BC 6000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL8000NR = "NR" then FMT("No Response at BC 8000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL10000NR = "NR" then FMT("No Response at BC 10000 dB","") + "\r\n" else "" endif +
if DOCUMENT.BCL12000NR = "NR" then FMT("No Response at BC 12000 dB","") + "\r\n" else "" endif
endif <-VOID
VFE has not changed how it handles Function Libraries at all. It is the same today as it was when the functionality was first created and released (difficult to improve upon perfection). GE, however, has altered the way in which text components are managed in the update as well as how some data symbols function (remember that data symbols are in reality, functions too). In addition, there have been changes in how data is refreshed and when, which can have a huge impact on how a form performs/functions within an update.
Because of these changes, I would recommend that you load the entire libraries from the 'MEL window of VFE' (right hand window) and just call the function itself in your translation.This will ensure the EMR recognizes the call for loading the text component appropriately and at the right 'time'.
FYI:
The function library is a short cut to managing code without having to recreate it for every form. When VFE sees '/**LibraryName**/ label, it creates a string in the code that the EMR can recognize and includes both the add_text_component data symbol and a version check (for those that use that feature) in the clinical kit. Nothing special, beyond typing out the mundane text for you.
You might want to also check that the library, form, and item properties are set similar to the previous version as well. It could be that a different setting could be causing your issues as well (something that is currently being addressed in development to provide users with a warning).
If your troubleshooting steps do not resolve the issue, you might try contacting VFE support ([email protected]) and see if they can assist. Be certain to include both versions of the form and that you are sending it upon my recommendation. 🙂
Thanks for the help Lee. I tried incorporating the functions into the form itself, but the translation and functions (.xlt) file was too large for Centricity to handle at 230,000+ bytes.
Is my thinking correct that I would need to create new, unique, function libraries for this new form to be able to load it side-by-side with the current "old" one and its associated "old" libraries? I am trying to avoid any headache of changing the form and function libraries suddenly, which I think would have a negative impact on On Hold documents.
I know this is the root of my problem--creating new libraries and deviating from the original, but I think I need to do this to save end-user headache, right?
Thanks
No need to insert the library code into the form, just insert the appropriate call.
At the top of the form, right hand window, insert the code as follows:
/**LIBRARY::RightAudiogramv5**/
Do the same for the other library:
/**LIBRARY::LeftAudiogramv5**/
This will cause the EMR to load both libraries in their entirety and as part of the form 'initialization' process. Once in the update, the functions within will be available to any form in the update.
Next step it to remove the library load command from elsewhere in your code. In the code you posted initially, you would change:
/**LIBRARY::RightAudiogramv5**/RightAudiogramv5()
To
RightAudiogramv5()
and
/**LIBRARY::LeftAudiogramv5**/LeftAudiogramv5()
To
LeftAudiogramv5()
In essence, you would remove any other reference that loads the library again (/**LIBRARY::LibraryName**/) and just call the function call itself.
If you have a number of these calls, you might be able to reduce your file size a tad if this approach is used. 😉