<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Knowledge Base - Qvera - Recent questions and answers</title>
<link>https://www.qvera.com/kb/index.php/qa</link>
<description>Powered by Question2Answer</description>
<item>
<title>Answered: What is the construct of a QIE HPATH or Node Path?</title>
<link>https://www.qvera.com/kb/index.php/3369/what-is-the-construct-of-a-qie-hpath-or-node-path?show=3370#a3370</link>
<description>HL7 is a messaging standard adopted by the healthcare industry for exchanging clinical and financial information between various healthcare IT systems. An HL7 node path (or HPath) is used to reference segments, fields, component and sub-components in an HL7 message. The HPath syntax conforms to the following pattern.&lt;br /&gt;
&lt;br /&gt;
Segment ID [ Instance ] / Sub-Segment HPath – Field [ Field Instance ] . Component . Sub-Component&lt;br /&gt;
&lt;br /&gt;
Here are some advanced Examples:&lt;br /&gt;
&lt;br /&gt;
//Removes all nodes where OBX-3.1 equals SNO-F-01500&lt;br /&gt;
&lt;br /&gt;
message.removeAllNodes(&amp;#039;OBX[@3.1=SNO-F-01500]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//Removes all nodes where OBX-3.1 equals CPT-90702&lt;br /&gt;
&lt;br /&gt;
message.removeAllNodes(&amp;#039;OBX-3[equals(@1, CPT-90702)]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all nodes where OBX-3.1 does not equal LOI-2532-0 and returns the enitre OBX segment&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBX[@3.1!=LOI-2532-0]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all nodes where the OBX-5 value is greater 4.7 and returns the value found in OBX-5&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBX[@5&amp;gt;4.7]-5&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all nodes where the OBX-5 value is less than 4.7 and returns the entire OBX segment&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBX[@5&amp;lt;4.7]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// gets all the OBR segments and groups all following segments related to that OBR&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBR[group=!OBR]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all OBX segments from the message&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBX&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all OBX segments from the message&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBX[group=OBX]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//gets all OBR segments and only the OBX segments related to that OBR. Note other segments like NTE will be omited from the group.&lt;br /&gt;
&lt;br /&gt;
message.getAllNodes(&amp;#039;OBR[group=OBR,OBX]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//removes all OBX segments where the first field within the OBX contains CPT-90702&lt;br /&gt;
&lt;br /&gt;
message.removeAllNodes(&amp;#039;OBX[contains(@1, CPT-90702)]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//removes all OBX segments where the first field within the OBX starts with CPT-90702&lt;br /&gt;
&lt;br /&gt;
message.removeAllNodes(&amp;#039;OBX[starts-with(@1, CPT-90702)]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//removes all OBX segments where the first field within the OBX ends wiith CPT-90702&lt;br /&gt;
&lt;br /&gt;
message.removeAllNodes(&amp;#039;OBX[ends-with(@1, CPT-90702)]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Note: In the above example we primarily used the message.getAllNodes and message.removeAllNodes functions. However, The example HPATH&amp;#039;s or Node Paths can be used with any of the QIE functions where an Node Path or HPATH is required.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3369/what-is-the-construct-of-a-qie-hpath-or-node-path?show=3370#a3370</guid>
<pubDate>Fri, 15 May 2026 15:28:33 +0000</pubDate>
</item>
<item>
<title>Answered: What are the basic JavaScript syntax conventions?</title>
<link>https://www.qvera.com/kb/index.php/3367/what-are-the-basic-javascript-syntax-conventions?show=3368#a3368</link>
<description>Syntax Conventions Description&lt;br /&gt;
&lt;br /&gt;
Case sensitivity&lt;br /&gt;
&lt;br /&gt;
myvariable is not the same as myVariable&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
&lt;br /&gt;
All JavaScript variables and JavaScript functions must be identified with unique names called identifiers. Identifiers can be short names like x and y or they can be more descriptive like dateOfBirth or lastName.&lt;br /&gt;
&lt;br /&gt;
The var keyword is used to create new variables. Variables are containers for storing data values.&lt;br /&gt;
&lt;br /&gt;
Rules for creating variable or function names in JavaScript:&lt;br /&gt;
&lt;br /&gt;
- Names must begin with a letter, $, or _&lt;br /&gt;
&lt;br /&gt;
- Names can contain letters, digits, underscores, and dollar signs&lt;br /&gt;
&lt;br /&gt;
- Names are case sensitive (y and Y are different variables)&lt;br /&gt;
&lt;br /&gt;
- Reserved words (like JavaScript keywords) cannot be used as names&lt;br /&gt;
&lt;br /&gt;
Best Practice:&lt;br /&gt;
&lt;br /&gt;
When declaring variable and function names, use camel case methodology, which combines multiple words together always starting with a lower case letter and with each successive word starting with a capital letter.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
dateOfBirth&lt;br /&gt;
&lt;br /&gt;
lastName&lt;br /&gt;
&lt;br /&gt;
If using abbreviations, they should still be descriptive.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
var lastName;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
=&lt;br /&gt;
&lt;br /&gt;
The equal sign (=) is used to assign values to variables.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
var lastName = &amp;#039;Watts&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
All line statements must end with a semicolon character (;). As a general rule, block statements do not end with a semicolon.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Simple Statements&lt;br /&gt;
&lt;br /&gt;
Simple statements perform one and only one function.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
message.setNode(&amp;#039;MSH-3&amp;#039;, &amp;#039;Radiology&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
This statement hardcodes or sets the word &amp;#039;Radiology&amp;#039; into the MSH-3 field of an HL7 message.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Compound Statements&lt;br /&gt;
&lt;br /&gt;
Compound statements are comprised of multiple functions.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
message.setNode(&amp;#039;MSH-3&amp;#039;, StringUtils.upperCase(&amp;#039;radiology&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
This statement first changes the word &amp;#039;radiology&amp;#039; to uppercase and then sets it into the MSH-3 field of an HL7 message.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Block Statements&lt;br /&gt;
&lt;br /&gt;
Block statements start and end with curly brackets and are widely used with if statements, for loops, and other JavaScript functions.&lt;br /&gt;
&lt;br /&gt;
There can be multiple simple or compound statements within a block.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sendingApp = StringUtils.upperCase(&amp;#039;radiology&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message.setNode(&amp;#039;MSH-3&amp;#039;, sendingApp);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
White Space&lt;br /&gt;
&lt;br /&gt;
JavaScript ignores extra spaces, allowing white space to be inserted into code to make it more readable.&lt;br /&gt;
&lt;br /&gt;
However, if there is white space at the end of a line, the QIE JavaScript validation tool will flag it as a syntax error.&lt;br /&gt;
&lt;br /&gt;
The error message will read:&lt;br /&gt;
&lt;br /&gt;
line x col true – Trailing whitespace&lt;br /&gt;
&lt;br /&gt;
Removing the extra spaces at the end of the indicated line will eliminate the error.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Splitting code across multiple lines&lt;br /&gt;
&lt;br /&gt;
If a line of code does not fit on one line, it is best to break the line after an operator or comma, or within a string of text.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
if (StringUtils.equalsIgnoreCase(&amp;#039;CPS10&amp;#039;, centricityVersion)) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message.setNode(&amp;quot;/&amp;quot;, qie.callWebService(&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;channelCache.getValue(&amp;#039;wsName&amp;#039;),&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;CCD Export&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parameterMap));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
In this example:&lt;br /&gt;
&lt;br /&gt;
- The line is split at the opening parenthesis (&lt;br /&gt;
&lt;br /&gt;
- Additional lines split after commas&lt;br /&gt;
&lt;br /&gt;
- The statement ends with the closing parenthesis and semicolon&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;#039; and &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Single and double quotes are interchangeable within JavaScript, but must be matched within a given statement.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;text&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A value that starts with a single quote must end with a single quote.&lt;br /&gt;
&lt;br /&gt;
Quotes are typically used to surround textual values (strings and literals).&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
+&lt;br /&gt;
&lt;br /&gt;
The plus symbol (+) has different meanings in JavaScript.&lt;br /&gt;
&lt;br /&gt;
- With numerical values, it performs arithmetic addition&lt;br /&gt;
&lt;br /&gt;
- With strings, it concatenates values together&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
var string1 = &amp;quot;Nothing is impossible, \n\r&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var string2 = &amp;quot;the word itself says I&amp;#039;m possible! \n\r&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var string3 = &amp;quot;Audrey Hepburn&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var quote = string1 + string2 + string3;&lt;br /&gt;
&lt;br /&gt;
Result:&lt;br /&gt;
&lt;br /&gt;
Nothing is impossible,&lt;br /&gt;
&lt;br /&gt;
the word itself says I&amp;#039;m possible!&lt;br /&gt;
&lt;br /&gt;
Audrey Hepburn&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
// Single line comments&lt;br /&gt;
&lt;br /&gt;
Single line comments are made using two forward slashes.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
// This is a single line comment&lt;br /&gt;
&lt;br /&gt;
var x = 5; // this is an inline comment&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
/* */ Multiple line comments&lt;br /&gt;
&lt;br /&gt;
Multiple line comments start with:&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
and end with:&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
All lines between the opening and closing comment characters will be commented out.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
var x = &amp;#039;5&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
var y = &amp;#039;3&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
var z = x + y;&lt;br /&gt;
&lt;br /&gt;
*/</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3367/what-are-the-basic-javascript-syntax-conventions?show=3368#a3368</guid>
<pubDate>Fri, 15 May 2026 13:56:05 +0000</pubDate>
</item>
<item>
<title>Answered: How do I use a JSON array in QIE.</title>
<link>https://www.qvera.com/kb/index.php/1714/how-do-i-use-a-json-array-in-qie?show=3366#a3366</link>
<description>In QIE, JSON and XML arrays are referenced differently because JSON has explicit array syntax, while XML uses repeated elements selected with XPath predicates.&lt;br /&gt;
&lt;br /&gt;
JSON: use JPath with / hierarchy plus an array qualifier.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
/phoneNumbers → the whole array&lt;br /&gt;
&lt;br /&gt;
/phoneNumbers/[1] → first array item&lt;br /&gt;
&lt;br /&gt;
/phoneNumbers/[usage=&amp;quot;home&amp;quot;]/number → the number field from the matching array object&lt;br /&gt;
&lt;br /&gt;
XML: use standard XPath. XML doesn’t have a native “array” type; what acts like an array is usually a set of repeating sibling elements.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
/bookstore/book → all repeated book elements&lt;br /&gt;
&lt;br /&gt;
/bookstore/book[1] → first book&lt;br /&gt;
&lt;br /&gt;
/bookstore/book[last()] → last book&lt;br /&gt;
&lt;br /&gt;
A simple way to think about it:&lt;br /&gt;
&lt;br /&gt;
JSON array item: /parentArray/[n]&lt;br /&gt;
&lt;br /&gt;
XML repeated element: /parent/element[n]&lt;br /&gt;
&lt;br /&gt;
QIE’s training docs summarize this as:&lt;br /&gt;
&lt;br /&gt;
JSON JPath: {/ParentObject/ChildArray/[instance]/ChildProperty}&lt;br /&gt;
&lt;br /&gt;
XML: standard XPath notation&lt;br /&gt;
&lt;br /&gt;
So the practical difference is:&lt;br /&gt;
&lt;br /&gt;
In JSON, the array itself is a node and you step into an item with /[n].&lt;br /&gt;
&lt;br /&gt;
In XML, repeated elements are just matching nodes, and you select one with [n] directly on the element name.&lt;br /&gt;
&lt;br /&gt;
Note: referencing an array &amp;nbsp;in JSON using the XML repeated element node path nomenclature will return incorrect results.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/1714/how-do-i-use-a-json-array-in-qie?show=3366#a3366</guid>
<pubDate>Thu, 14 May 2026 18:42:03 +0000</pubDate>
</item>
<item>
<title>Answered: Can I renumber segments in a HL7 message</title>
<link>https://www.qvera.com/kb/index.php/1003/can-i-renumber-segments-in-a-hl7-message?show=3365#a3365</link>
<description>&lt;p&gt;Use HL7 group processing so each OBR group is handled separately. In QIE, the documented pattern is to get all OBR groups with message.getAllNodes(&#039;OBR[grp=!OBR]&#039;), parse each group as its own HL7 message, count that group’s OBX segments, renumber OBX-1 from 1..n, and then write the updated group back into the original message. That exact OBR-group pattern is shown in the docs and the tutorial also shows renumbering OBX-1 inside a loop with message.setNode(&#039;OBX-1&#039;, ...) .&lt;/p&gt;&lt;p&gt;Example mapping script:&lt;/p&gt;&lt;pre style=&quot;text-align: justify;&quot;&gt;var obrGroups = message.getAllNodes(&#039;OBR[group=!OBR]&#039;);

for (var i = 0; i &amp;lt; obrGroups.length; i++) {
   var obrGroup = qie.parseHL7String(obrGroups[i]);
   var obxCount = obrGroup.getCount(&#039;OBX&#039;);

   for (var j = 1; j &amp;lt;= obxCount; j++) {
      obrGroup.setNode(&#039;OBX-1&#039;, j+&#039;&#039;, j);
   }
   message.setNode(&#039;OBR[grp=!OBR]&#039;, obrGroup, (i + 1));
}&lt;/pre&gt;&lt;p style=&quot;text-align:justify&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:justify&quot;&gt;How it works;&lt;/p&gt;&lt;ul&gt;&lt;li style=&quot;text-align:justify&quot;&gt;OBR[group=!OBR] returns each OBR plus its child segments until the next OBR, so each array element is one OBR group&lt;/li&gt;&lt;li style=&quot;text-align:justify&quot;&gt;qie.parseHL7String(...) lets you treat that group as an HL7 message and access its local OBX segments&lt;/li&gt;&lt;li style=&quot;text-align:justify&quot;&gt;obrGroup.getCount(&#039;OBX&#039;) gets the number of OBX segments in that OBR group&lt;/li&gt;&lt;li style=&quot;text-align:justify&quot;&gt;obrGroup.setNode(&#039;OBX-1&#039;, j+&#039;&#039;, j) sets OBX-1 to 1, 2, 3, etc. within that group&lt;/li&gt;&lt;li style=&quot;text-align:justify&quot;&gt;message.setNode(&#039;OBR[grp=!OBR]&#039;, obrGroup, i + 1) puts the modified group back in the correct OBR-group position&lt;/li&gt;&lt;/ul&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/1003/can-i-renumber-segments-in-a-hl7-message?show=3365#a3365</guid>
<pubDate>Thu, 14 May 2026 18:11:58 +0000</pubDate>
</item>
<item>
<title>Answered: Can you review all errored messages and identify the most common patterns</title>
<link>https://www.qvera.com/kb/index.php/3363/can-review-errored-messages-identify-most-common-patterns?show=3364#a3364</link>
<description>&lt;p&gt;The Show Distinct option on the Errors tab is used when you have a lot of errored messages and want QIE to group similar errors together by error text so you can work them in batches instead of one at a time.&lt;/p&gt;&lt;p&gt;What it does:&lt;/p&gt;&lt;p&gt;It searches the errors in the error tab and groups together unique or similar error messages.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This helps you quickly see how many different error types you actually have, which is useful for prioritizing cleanup and troubleshooting.&lt;/li&gt;&lt;li&gt;After you identify a group, you can use Search to pull up all messages in that group and then resolve, discard, or export those messages.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Main options in the Show Distinct dialog:&lt;/p&gt;&lt;p&gt;Match Precision Level: controls how strict the grouping is, from Exact Match to more relaxed similarity matching such as Somewhat Similar. The training material notes that Best Match and Very Similar Match are often the most useful settings.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Count: shows how many messages are in each grouped error.&lt;/li&gt;&lt;li&gt;Error Message: shows the text used to represent that error group.&lt;/li&gt;&lt;li&gt;Limit / First x number of groups: limits how many groups QIE will build before stopping the grouping process.&lt;/li&gt;&lt;li&gt;Stop: lets you manually stop a long-running distinct search.&lt;/li&gt;&lt;li&gt;Double-click a row: opens a sample error from that group for review.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Typical use:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open the channel Errors tab.&lt;/li&gt;&lt;li&gt;Click Show Distinct.&lt;/li&gt;&lt;li&gt;Adjust the match precision and limit.&lt;/li&gt;&lt;li&gt;Let QIE group the errors.&lt;/li&gt;&lt;li&gt;Select a group and click Search to see all messages in that group.&lt;/li&gt;&lt;li&gt;Then act on them with the usual error-tab actions.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In short: Show Distinct is a triage tool for the error queue. It helps you identify repeated error patterns and then operate on all matching errored messages more efficiently.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3363/can-review-errored-messages-identify-most-common-patterns?show=3364#a3364</guid>
<pubDate>Mon, 11 May 2026 16:48:58 +0000</pubDate>
</item>
<item>
<title>Answered: What is the qie.addTimeToChannelStats function and how do you use it?</title>
<link>https://www.qvera.com/kb/index.php/3361/what-the-qie-addtimetochannelstats-function-and-how-you-use?show=3362#a3362</link>
<description>&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;qie.addTimeToChannelStats(metricId, description, time) is a QIE method that adds a custom timing metric to the channel statistics display. It reports the metric in the channel’s overall stats view, and the value is treated as a time in milliseconds. The documented parameters are:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;metricId (Integer): custom metric ID; QIE reports it as 9000 + metricId to avoid conflicts with channel node IDs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;description (String): label shown for the metric&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;time (Long): elapsed time in milliseconds&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;For it to appear, channel stats must be enabled in the source node’s Advanced Options, and you can view the stats from the channel using View -&amp;gt; Stats menu in the to right corner of a channel&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#000000; font-family:tahoma,arial,helvetica,sans-serif&quot;&gt;&lt;span style=&quot;font-size:13px&quot;&gt;Example Code:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;var start = qie.getSystemTimeMilliseconds();&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New, Courier, monospace&quot;&gt;// do some heavy logic you&#039;re interested in timing.&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;var pQuery = qie.getParameterizedQuery(&quot;SELECT firstName, lastName, dateofbirth FROM person WHERE patientID = :pid&quot;);&lt;/span&gt;

&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;pQuery.setString(&quot;pid&quot;, source.getNode(&quot;PID-2&quot;));&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;var queryResult = pQuery.doQuery(&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;   &quot;dbConnectionName&quot;,&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;   false,&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;   false&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;);&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;message.setNode(&quot;PID-5.2&quot;, queryResult.getNode(&quot;firstName&quot;));&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;message.setNode(&quot;PID-5.1&quot;, queryResult.getNode(&quot;lastName&quot;));&lt;/span&gt;

&lt;span style=&quot;font-family:Courier New, Courier, monospace&quot;&gt;var end = qie.getSystemTimeMilliseconds();&lt;/span&gt;
&lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;qie.addTimeToChannelStats (2, &#039;processTime&#039;, end - start);&lt;/span&gt;&lt;/pre&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3361/what-the-qie-addtimetochannelstats-function-and-how-you-use?show=3362#a3362</guid>
<pubDate>Thu, 30 Apr 2026 18:12:46 +0000</pubDate>
</item>
<item>
<title>Answered: What is table-split or &#039;Use individual tables for channel&#039;?</title>
<link>https://www.qvera.com/kb/index.php/3359/what-is-table-split-or-use-individual-tables-for-channel?show=3360#a3360</link>
<description>&lt;p&gt;&lt;strong&gt;Per-Channel Message Tables&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Overview&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;QIE stores message processing data (source messages, processed messages, channel logs, message cache, filter results, and DICOM responses) in a set of database tables. Prior to version 25.4.1, every channel in the environment shared a common set of these tables. As environments grew — some customers reaching tens of millions of messages and hundreds of gigabytes of data — these shared tables became a performance bottleneck. Large shared indexes caused lock contention during routine queries (such as searching the completed queue), slowed down purge operations, and in some cases prevented users from logging in or navigating the application while a long-running query held locks.&lt;/p&gt;&lt;p&gt;To address this, starting with version 25.4.1 QIE now gives each channel its own dedicated set of message processing tables. This isolates each channel&#039;s data and indexes, dramatically reducing lock contention and improving throughput.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When a new channel is created, QIE automatically creates a dedicated set of tables for that channel. The tables follow this naming convention:&lt;/p&gt;&lt;p&gt;z_{channelId}_{tableName}&lt;/p&gt;&lt;p&gt;For example, the message table for a channel with ID a80818699e490c30199e496d7a90001 is: z_8a80818699e490c30199e496d7a90001_message&lt;/p&gt;&lt;p&gt;The following tables are created per channel:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;source: Original source message data&lt;/li&gt;&lt;li&gt;message: Processed message meta-data&lt;/li&gt;&lt;li&gt;message_blob: Message payload data&lt;/li&gt;&lt;li&gt;channel_log: Per-channel log entries&lt;/li&gt;&lt;li&gt;channel_log_blob: Log entry payload data&lt;/li&gt;&lt;li&gt;message_cache: Per-message cache data&lt;/li&gt;&lt;li&gt;source_filter_result: Saved-view filter results for source messages&lt;/li&gt;&lt;li&gt;message_filter_result: Saved-view filter results for processed messages&lt;/li&gt;&lt;li&gt;dicom_response: DICOM response data (DICOM channels)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All new channels created in QIE use per-channel tables automatically. No action is required.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Converting a Legacy Channel&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Channels that existed before this feature was introduced continue to use the shared (legacy) tables until they are explicitly converted. Conversion is performed from the channel properties dialog under the Advanced Settings tab using the &#039;&lt;em&gt;Use individual tables for channel&lt;/em&gt;&#039; option.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Requirements for conversion:&lt;/em&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The channel must be stopped.&lt;/li&gt;&lt;li&gt;All existing messages for the channel must be purged from the system. Conversion does not migrate existing messages — it switches the channel to a new, empty set of tables. Any messages still in the source, processing, outbound, completed, or error queues will become inaccessible if the channel is converted before they are purged.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;To convert a channel:&lt;/em&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Stop the channel.&lt;/li&gt;&lt;li&gt;Purge all messages for the channel.&lt;/li&gt;&lt;li&gt;Open the channel properties dialog and select the Advanced Settings tab.&lt;/li&gt;&lt;li&gt;Enable &#039;&lt;em&gt;Use individual tables for channel&lt;/em&gt;&#039;.&lt;/li&gt;&lt;li&gt;Save the channel. QIE will create the new per-channel tables.&lt;/li&gt;&lt;li&gt;Start the channel. New messages will be written to the dedicated tables.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Once a channel has been converted, it cannot be reverted to the shared legacy tables.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3359/what-is-table-split-or-use-individual-tables-for-channel?show=3360#a3360</guid>
<pubDate>Mon, 27 Apr 2026 21:58:12 +0000</pubDate>
</item>
<item>
<title>Answered: Can QIE do recursive subdirectory scanning for File, Network Share, and FTP Sources?</title>
<link>https://www.qvera.com/kb/index.php/3357/recursive-subdirectory-scanning-file-network-share-sources?show=3358#a3358</link>
<description>&lt;h1&gt;Recursive Subdirectory Scanning for File, Network Share, and FTP Sources&lt;/h1&gt;&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;QIE adds an Include All Subdirectories option to File, Network Share, and FTP source nodes. When this option is enabled, QIE scans the configured source path recursively instead of only looking in the top-level folder.&lt;/p&gt;&lt;p&gt;This is useful when partners, devices, or upstream jobs drop files into date-based, customer-based, or location-based subfolders under a common root.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;How to Configure It&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Open the source node.&lt;/li&gt;&lt;li&gt;Configure the source path as usual.&lt;/li&gt;&lt;li&gt;Enable Include All Subdirectories.&lt;/li&gt;&lt;li&gt;Save the channel and test the source path.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The same option is available on:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;File sources&lt;/li&gt;&lt;li&gt;Network Share sources&lt;/li&gt;&lt;li&gt;FTP sources&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;What Changes When It Is Enabled&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;QIE scans the source path and nested folders beneath the configured source path.&lt;/li&gt;&lt;li&gt;The source path test actions include matching files found in subfolders.&lt;/li&gt;&lt;li&gt;QIE preserves the source-relative folder structure as source metadata for the message.&lt;/li&gt;&lt;li&gt;If the archive directory lives under the same source root, QIE skips that archive tree during recursive scans, so archived files are not picked up again.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Source-Relative Example:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Source &#039;Path&#039; set to: /incoming/files/source-root/&lt;/li&gt;&lt;li&gt;Include All Subdirectories enabled&lt;/li&gt;&lt;li&gt;File found in: /incoming/files/source-root/sub1/sub2/&lt;/li&gt;&lt;li&gt;source-relative path: sub1/sub2&lt;/li&gt;&lt;li&gt;So source.getFileDirectory() returns: sub1/sub2&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Archiving Behavior&lt;/h2&gt;&lt;p&gt;When recursive scanning is enabled via &lt;strong&gt;Include All Subdirectories&lt;/strong&gt;, the incoming file may have a relative path such as &lt;span style=&quot;background-color:#dddddd&quot;&gt;orders/2026/03/input.hl7&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;If the archive path does not use source metadata, QIE flattens that relative path into a single archive filename:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;orders/2026/03/input.hl7 -&amp;gt; orders_2026_03_input.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If you want to preserve the original folder structure in the archive, use the new source metadata tags in the archive path, especially {s-meta:FILE_DIRECTORY}.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Example&lt;/h2&gt;&lt;p&gt;If the source path is:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;/inbound/*.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;and files arrive in:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;/inbound/west/2026/04/order1.hl7&lt;/p&gt;&lt;p&gt;/inbound/east/2026/04/order2.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;then enabling &lt;strong&gt;Include All Subdirectories&lt;/strong&gt; allows QIE to find both files from the same source node.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Notes&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;The &lt;strong&gt;Include All Subdirectories &lt;/strong&gt;option is only for directory-style sources (File, Network Share, and FTP). If you only want QIE to watch the top folder, leave it disabled.&lt;/li&gt;&lt;li&gt;Relative folder information becomes especially valuable when combined with source metadata node tags or the Code Wizard functions like &lt;span style=&quot;background-color:#dddddd&quot;&gt;source.getFileDirectory()&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Archive Exclusion When Recursive Scanning Is Enabled Example&lt;/h2&gt;&lt;p&gt;When recursive scanning is enabled via &lt;strong&gt;Include All Subdirectories&lt;/strong&gt;, if the archive root directory lives under the source root, QIE skips that archive tree during recursive scans, so archived files are not picked up again. This behavior excludes the files in the archive root and its subfolders.&lt;/p&gt;&lt;p&gt;With this configuration and assumptions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Channel Cache region set to: &lt;span style=&quot;background-color:#dddddd&quot;&gt;west&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Source &#039;Path&#039; set to: &lt;span style=&quot;background-color:#dddddd&quot;&gt;/incoming/files/&lt;/span&gt;&lt;span style=&quot;background-color:#f1c40f&quot;&gt;source-root&lt;/span&gt;&lt;span style=&quot;background-color:#dddddd&quot;&gt;/&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Include All Subdirectories is: &lt;span style=&quot;background-color:#dddddd&quot;&gt;enabled&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Archive Path (&quot;Move file to&quot;) set to: &lt;span style=&quot;background-color:#dddddd&quot;&gt;/incoming/files/source-root/&lt;/span&gt;&lt;span style=&quot;background-color:#f1c40f&quot;&gt;archive-root&lt;/span&gt;&lt;span style=&quot;background-color:#dddddd&quot;&gt;/{cc:region}/{s-meta:FILE_DIRECTORY}/{s-meta:FILE_NAME}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;This file found in: &lt;span style=&quot;background-color:#dddddd&quot;&gt;/incoming/files/source-root/sub1/sub2/example.hl7&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;then the source relative path will be:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;`sub1/sub2`&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The &lt;strong&gt;{s-meta:FILE_DIRECTORY} &lt;/strong&gt;and &lt;strong&gt;{s-meta:FILE_NAME} &lt;/strong&gt;node tags will resolve to:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;sub1/sub2&lt;/p&gt;&lt;p&gt;and&lt;/p&gt;&lt;p&gt;example.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The Archive Exclusion folder (not scanned by the recursive scan including subfolders) is:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;archive-root&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The file will be archived to:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;/incoming/files/&lt;span style=&quot;background-color:#f1c40f&quot;&gt;source-root&lt;/span&gt;/&lt;span style=&quot;background-color:#f1c40f&quot;&gt;archive-root&lt;/span&gt;/west/sub1/sub2/example.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Notice that when source-metadata tags are used the relative folder and filename of the archived file is not flattened and the folder structure returned by&amp;nbsp;&lt;strong&gt;{s-meta:FILE_DIRECTORY}&lt;/strong&gt;&amp;nbsp;is preserved under the archive-root.&amp;nbsp; Also notice that node tags like&amp;nbsp;&lt;span style=&quot;background-color:#dddddd&quot;&gt;cc:region}&lt;/span&gt;&amp;nbsp;can be used to alter where the file is archived.&lt;/p&gt;&lt;p&gt;&lt;br&gt;If the &lt;strong&gt;archive-root&lt;/strong&gt; folder is not under the &lt;strong&gt;source-root&lt;/strong&gt; folder, then it is not scanned and no exclusion is applied.&lt;br&gt;&lt;br&gt;&lt;span style=&quot;background-color:#f4f6f8; color:#444444; font-family:Arial,&amp;quot;Liberation Sans&amp;quot;,&amp;quot;DejaVu Sans&amp;quot;,sans-serif&quot;&gt;Also see these related questions:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3355/how-to-use-source-getfiledirectory&quot;&gt;How to use source.getFileDirectory()?&lt;/a&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3353/what-source-metadata-node-tags-are-available-in-qie&quot;&gt;What source metadata node tags are available in QIE?&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3357/recursive-subdirectory-scanning-file-network-share-sources?show=3358#a3358</guid>
<pubDate>Mon, 20 Apr 2026 23:18:49 +0000</pubDate>
</item>
<item>
<title>Answered: How to use source.getFileDirectory()?</title>
<link>https://www.qvera.com/kb/index.php/3355/how-to-use-source-getfiledirectory?show=3356#a3356</link>
<description>&lt;h1&gt;&lt;span style=&quot;background-color:#dddddd&quot;&gt;source.getFileDirectory()&lt;/span&gt; Code Wizard Function&lt;/h1&gt;&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;QIE adds a new Code Wizard function under Source -&amp;gt; [selected format] -&amp;gt; File named Get File Directory. In scripts, this function is available as:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;source.getFileDirectory()&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It returns the &lt;strong&gt;source-relative&lt;/strong&gt; directory path associated with the current source file, using / as the separator, when &lt;strong&gt;Include All Subdirectories&lt;/strong&gt; is enabled.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color:#eeeeee; color:#080808; font-family:&amp;quot;JetBrains Mono&amp;quot;,monospace; font-size:9.8pt&quot;&gt;&lt;strong&gt;Source-Relative&lt;/strong&gt; &lt;/span&gt;Example:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Source &#039;Path&#039;&lt;/strong&gt; set to: /incoming/files/source-root/&lt;/li&gt;&lt;li&gt;Include All Subdirectories enabled&lt;/li&gt;&lt;li&gt;File found in: /incoming/files/source-root/sub1/sub2/&lt;/li&gt;&lt;li&gt;&lt;strong&gt;source-relative&lt;/strong&gt; path: sub1/sub2&lt;/li&gt;&lt;li&gt;So source.getFileDirectory() returns: sub1/sub2&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Return Value&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Returns the source-relative directory path for the current file&lt;/li&gt;&lt;li&gt;Returns empty string (&quot;&quot;) when the file is in the source root&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example return values:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&quot;&quot;&lt;/p&gt;&lt;p&gt;&quot;orders/2026/03&quot;&lt;/p&gt;&lt;p&gt;&quot;site-a/lab-results&quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;When to Use It&lt;/h2&gt;&lt;p&gt;Use &lt;span style=&quot;background-color:#dddddd&quot;&gt;source.getFileDirectory()&lt;/span&gt; when your script needs to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Route based on the subfolder the file came from&lt;/li&gt;&lt;li&gt;Rebuild part of the original folder structure in an archive or destination path&lt;/li&gt;&lt;li&gt;Add source folder details to logs or notifications&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;br&gt;Example&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;var fileDirectory = source.getFileDirectory();&lt;/p&gt;&lt;p&gt;var archivePath = &quot;/archive&quot;;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;if (fileDirectory !== &quot;&quot;) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; archivePath += &quot;/&quot; + fileDirectory;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;// archivePath is now either &quot;/archive&quot; or something like &quot;/archive/orders/2026/03&quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Relationship to Recursive Sources&lt;/h2&gt;&lt;p&gt;This function is only useful when &lt;strong&gt;Include All Subdirectories&lt;/strong&gt; is enabled on a File, Network Share, or FTP source. When &lt;strong&gt;Include All Subdirectories &lt;/strong&gt;is disabled it return an empty string (&quot;&quot;).&lt;/p&gt;&lt;p&gt;For example, if the source file arrives in the source-relative path as:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;[source path]/orders/2026/03/input.hl7&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;then:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;source.getFileDirectory()&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;returns:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;orders/2026/03&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If the file is in the root of the source path, the function returns an empty string.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Related Functions&lt;/h2&gt;&lt;p&gt;This function works well with the other file Code Wizard functions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;source.getFileName(): The filename including the extension.&lt;/li&gt;&lt;li&gt;source.getFileNameWithoutExt(): The filename without the extension.&lt;/li&gt;&lt;li&gt;source.getFileExt(): The file extension only.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Together, these functions let you build file-aware routing and naming logic without manually splitting strings.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#444444; font-family:Arial,&amp;quot;Liberation Sans&amp;quot;,&amp;quot;DejaVu Sans&amp;quot;,sans-serif&quot;&gt;Also see these related questions:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3353/what-source-metadata-node-tags-are-available-in-qie&quot;&gt;What source metadata node tags are available in QIE?&lt;/a&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3357/recursive-subdirectory-scanning-file-network-share-sources&quot;&gt;Can QIE do recursive subdirectory scanning for File, Network Share, and FTP Sources?&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3355/how-to-use-source-getfiledirectory?show=3356#a3356</guid>
<pubDate>Mon, 20 Apr 2026 21:00:53 +0000</pubDate>
</item>
<item>
<title>Answered: What source metadata node tags are available in QIE?</title>
<link>https://www.qvera.com/kb/index.php/3353/what-source-metadata-node-tags-are-available-in-qie?show=3354#a3354</link>
<description>&lt;h1&gt;Source Metadata Node Tags&lt;/h1&gt;&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;QIE adds a new &lt;span style=&quot;background-color:#dddddd&quot;&gt;Source Metadata&lt;/span&gt; category to Node Tag Lookup. These tags expose file-related values from the current source context so you can build paths, filenames, and messages dynamically without parsing the original filename yourself. These compliment the Code Wizard Functions.&lt;/p&gt;&lt;p&gt;This is especially helpful for archive paths &quot;Move file to&quot;, outbound filenames, evaluated templates, and conditional scripting.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Available Tags&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;{s-meta:FILE_DIRECTORY}&lt;/strong&gt;: The &lt;strong&gt;source-relative&lt;/strong&gt; directory path. Returns an empty string (&quot;&quot;) when the file is in the source root or &lt;strong&gt;Include All Subdirectories&lt;/strong&gt; is disabled.&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Source-Relative&lt;/strong&gt; Example:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Source &#039;Path&#039;&lt;/strong&gt; set to: /incoming/files/source-root/&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Include All Subdirectories&lt;/strong&gt; enabled&lt;/li&gt;&lt;li&gt;File found in: /incoming/files/source-root/sub1/sub2/&lt;/li&gt;&lt;li&gt;&lt;strong&gt;source-relative&lt;/strong&gt; path: sub1/sub2&lt;/li&gt;&lt;li&gt;So {s-meta:FILE_DIRECTORY} returns: sub1/sub2&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;{s-meta:FILE_NAME}&lt;/strong&gt;: The filename including the extension.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;{s-meta:FILE_NAME_WITHOUT_EXT}&lt;/strong&gt;: The filename without the extension.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;{s-meta:FILE_EXT}&lt;/strong&gt;: The file extension only.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;{s-meta:REMOTE_IP_ADDRESS}&lt;/strong&gt;: The remote IP address when the source context includes one; otherwise it resolves to blank.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Where to Find Them&lt;/h2&gt;&lt;p&gt;Open Node Tag Lookup and select Source Metadata.&lt;/p&gt;&lt;p&gt;These tags are intended for places where node tags are supported and a current source context exists, such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Archive paths&lt;/li&gt;&lt;li&gt;Destination paths or filenames&lt;/li&gt;&lt;li&gt;Evaluated templates&lt;/li&gt;&lt;li&gt;Scripts and expressions that evaluate node tags&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Common Examples&lt;/h2&gt;&lt;p&gt;Preserve subfolders in an archive path:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;/Archive/{s-meta:FILE_DIRECTORY}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Build a timestamped outbound filename:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;processed/{s-meta:FILE_NAME_WITHOUT_EXT}_{SYSTEM_DATE[yyyyMMddHHmmss]}.{s-meta:FILE_EXT}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Reference the original filename in a log or message:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;qie.evaluateTemplate(&quot;Processing {s-meta:FILE_NAME} from {s-meta:FILE_DIRECTORY}&quot;)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Why This Matters&lt;/h2&gt;&lt;p&gt;Before this enhancement, file metadata was only available in scripts via the following Code Wizard functions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;source.getFileDirectory()&lt;/li&gt;&lt;li&gt;source.getFileName()&lt;/li&gt;&lt;li&gt;source.getFileNameWithoutExt()&lt;/li&gt;&lt;li&gt;source.getFileExt()&lt;/li&gt;&lt;li&gt;source.getRemoteIPAddress()&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The new source metadata tags let you reference those values directly in templates and fields.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Notes and Limitations&lt;/h2&gt;&lt;p&gt;FILE_DIRECTORY uses / as the separator in the resolved value.&lt;/p&gt;&lt;p&gt;REMOTE_IP_ADDRESS is only populated when the source format includes a usable IP address. For ordinary file paths, it is blank. Only applies to socket and DICOM sources.&lt;/p&gt;&lt;p&gt;When testing source &quot;Move file to&quot; paths in the UI, source metadata node tags&amp;nbsp;cannot&amp;nbsp;be resolved because&amp;nbsp;a live source file is not available when testing. QIE shows a note during testing when source metadata segments cannot be evaluated. At runtime a valid source is available for proper evaluation.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#444444; font-family:Arial,&amp;quot;Liberation Sans&amp;quot;,&amp;quot;DejaVu Sans&amp;quot;,sans-serif&quot;&gt;Also see these related questions:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3357/recursive-subdirectory-scanning-file-network-share-sources&quot;&gt;Can QIE do recursive subdirectory scanning for File, Network Share, and FTP Sources?&lt;/a&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/3355/how-to-use-source-getfiledirectory&quot;&gt;How to use source.getFileDirectory()?&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3353/what-source-metadata-node-tags-are-available-in-qie?show=3354#a3354</guid>
<pubDate>Mon, 20 Apr 2026 19:05:02 +0000</pubDate>
</item>
<item>
<title>Answered: What is a QIE NetFile and when should I use it?</title>
<link>https://www.qvera.com/kb/index.php/3351/what-is-a-qie-netfile-and-when-should-i-use-it?show=3352#a3352</link>
<description>&lt;p&gt;The &lt;strong&gt;NetFile&lt;/strong&gt; object in QIE provides a reliable way to interact with files located on &lt;strong&gt;remote SMB network shares&lt;/strong&gt; using explicit credentials, instead of relying on the local system account that the QIE service runs under.&lt;/p&gt;&lt;p&gt;This is particularly useful in environments where:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The QIE service account &lt;strong&gt;does not have access&lt;/strong&gt; to the network share&lt;/li&gt;&lt;li&gt;Access requires &lt;strong&gt;domain credentials&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;You need &lt;strong&gt;fine control over SMB behavior and connection settings&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Why use NetFile instead of local file operations?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Standard file operations in QIE (e.g., readFile, writeFile) run under the &lt;strong&gt;QIE service account&lt;/strong&gt;. This can cause issues when accessing remote shares that require authentication.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NetFile solves this by:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Allowing &lt;strong&gt;explicit credentials (domain + username + password)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Supporting &lt;strong&gt;direct SMB access&lt;/strong&gt; to remote shares&lt;/li&gt;&lt;li&gt;Providing a consistent API similar to java.io.File, but for network locations&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;&lt;strong&gt;Key Benefits of NetFile&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. Access remote shares with credentials&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile connects to SMB shares using provided credentials instead of the QIE service account.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Supports domain;username format&amp;nbsp;&lt;/li&gt;&lt;li&gt;Works even when the service account has no access&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. Full file manipulation support&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile can be used with standard QIE file operations such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;readFile&lt;/li&gt;&lt;li&gt;writeFile&lt;/li&gt;&lt;li&gt;deleteFile&lt;/li&gt;&lt;li&gt;moveFile&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Internally, it wraps SMB operations and exposes them in a familiar way.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;3. Behavior consistent with local files&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile mimics the behavior of &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html&quot;&gt;java.io.File&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Methods like exists(), delete(), mkdirs() return &lt;strong&gt;boolean results&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Directory listing returns &lt;strong&gt;NetFile objects&lt;/strong&gt;, not SMB-specific types&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This makes it easier to write scripts without worrying about SMB-specific APIs.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;4. Automatic SMB path handling&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile automatically:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Converts Windows-style paths (\\server\share) to SMB format&lt;/li&gt;&lt;li&gt;Ensures paths are prefixed with smb:// when needed&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;5. Connection lifecycle management (autoClose)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile includes built-in connection management:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;By default, connections are &lt;strong&gt;automatically closed after a period of inactivity&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;You can disable this with autoClose=false and manually call close()&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This helps prevent:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Resource leaks&lt;/li&gt;&lt;li&gt;Stale SMB connections&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;6. Safe file access and locking&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetFile uses SMB share modes to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Prevent reading files that are still being written&lt;/li&gt;&lt;li&gt;Detect if a file is &lt;strong&gt;in use by another process&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This reduces the risk of:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Partial reads&lt;/li&gt;&lt;li&gt;Data corruption during file transfers&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;7. Configurable SMB behavior&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Optional parameters allow customization of the SMB connection, such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;File and directory modes&lt;/li&gt;&lt;li&gt;Timeout settings&lt;/li&gt;&lt;li&gt;Other jcifs-ng configuration options&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Format:&lt;/p&gt;&lt;pre&gt;key=value
key2=value2&lt;/pre&gt;&lt;p&gt;&lt;br&gt;For additional examples on usage of these optional parameters see &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/2243/what-are-the-network-share-configuration-parameters?show=2243#q2243&quot;&gt;what-are-the-network-share-configuration-parameters&lt;/a&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;When should I use NetFile?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Use NetFile when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Accessing &lt;strong&gt;remote SMB shares&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;You need to provide &lt;strong&gt;credentials explicitly&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;The QIE service account &lt;strong&gt;cannot access the share&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;You need &lt;strong&gt;reliable file locking or concurrency handling&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; use NetFile for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Local file system access (use standard file APIs instead)&lt;/li&gt;&lt;li&gt;Simple file operations where the service account already has access&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Additional Related Links:&lt;/strong&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/2243/what-are-the-network-share-configuration-parameters?show=2243#q2243&quot;&gt;what-are-the-network-share-configuration-parameters&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/2031/filenotfoundexception-when-using-netfile-fileoutputstream?show=2031#q2031&quot;&gt;filenotfoundexception-when-using-netfile-fileoutputstream&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/1143/how-to-connect-to-remote-share-mapping-node-with-credentials?show=1143#q1143&quot;&gt;how-to-connect-to-remote-share-mapping-node-with-credentials&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/1147/how-disable-dfs-network-shares-netfile-domain-environments?show=1147#q1147&quot;&gt;how-disable-dfs-network-shares-netfile-domain-environments&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html&quot;&gt;java.io.File&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3351/what-is-a-qie-netfile-and-when-should-i-use-it?show=3352#a3352</guid>
<pubDate>Wed, 15 Apr 2026 20:46:14 +0000</pubDate>
</item>
<item>
<title>Answered: How do I protect the connection.password for the QIE database so that it is not stored in plain text</title>
<link>https://www.qvera.com/kb/index.php/3349/protect-connection-password-database-that-stored-plain-text?show=3350#a3350</link>
<description>&lt;p&gt;&lt;strong&gt;Securing the QIE database password&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Starting with &lt;strong&gt;QIE 26.2.1&lt;/strong&gt;, QIE supports storing the database password in &lt;strong&gt;encrypted form&lt;/strong&gt; in the &lt;em&gt;-Dconnection.password&lt;/em&gt; Java option, instead of plain text. The encryption key is stored separately in the &lt;em&gt;QIE_DB_PASS_ENCRYPTION_KEY&lt;/em&gt; environment variable. When QIE starts, it uses that key to decrypt the password in memory and then uses the decrypted value to establish the JDBC connection.&lt;/p&gt;&lt;p&gt;To configure password encryption:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create an environment variable named &lt;em&gt;QIE_DB_PASS_ENCRYPTION_KEY&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;Set the environment variable to a &lt;strong&gt;32-byte key&lt;/strong&gt;. This key length is required to use &lt;strong&gt;AES-256&lt;/strong&gt; encryption.&lt;/li&gt;&lt;li&gt;Restart the &lt;strong&gt;QIE service&lt;/strong&gt; after setting the environment variable.&lt;/li&gt;&lt;li&gt;In QIE, navigate to &lt;strong&gt;System Config&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Scroll to &lt;strong&gt;Advanced Settings&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;QIE Database Connection Password Encryption Utility&lt;/strong&gt; section, click &lt;strong&gt;Encrypt Password&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Enter the database password in both fields, then click on the &#039;Encrypt Password&#039; button.&lt;/li&gt;&lt;li&gt;Copy the generated encrypted value.&lt;/li&gt;&lt;li&gt;Update the Java option using the following format:&lt;br&gt;-Dconnection.password=ENC({encrypted_password})&lt;/li&gt;&lt;li&gt;Restart the &lt;strong&gt;QIE service&lt;/strong&gt; again for the updated setting to take effect.&lt;/li&gt;&lt;/ol&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3349/protect-connection-password-database-that-stored-plain-text?show=3350#a3350</guid>
<pubDate>Tue, 14 Apr 2026 18:49:32 +0000</pubDate>
</item>
<item>
<title>Answered: How do I use Channel Cache variables in QIE?</title>
<link>https://www.qvera.com/kb/index.php/3347/how-do-i-use-channel-cache-variables-in-qie?show=3348#a3348</link>
<description>&lt;p&gt;Channel cache is a simple key-value pair database associated with the channel. It can be used to store configuration parameters that change or modify the behavior of the channel.&amp;nbsp;For example, you can store the name of a database or web service connection as a channel cache variable. This centralizes the configuration, making it easy to update the connection when moving a channel between environments (e.g., from testing to production) without having to modify the channel&#039;s mapping logic.&lt;/p&gt;&lt;p&gt;Values can be added, updated and deleted from channel node scripts. Values can also be manually added or deleted through the Channel Cache tab shown here.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://www.qvera.com/kb/?qa=blob&amp;amp;qa_blobid=1541199855220035865&quot; style=&quot;height:208px; width:216px&quot;&gt;&lt;/p&gt;&lt;p&gt;Channel cache values are exported and imported with the channel. On import, if the channel cache already exists in a channel the value won’t be overwritten.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The channel cache is not thread-safe. It is designed for static configuration values. For frequently updated data, please use an external database to ensure data consistency and avoid performance issues.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3347/how-do-i-use-channel-cache-variables-in-qie?show=3348#a3348</guid>
<pubDate>Fri, 10 Apr 2026 14:49:54 +0000</pubDate>
</item>
<item>
<title>Answered: What is the difference between the Add Inbound Message and Queue Inbound Message?</title>
<link>https://www.qvera.com/kb/index.php/3345/difference-between-inbound-message-queue-inbound-message?show=3346#a3346</link>
<description>There are two functions that can be used on the Source Node to add messages to the channel for processing: qie.addInboundMessage(record, originalFilename) and qie.queueInboundMessage(record, originalFilename). What are the differences?&lt;br /&gt;
&lt;br /&gt;
1. qie.addInboundMessage(record, originalFilename)&lt;br /&gt;
&lt;br /&gt;
Adds messages to the inbound queue one at a time. Use this method when message order matters and the channel is configured to process messages in the order received.&lt;br /&gt;
&lt;br /&gt;
It takes two parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;record: a String or byte[] &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;originalFilename: a String representing the filename of the message to be processed&lt;br /&gt;
&lt;br /&gt;
2. qie.queueInboundMessage(record, originalFilename)&lt;br /&gt;
&lt;br /&gt;
Adds messages to the inbound queue using a multi-threaded process. This allows for higher throughput, but the order in which messages are added and processed is not preserved.&lt;br /&gt;
&lt;br /&gt;
It also takes the same two parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;record: a String or byte[]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;originalFilename: a String representing the filename of the message to be processed&lt;br /&gt;
&lt;br /&gt;
Note: Use qie.queueInboundMessage when message processing order does not matter and higher throughput is required. Use qie.addInboundMessage when message order matters and the channel is configured to process messages in the order received.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3345/difference-between-inbound-message-queue-inbound-message?show=3346#a3346</guid>
<pubDate>Tue, 07 Apr 2026 11:59:23 +0000</pubDate>
</item>
<item>
<title>Answered: Can I set or change the end-of-line (EOL) characters in a message?</title>
<link>https://www.qvera.com/kb/index.php/3343/can-i-set-or-change-the-end-of-line-eol-characters-in-a-message?show=3344#a3344</link>
<description>&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;The message.setEndOfLine(eol) function allows you to explicitly control the end-of-line (EOL) character(s) used when processing or generating formatted messages.&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;This is useful when working with systems that require specific line termination formats.&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;strong&gt;Syntax&lt;/strong&gt;&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&amp;nbsp; &amp;nbsp;message.setEndOfLine(eol)&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parameter&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;eol&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;The end-of-line character(s) to use for the message&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#039;\r&#039;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Carriage Return (CR) — common in HL7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#039;\n&#039;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Line Feed (LF) — Unix/Linux format&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#039;\r\n&#039;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;CR + LF — Windows format&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#039;&#039;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;No line terminator (X12 only)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;/p&gt;&lt;h3 data-section-id=&quot;rzwzjc&quot; data-start=&quot;1128&quot; data-end=&quot;1155&quot;&gt;&lt;strong&gt;Supported Message Types&lt;/strong&gt;&lt;/h3&gt;&lt;p data-start=&quot;1156&quot; data-end=&quot;1222&quot;&gt;This method applies only to the following formatted message types:&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;/p&gt;&lt;ul data-start=&quot;1224&quot; data-end=&quot;1321&quot;&gt;&lt;li data-section-id=&quot;16p6n4r&quot; data-start=&quot;1224&quot; data-end=&quot;1231&quot;&gt;HL7&lt;/li&gt;&lt;li data-section-id=&quot;1vz37er&quot; data-start=&quot;1232&quot; data-end=&quot;1240&quot;&gt;ASTM&lt;/li&gt;&lt;li data-section-id=&quot;16x0pu6&quot; data-start=&quot;1241&quot; data-end=&quot;1248&quot;&gt;CSV&lt;/li&gt;&lt;li data-section-id=&quot;1k7l2z4&quot; data-start=&quot;1249&quot; data-end=&quot;1260&quot;&gt;EDIFACT&lt;/li&gt;&lt;li data-section-id=&quot;ylub9k&quot; data-start=&quot;1261&quot; data-end=&quot;1304&quot;&gt;Fixed Width (Old Fxd Width, Fxd Length)&lt;/li&gt;&lt;li data-section-id=&quot;1rf3y6o&quot; data-start=&quot;1305&quot; data-end=&quot;1313&quot;&gt;JSON&lt;/li&gt;&lt;li data-section-id=&quot;170l9ar&quot; data-start=&quot;1314&quot; data-end=&quot;1321&quot;&gt;X12&lt;/li&gt;&lt;/ul&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;&lt;strong&gt;Behavior Notes&lt;/strong&gt;&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;The EOL setting affects how the message is serialized or output, not how it is internally parsed.&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;For HL7 messages, the standard segment terminator is typically &#039;\r&#039;. Changing this may impact compatibility with downstream systems.&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;For X12 messages, an empty string (&#039;&#039;) is allowed because segment terminators are defined differently (via delimiters within the ISA segment).&lt;/p&gt;&lt;p data-start=&quot;225&quot; data-end=&quot;388&quot;&gt;If an unsupported value is provided, the function may throw an error or be ignored depending on context.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3343/can-i-set-or-change-the-end-of-line-eol-characters-in-a-message?show=3344#a3344</guid>
<pubDate>Tue, 31 Mar 2026 15:20:28 +0000</pubDate>
</item>
<item>
<title>Answered: What is the Refresh Script, and how is it used?</title>
<link>https://www.qvera.com/kb/index.php/3341/what-is-the-refresh-script-and-how-is-it-used?show=3342#a3342</link>
<description>The Sample Message Refresh Script feature allows users to update sample messages with current or dynamic data. In QIE, sample messages are typically loaded manually on the Source Node by pasting a message from the clipboard or by using the File Import option. Over time, these messages may contain outdated information such as dates or other time-sensitive values. Updating them manually can be time-consuming, especially when multiple sample messages are used. The Refresh Script allows a user to write a custom script on the Sample Message tab that modifies the message before it is used. The script can call web services, run database queries, or access System Node Tags to retrieve values such as the current date and time or other QIE system information. The refresh script can be triggered to run from both the Sample Messages dialog and from the Test Window. After the script updates the message, QIE replaces the current sample message with the returned result. The returned message must be a String, and the final line of the script should assign the updated message to the message variable, for example: message = myNewSampleMessage where myNewSampleMessage contains the refreshed sample message.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3341/what-is-the-refresh-script-and-how-is-it-used?show=3342#a3342</guid>
<pubDate>Tue, 24 Mar 2026 17:48:58 +0000</pubDate>
</item>
<item>
<title>Answered: HL7 Attachments handling</title>
<link>https://www.qvera.com/kb/index.php/3338/hl7-attachments-handling?show=3339#a3339</link>
<description>&lt;p style=&quot;margin: 0px 0px 1em; padding: 0px; color: rgb(0, 0, 0); font-family: tahoma, arial, helvetica, sans-serif; font-size: 13px; background-color: rgba(255, 255, 255, 0.3);&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;For HL7 ORU^R01 with&amp;nbsp;Base64 in OBX, the practical/typical QIE pattern is:&lt;/span&gt;&lt;/p&gt;&lt;ol style=&quot;background-color:rgba(255, 255, 255, 0.3); color:#000000; font-family:tahoma,arial,helvetica,sans-serif; font-size:13px; list-style-image:initial; list-style-position:initial; margin:0.5em 0px 1em; padding-left:1em; padding-right:0px&quot;&gt;&lt;li style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong style=&quot;font-style:inherit; font-weight:bold&quot;&gt;Extract Base64 from OBX → decode → write to file (or external object store)&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong style=&quot;font-style:inherit; font-weight:bold&quot;&gt;Replace OBX-5 with a lightweight reference&lt;/strong&gt;&amp;nbsp;(UNC path, URL, document ID, etc.) so the HL7 message is small during processing&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;Before sending to the destination, either:&lt;/span&gt;&lt;ul style=&quot;list-style:initial; margin:0.5em 0px 1em; padding-left:1em; padding-right:0px&quot;&gt;&lt;li style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;send the reference as-is (preferred), or&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong style=&quot;font-style:inherit; font-weight:bold&quot;&gt;re-hydrate&lt;/strong&gt;: read the file back, Base64-encode, and put it back into OBX-5 before sending.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;However, how each of these steps is accomplished will vary based on your specific requirements and environment, so it would be best to&amp;nbsp;reach out to us at support@qvera.com so we can take a look at your individual situation.&lt;/span&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3338/hl7-attachments-handling?show=3339#a3339</guid>
<pubDate>Tue, 17 Feb 2026 15:12:26 +0000</pubDate>
</item>
<item>
<title>Answered: Do you need to restart a channel when a global function it uses is changed</title>
<link>https://www.qvera.com/kb/index.php/3335/you-need-restart-channel-when-global-function-uses-changed?show=3336#a3336</link>
<description>Whenever a global function or published function at the zone level is updated, you must restart the qie channels using it. This is because the function is cached when the channel is started and only reloaded when the channel is restarted.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3335/you-need-restart-channel-when-global-function-uses-changed?show=3336#a3336</guid>
<pubDate>Thu, 22 Jan 2026 22:21:13 +0000</pubDate>
</item>
<item>
<title>Answered: Who is Awkward Al?</title>
<link>https://www.qvera.com/kb/index.php/11/who-is-awkward-al?show=3330#a3330</link>
<description>&lt;p&gt;&lt;span style=&quot;color:#000000; font-size:medium&quot;&gt;Awkward Al is stuck in the past - powered by legacy integration engines that can&#039;t&amp;nbsp;keep up with modern healthcare. Qvera fixes awkward, retires outdated technology, and delivers intelligent interoperability for today&#039;s healthcare IT ecosystem.&lt;/span&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/11/who-is-awkward-al?show=3330#a3330</guid>
<pubDate>Sun, 21 Dec 2025 16:45:54 +0000</pubDate>
</item>
<item>
<title>Answered: Unable to upgrade database</title>
<link>https://www.qvera.com/kb/index.php/3328/unable-to-upgrade-database?show=3329#a3329</link>
<description>The error indicates that the MariaDB upgrade process ran into an unspecified error. &amp;nbsp;However, since that error is outside QIE itself we&amp;#039;ll need to look at the MariaDB logs to try and discover why.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Note that MariaDB 11.4 is the newest supported version for QIE. &amp;nbsp;The current version of QIE requires MariaDB 10.7 - 11.4, so your current database (being version 10.7.3) should be sufficient to upgrade to the latest QIE release. &amp;nbsp;If QIE is unable to upgrade, there may be a QIE startup argument that is set incorrectly.&lt;br /&gt;
&lt;br /&gt;
In either case, if you contact support directly, we can schedule a call to look at your system. &amp;nbsp;Support can be reached via email at support@qvera.com, or via phone at 801-335-5101 extension 2.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3328/unable-to-upgrade-database?show=3329#a3329</guid>
<pubDate>Mon, 15 Dec 2025 14:12:27 +0000</pubDate>
</item>
<item>
<title>Answered: Why does the script editor put a period and a space &quot;. &quot; instead of two spaces &quot;  &quot; when I type two spaces.</title>
<link>https://www.qvera.com/kb/index.php/3326/does-script-editor-period-space-instead-spaces-when-spaces?show=3327#a3327</link>
<description>&lt;p&gt;If you are on a Mac computer it has a keyboard setting meant to do this replacement.&amp;nbsp; To turn it off, try this (older macs may vary):&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt;Open &lt;/span&gt;&lt;strong&gt;System Settings&lt;/strong&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt;Go to &lt;/span&gt;&lt;strong&gt;Keyboard&lt;/strong&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Under &quot;Text Input,&quot; click the &lt;span style=&quot;font-family:&amp;quot;Helvetica Neue&amp;quot;; font-size:14px&quot;&gt;&lt;strong&gt;Edit...&lt;/strong&gt;&lt;/span&gt; button next to &quot;Input Sources.&quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt;Toggle &lt;/span&gt;&lt;strong&gt;OFF&lt;/strong&gt;&lt;span style=&quot;font-family:Helvetica; font-size:12px&quot;&gt; the switch for &lt;/span&gt;&lt;strong&gt;&quot;Add period with double-space.&quot;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Click &lt;span style=&quot;font-family:&amp;quot;Helvetica Neue&amp;quot;; font-size:14px&quot;&gt;&lt;strong&gt;Done&lt;/strong&gt;&lt;/span&gt;.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3326/does-script-editor-period-space-instead-spaces-when-spaces?show=3327#a3327</guid>
<pubDate>Sat, 22 Nov 2025 02:27:12 +0000</pubDate>
</item>
<item>
<title>Answered: The memory reported in the &quot;Monitor Server Resources&quot; dialog is less than what is reported by the OS</title>
<link>https://www.qvera.com/kb/index.php/3324/memory-reported-monitor-server-resources-dialog-reported?show=3325#a3325</link>
<description>&lt;p&gt;That is a classic and frequent observation when monitoring a Java Virtual Machine (JVM). The reason the Operating System (OS) reports more memory usage than the sum of the JVM&#039;s memory pools is that the &lt;strong&gt;OS reports the entire process footprint&lt;/strong&gt;, while the &lt;strong&gt;JVM&#039;s memory pool beans only report the areas managed by the Garbage Collector (GC) and JIT compiler&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The difference lies in the memory allocated for &lt;strong&gt;JVM Native Memory&lt;/strong&gt; which is not tracked by the standard MemoryPoolMXBeans (like Eden, Old Gen, Metaspace, or CodeHeap).&lt;/p&gt;&lt;p&gt;The &quot;missing&quot; memory is primarily consumed by internal, non-heap allocations the JVM requires to function.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;1. Thread Stacks&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Every time a &lt;strong&gt;Java thread&lt;/strong&gt; is created, the JVM allocates a fixed block of memory in native space for that thread&#039;s &lt;strong&gt;stack&lt;/strong&gt;. This stack is used to hold local variables, method call frames, and return addresses.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Impact:&lt;/strong&gt; This is usually the largest source of discrepancy. On 64-bit systems, the default stack size is often &lt;strong&gt;1MB&lt;/strong&gt;. An application with 200 threads would immediately reserve 200 * 1 {MB} = 200 {MB}&amp;nbsp;of native memory that is not reported in any standard memory pool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Programmatic Reporting:&lt;/strong&gt; There is no standard JMX bean to report the sum of thread stack usage.&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;2. Garbage Collector (GC) Internal Data Structures&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The G1 GC (and other modern collectors) requires significant internal data structures to manage the heap, track references, and enable concurrent collection. This memory is allocated in native space.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;G1 Overhead:&lt;/strong&gt; For the &lt;strong&gt;G1 GC&lt;/strong&gt;, this includes structures like &lt;strong&gt;Remembered Sets (RSet)&lt;/strong&gt; and &lt;strong&gt;Card Tables&lt;/strong&gt;. These structures track cross-region references and can consume a notable amount of memory, especially with a large heap or a high number of regions.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;3. Other JVM Internal Data&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The JVM itself is a complex native C++ application that needs memory for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Symbol Table:&lt;/strong&gt; Storing constant pool entries, field names, and method signatures.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;String Table:&lt;/strong&gt; Storing interned strings (which are references &lt;em&gt;to&lt;/em&gt; heap objects, but the table itself is native).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;JNI (Java Native Interface)&lt;/strong&gt; code and temporary buffers.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loaded Libraries:&lt;/strong&gt; The memory occupied by the JVM executables and loaded native libraries (like DLLs or SOs).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3324/memory-reported-monitor-server-resources-dialog-reported?show=3325#a3325</guid>
<pubDate>Thu, 20 Nov 2025 21:52:11 +0000</pubDate>
</item>
<item>
<title>Answered: does anyone have an example HL7 to xml translation that you&#039;re willing to share?</title>
<link>https://www.qvera.com/kb/index.php/3322/does-anyone-have-example-translation-that-youre-willing-share?show=3323#a3323</link>
<description>&lt;p&gt;You could do something like this:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;message = qie.createXMLMessage(&quot;&amp;lt;person/&amp;gt;&quot;);&lt;/p&gt;&lt;p&gt;message.setNode(&quot;/person/@mrn&quot;, source.getNode(&quot;PID-3&quot;));&lt;/p&gt;&lt;p&gt;message.setNode(&quot;/person/firstName&quot;, source.getNode(&quot;PID-5.2&quot;));&lt;/p&gt;&lt;/blockquote&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3322/does-anyone-have-example-translation-that-youre-willing-share?show=3323#a3323</guid>
<pubDate>Wed, 29 Oct 2025 17:02:53 +0000</pubDate>
</item>
<item>
<title>Answered: How do I prepare the MSSQL user for the JDBC 13.x driver?</title>
<link>https://www.qvera.com/kb/index.php/3319/how-do-i-prepare-the-mssql-user-for-the-jdbc-13-x-driver?show=3320#a3320</link>
<description>&lt;p&gt;Steps (Jump to step 3 if you already know which permission is needed):&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Step 1 — Identify SQL Server version&lt;/h1&gt;&lt;p&gt;Run in &lt;strong&gt;SSMS/Azure Data Studio&lt;/strong&gt;:&lt;/p&gt;&lt;pre&gt;SELECT @@VERSION AS SqlVersion;&lt;/pre&gt;&lt;p&gt;If it says &lt;strong&gt;SQL Server 2022 (16.x)&lt;/strong&gt; or newer, you’ll grant &lt;strong&gt;VIEW DATABASE PERFORMANCE STATE&lt;/strong&gt;. If it’s &lt;strong&gt;2019 or earlier&lt;/strong&gt;, grant &lt;strong&gt;VIEW DATABASE STATE&lt;/strong&gt;. See Microsoft’s DMV permission note. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Step 2 — Check whether the QIE user already has the permission&lt;/h1&gt;&lt;p&gt;Change database context to QIE DB (e.g., qie) and run:&lt;/p&gt;&lt;pre&gt;USE [qie];
SELECT
  DB_NAME() AS database_name,
  HAS_PERMS_BY_NAME(
        DB_NAME(),
        &#039;DATABASE&#039;,
        &#039;VIEW DATABASE PERFORMANCE STATE&#039;
  ) AS has_view_db_perf_state,
  HAS_PERMS_BY_NAME(
        DB_NAME(),
        &#039;DATABASE&#039;,
        &#039;VIEW DATABASE STATE&#039;
  )AS has_view_db_state;&lt;/pre&gt;&lt;p&gt;A result of &lt;strong&gt;1&lt;/strong&gt; means the permission is present. HAS_PERMS_BY_NAME reference. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/t-sql/functions/has-perms-by-name-transact-sql?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt; Note which one applies based on step 1.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Step 3 — Grant the minimum required permission&lt;/h1&gt;&lt;p&gt;Replace&amp;nbsp;&amp;lt;DbUserName&amp;gt; with the QIE user used by the QIE application. Default is &quot;qie&quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you are on &lt;strong&gt;SQL Server 2022+&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;USE [qie];
-- If the principal doesn&#039;t exist in this DB yet, create it (examples below).
GRANT VIEW DATABASE PERFORMANCE STATE TO [&amp;lt;DbUserName&amp;gt;];&lt;/pre&gt;&lt;p&gt;If you are on &lt;strong&gt;SQL Server 2019 or earlier&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;USE [qie];
GRANT VIEW DATABASE STATE TO [&amp;lt;DbUserName&amp;gt;];&lt;/pre&gt;&lt;p&gt;(Older versions use the classic VIEW DATABASE STATE for database-scoped DMVs.) &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Summary&lt;/h1&gt;&lt;p&gt;Before QIE can update to the latest Microsoft JDBC Driver this new permission must be granted to allow QIE to continue to correctly manage schema changes on upgrades. Starting with Microsoft JDBC Driver &lt;strong&gt;13.x&lt;/strong&gt;, the driver changed how it gathers index metadata. When QIE calls DatabaseMetaData.getIndexInfo to manage schema changes, the driver now queries DMVs instead of &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;sp_statistics&lt;/span&gt;. &lt;strong&gt;On SQL Server 2022+&lt;/strong&gt;, those DMV queries require the VIEW DATABASE PERFORMANCE STATE permission (on earlier versions it’s VIEW DATABASE STATE). If the QIE user lacks this permission, you’ll see errors like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;o VIEW DATABASE PERFORMANCE STATE permission denied in database &#039;qie&#039;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;o The user does not have permission to perform this action.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Grant the appropriate permission to the QIE database and the QIE user. Root cause details are in Microsoft’s release notes and DMV permission docs. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn+1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Affected&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;o&amp;nbsp;&lt;strong&gt;Driver versions:&lt;/strong&gt; Microsoft JDBC 13.x (e.g., 13.2.x). &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;o&amp;nbsp;&lt;strong&gt;SQL Server versions:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;- &lt;strong&gt;SQL Server 2022 (16.x) and later:&lt;/strong&gt; requires VIEW DATABASE PERFORMANCE STATE&lt;/li&gt;&lt;li&gt;- &lt;strong&gt;SQL Server 2019 (15.x) and earlier:&lt;/strong&gt; requires VIEW DATABASE STATE. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Symptoms you may see&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;o QIE fails during startup / schema validation.&lt;/li&gt;&lt;li&gt;o Messages similar to:&lt;ul&gt;&lt;li&gt;- &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;SQL Error: 262, SQLState: S0001&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;VIEW DATABASE PERFORMANCE STATE permission denied in database &#039;&amp;lt;db&amp;gt;&#039;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;The user does not have permission to perform this action.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Stack traces showing &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;SQLServerDatabaseMetaData.getIndexInfo(...)&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Why this happens:&lt;/h2&gt;&lt;p&gt;The JDBC 13.x driver &lt;strong&gt;replaced&lt;/strong&gt; its older metadata path and now issues custom queries (covering all index types, including columnstore) instead of &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;sp_statistics&lt;/span&gt;. Those queries hit DMVs that, on SQL Server 2022+, require the new PERFORMANCE STATE permission. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;FAQ&lt;/h1&gt;&lt;p&gt;&lt;br&gt;Q: &lt;strong&gt;Which permission do I need?&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;o SQL Server &lt;strong&gt;2022+&lt;/strong&gt; → VIEW DATABASE PERFORMANCE STATE&lt;/li&gt;&lt;li&gt;o SQL Server &lt;strong&gt;2019 or earlier&lt;/strong&gt; → VIEW DATABASE STATE &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;Q: &lt;strong&gt;Does this grant expose table data?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It grants visibility into performance-related DMVs for the database; it does &lt;strong&gt;not&lt;/strong&gt; grant SELECT on user tables. See Microsoft’s DMV permission model for specifics. Microsoft Learn&lt;/p&gt;&lt;p&gt;&lt;br&gt;Q: &lt;strong&gt;Our app uses a Managed Identity—what’s different?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Create the &lt;strong&gt;QIE database user&lt;/strong&gt; from the external provider and grant the same permission in each DB:&lt;/p&gt;&lt;pre&gt;USE [qie];
CREATE USER [MyManagedIdentityDisplayName] FROM EXTERNAL PROVIDER;
GRANT VIEW DATABASE PERFORMANCE STATE TO [MyManagedIdentityDisplayName];&lt;/pre&gt;&lt;p&gt;Reference: CREATE USER ... FROM EXTERNAL PROVIDER. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;References&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;o Microsoft JDBC Driver release notes — index metadata change in 13.x. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;o DMV permission changes in SQL Server 2022+: VIEW DATABASE PERFORMANCE STATE. &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;o &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;HAS_PERMS_BY_NAME&lt;/span&gt; function (permission checks). &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/t-sql/functions/has-perms-by-name-transact-sql?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;o &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;CREATE USER&lt;/span&gt; (SQL logins and Entra/Managed Identity contained users). &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-ver17&amp;amp;utm_source=chatgpt.com&quot;&gt;Microsoft Learn&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;See also&lt;/h1&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.qvera.com/kb/index.php/2265/sql-server-script-create-high-availability-database-for-qie?show=2265#q2265&quot;&gt;SQL Server script to create High Availability database for QIE&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3319/how-do-i-prepare-the-mssql-user-for-the-jdbc-13-x-driver?show=3320#a3320</guid>
<pubDate>Wed, 22 Oct 2025 19:44:10 +0000</pubDate>
</item>
<item>
<title>Answered: How to get IP from HL7 Connection</title>
<link>https://www.qvera.com/kb/index.php/3316/how-to-get-ip-from-hl7-connection?show=3317#a3317</link>
<description>&lt;p&gt;For a channel configured to receive messages via TCP/IP socket, the &quot;filename&quot; that we log is the source IP address.&amp;nbsp; Thus, you can use &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;&lt;strong&gt;qie.getFileName()&lt;/strong&gt;&lt;/span&gt; to display the source IP address, which can then be used in a condition node to route your messages.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In addition, we also have &lt;span style=&quot;font-family:Courier New,Courier,monospace&quot;&gt;&lt;strong&gt;source.getRemoteIPAddress()&lt;/strong&gt;&lt;/span&gt;, which is specifically designed for TCP/IP socket source. &amp;nbsp;Both methods will return the IP address of the source.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3316/how-to-get-ip-from-hl7-connection?show=3317#a3317</guid>
<pubDate>Mon, 06 Oct 2025 15:22:35 +0000</pubDate>
</item>
<item>
<title>Answered: Documentation on using HAPI?</title>
<link>https://www.qvera.com/kb/index.php/3314/documentation-on-using-hapi?show=3315#a3315</link>
<description>&lt;p&gt;To add the HAPI library to QIE:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;1. System Administration&lt;/p&gt;&lt;p&gt;2. System Configuration&lt;/p&gt;&lt;p&gt;3. Manage External Libraries&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://www.qvera.com/kb/?qa=blob&amp;amp;qa_blobid=16088899632024711322&quot; style=&quot;height:286px; width:685px&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;From here, you can download the HAPI library version from a list of available versions.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://www.qvera.com/kb/?qa=blob&amp;amp;qa_blobid=17295944812226867418&quot; style=&quot;height:392px; width:839px&quot;&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Below is an example of creating a FHIR Account using the HAPI functions:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;var account = new hapi.r4.Account();&lt;/p&gt;&lt;p&gt;account.setId(&quot;exampleAccount&quot;);&lt;/p&gt;&lt;p&gt;account.addIdentifier().setValue(&quot;654321&quot;).setSystem(&quot;urn:oid:0.1.2.3.4.5.6.7&quot;);&lt;/p&gt;&lt;p&gt;account.setStatus(hapi.r4.Account.AccountStatus.ACTIVE);&lt;/p&gt;&lt;p&gt;var ctx = hapi.context.getR4FhirContext();&lt;/p&gt;&lt;p&gt;// Instantiate a new JSON parser&lt;/p&gt;&lt;p&gt;var parser= ctx.newJsonParser();&lt;/p&gt;&lt;p&gt;parser.setPrettyPrint(true);&lt;/p&gt;&lt;p&gt;// Serialize it&lt;/p&gt;&lt;p&gt;var accountString = parser.encodeResourceToString(account);&lt;/p&gt;&lt;p&gt;message = qie.createJSONMessage(accountString, &#039;UTF-8&#039;);&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;You can find more information about the HAPI resources on the HAPI website:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://hapifhir.io/hapi-fhir/docs/&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/docs/&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3314/documentation-on-using-hapi?show=3315#a3315</guid>
<pubDate>Thu, 25 Sep 2025 15:57:54 +0000</pubDate>
</item>
<item>
<title>Answered: Why does QIE&#039;s postDICOMRequest() method require a DICOM Channel and a DICOM Connection</title>
<link>https://www.qvera.com/kb/index.php/3312/postdicomrequest-method-require-dicom-channel-connection?show=3313#a3313</link>
<description>&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Here’s why QIE forces you to split things out into:&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
&lt;ul style=&quot;list-style-type: disc; margin-left: 15px; padding-right: 5px;&quot;&gt;
  &lt;li&gt;
    &lt;strong&gt;A DICOM connection&lt;/strong&gt; 
    &lt;em&gt;(the “where do I send my request?” config, acting as SCU → SCP)&lt;/em&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;A DICOM channel&lt;/strong&gt; 
    &lt;em&gt;(the “where do I listen for responses?” config, acting as SCP on your side)&lt;/em&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p&gt;This mirrors how DICOM associations actually behave in the real world:&lt;/p&gt;
&lt;br&gt;
&lt;ul style=&quot;list-style-type: disc; margin-left: 15px; padding-right: 5px;&quot;&gt;
  &lt;li&gt;
    Many DICOM services are &lt;strong&gt;asynchronous&lt;/strong&gt;.  
    When you send a request (&lt;code&gt;N-ACTION-RQ&lt;/code&gt;, &lt;code&gt;C-MOVE&lt;/code&gt;, etc.),  
    the SCP may send multiple responses over time (intermediate &lt;em&gt;pending&lt;/em&gt; responses, final responses).
  &lt;/li&gt;
  &lt;li&gt;
    Some services (especially &lt;code&gt;C-MOVE&lt;/code&gt;) don’t even return the actual images in the same association —  
    instead, the SCP initiates new &lt;code&gt;C-STORE&lt;/code&gt; sub-associations back to the SCU (your side).  
    That requires your system to be running as an SCP, waiting for those stores.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p&gt;
  If QIE just “spun up a socket” inside your HL7 channel and blocked waiting for one response,  
  it wouldn’t be able to handle these multi-response or callback situations correctly.
&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
  The enforced split is Qvera saying  
  &lt;em&gt;“we’re going to model DICOM correctly, including async behavior, whether you’re using it in that way today or not.”&lt;/em&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
  We are aware this can cause some confusion.  Hence this KB article &lt;img title=&quot;wink&quot; alt=&quot;wink&quot; src=&quot;https://www.qvera.com/kb/qa-plugin/wysiwyg-editor/ckeditor/plugins/smiley/images/wink_smile.png&quot; style=&quot;height:23px; width:23px&quot;&gt;.  We&#039;re also aware that sometimes the timeouts 
  of the receiving channel come into play and appear to override the timeouts configured in the &lt;code&gt;DICOM connection&lt;/code&gt;, so watch
  out for that as well as it can be a &lt;em&gt;&quot;gotcha&quot;&lt;/em&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;p&gt;
  Now in your specific example above, the error you&#039;re receiving:
  &lt;br&gt;
  &lt;code&gt;Channel &#039;C-FIND via JSON&#039; is not running.&lt;/code&gt;
  &lt;br&gt;
  is due to the fact that all qie.postDICOMRequest() calls must have a &lt;strong&gt;DICOM channel&lt;/strong&gt; 
  as mentioned above to receive the responses.  In this case the channel is an HTTP listener with a 
  JSON payload, not a DICOM Listener.  Although the documentation for the call says that the &lt;code&gt;&quot;channel*&quot;&lt;/code&gt;
  is optional, it&#039;s really only optional in the sense that it defaults to the current channel and expects it to be
  a DICOM listener.
&lt;/p&gt;&lt;/div&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3312/postdicomrequest-method-require-dicom-channel-connection?show=3313#a3313</guid>
<pubDate>Tue, 23 Sep 2025 14:31:47 +0000</pubDate>
</item>
<item>
<title>Answered: How do I update the qieLauncher package?</title>
<link>https://www.qvera.com/kb/index.php/3310/how-do-i-update-the-qielauncher-package?show=3311#a3311</link>
<description>&lt;p&gt;The qieLauncher service is used to monitor the main QIE service and restart it when needed for release updates and other tasks. The older version of the qieLauncher relied on a deprecated technology to talk to another running java service. This technology is being removed in java version 24 and will no longer work.&lt;/p&gt;&lt;p&gt;To prevent problems with the QIE environment, the qieLauncher needs to be updated. The update process is different when running windows vs linux.&lt;/p&gt;&lt;h1&gt;&lt;strong&gt;Window&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;Simply update download the latest version of QIE and run the installer.&lt;/p&gt;&lt;p&gt;Once downloaded, stop the QIE service before running the installer.&lt;/p&gt;&lt;p&gt;Once the service is stopped, open the zip file and execute the .exe file. This will preserve all existing settings in your environment. The installer will install the latest version of the qieLauncher and update the QIE service to the latest version (unless the QIE service is already running the latest version, then it will only update the qieLauncher).&lt;/p&gt;&lt;p&gt;After the update, start the service.&lt;/p&gt;&lt;h1&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;Connect to the linux environment using ssh and then navigate to the qie home directory (usually /java/qie).&lt;/p&gt;&lt;p&gt;Once the file is download, stop the service using &quot;#&amp;gt; sudo systemctl stop qie&quot;&lt;/p&gt;&lt;p&gt;After the service is stopped extract the qieLauncher.jar file by running &quot;#&amp;gt; unzip {downloaded QIE file} qieLauncher.jar. This step will replace the existing one in your qie home directory.&lt;/p&gt;&lt;p&gt;Now that it has been updated, start the service by running &quot;#&amp;gt; sudo systemctl start qie&quot;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3310/how-do-i-update-the-qielauncher-package?show=3311#a3311</guid>
<pubDate>Thu, 18 Sep 2025 17:35:56 +0000</pubDate>
</item>
<item>
<title>Answered: Where can I find information about the different FHIR structures?</title>
<link>https://www.qvera.com/kb/index.php/3308/where-can-find-information-about-different-fhir-structures?show=3309#a3309</link>
<description>Information about the different version of FHIR can be found:&lt;br /&gt;
DSTU2: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-dstu2/&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-dstu2/&lt;/a&gt;&lt;br /&gt;
DSTU3: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-dstu3/&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-dstu3/&lt;/a&gt;&lt;br /&gt;
R4: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/&lt;/a&gt;&lt;br /&gt;
R5: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r5/&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r5/&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3308/where-can-find-information-about-different-fhir-structures?show=3309#a3309</guid>
<pubDate>Fri, 05 Sep 2025 20:10:50 +0000</pubDate>
</item>
<item>
<title>Answered: Can I validate a FHIR resource when it is read into QIE</title>
<link>https://www.qvera.com/kb/index.php/3306/can-i-validate-a-fhir-resource-when-it-is-read-into-qie?show=3307#a3307</link>
<description>QIE uses the HAPI java libraries to help process FHIR resources. This means that the HAPI FHIR validator can be used as well. To get the validator object you will call:&lt;br /&gt;
hapi.context.getFhirValidator()&lt;br /&gt;
&lt;br /&gt;
Information on using the validator can be found at: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/validation/FhirValidator.html&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/validation/FhirValidator.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Information on the validation result object can be found at: &lt;a href=&quot;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/validation/ValidationResult.html&quot; rel=&quot;nofollow&quot;&gt;https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/validation/ValidationResult.html&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3306/can-i-validate-a-fhir-resource-when-it-is-read-into-qie?show=3307#a3307</guid>
<pubDate>Fri, 05 Sep 2025 20:05:31 +0000</pubDate>
</item>
<item>
<title>Answered: Where can I find information about converting FHIR from JSON to XML?</title>
<link>https://www.qvera.com/kb/index.php/3304/where-can-find-information-about-converting-fhir-from-json?show=3305#a3305</link>
<description>QIE has a standard function that will convert the FHIR resource from JSON to XML.&lt;br /&gt;
&lt;br /&gt;
qie.convertFHIRJSONtoXML() will complete this for you.&lt;br /&gt;
&lt;br /&gt;
Information about the specification can be found:&lt;br /&gt;
&lt;a href=&quot;http://hl7.org/fhir/json.html&quot; rel=&quot;nofollow&quot;&gt;http://hl7.org/fhir/json.html&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3304/where-can-find-information-about-converting-fhir-from-json?show=3305#a3305</guid>
<pubDate>Fri, 05 Sep 2025 19:05:30 +0000</pubDate>
</item>
<item>
<title>Answered: Where do I find information about a DICOM instance UID?</title>
<link>https://www.qvera.com/kb/index.php/3302/where-do-i-find-information-about-a-dicom-instance-uid?show=3303#a3303</link>
<description>The specification information is at:&lt;br /&gt;
&lt;a href=&quot;https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_B.2.html&quot; rel=&quot;nofollow&quot;&gt;https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_B.2.html&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3302/where-do-i-find-information-about-a-dicom-instance-uid?show=3303#a3303</guid>
<pubDate>Fri, 05 Sep 2025 18:59:44 +0000</pubDate>
</item>
<item>
<title>Answered: Does QIE have an official docker image?</title>
<link>https://www.qvera.com/kb/index.php/3300/does-qie-have-an-official-docker-image?show=3301#a3301</link>
<description>Yes, QIE has official images that have been published to both Docker and AWS. You can find them at:&lt;br /&gt;
&lt;a href=&quot;https://hub.docker.com/r/qvera/qie&quot; rel=&quot;nofollow&quot;&gt;https://hub.docker.com/r/qvera/qie&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
public.ecr.aws/qvera/qie</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3300/does-qie-have-an-official-docker-image?show=3301#a3301</guid>
<pubDate>Fri, 05 Sep 2025 18:56:13 +0000</pubDate>
</item>
<item>
<title>Answered: How do I configure my MSSQL Server to use ssl-encryption?</title>
<link>https://www.qvera.com/kb/index.php/3298/how-do-i-configure-my-mssql-server-to-use-ssl-encryption?show=3299#a3299</link>
<description>The documentation for setting up a MSSQL Server to use ssl-connections can be found on the Microsoft website at:&lt;br /&gt;
&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/connect/jdbc/using-ssl-encryption&quot; rel=&quot;nofollow&quot;&gt;https://docs.microsoft.com/en-us/sql/connect/jdbc/using-ssl-encryption&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
For information on setting the connection properties see:&lt;br /&gt;
&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/connect/jdbc/setting-the-connection-properties&quot; rel=&quot;nofollow&quot;&gt;https://docs.microsoft.com/en-us/sql/connect/jdbc/setting-the-connection-properties&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver&quot; rel=&quot;nofollow&quot;&gt;https://docs.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3298/how-do-i-configure-my-mssql-server-to-use-ssl-encryption?show=3299#a3299</guid>
<pubDate>Fri, 05 Sep 2025 18:49:20 +0000</pubDate>
</item>
<item>
<title>Answered: Where can I find information about the Apache Camel Options available in QIE</title>
<link>https://www.qvera.com/kb/index.php/3295/where-find-information-about-apache-camel-options-available?show=3296#a3296</link>
<description>Information about the latest available Apache Camel FTP options can be found at:&lt;br /&gt;
&lt;a href=&quot;https://camel.apache.org/components/latest/ftp-component.html&quot; rel=&quot;nofollow&quot;&gt;https://camel.apache.org/components/latest/ftp-component.html&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3295/where-find-information-about-apache-camel-options-available?show=3296#a3296</guid>
<pubDate>Tue, 02 Sep 2025 22:40:14 +0000</pubDate>
</item>
<item>
<title>Answered: What is the NDJSON Specification</title>
<link>https://www.qvera.com/kb/index.php/3293/what-is-the-ndjson-specification?show=3294#a3294</link>
<description>The NDJSON allows batch JSON messages to be sent. Each line of the file represents a single record, so this means that the file is using unformatted JSON.&lt;br /&gt;
&lt;br /&gt;
More information can be found at: &lt;a href=&quot;https://github.com/ndjson/ndjson-spec&quot; rel=&quot;nofollow&quot;&gt;https://github.com/ndjson/ndjson-spec&lt;/a&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3293/what-is-the-ndjson-specification?show=3294#a3294</guid>
<pubDate>Fri, 29 Aug 2025 18:46:23 +0000</pubDate>
</item>
<item>
<title>Answered: Does QVERA integration platform support NCPDP 2017071 standard?</title>
<link>https://www.qvera.com/kb/index.php/3291/qvera-integration-platform-support-ncpdp-2017071-standard?show=3292#a3292</link>
<description>Qvera does not have a built-in template or format for this; however, we can support it by building an XML message and setting the message to that specification. &lt;br /&gt;
&lt;br /&gt;
You can reach out to support to explore this and discuss.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3291/qvera-integration-platform-support-ncpdp-2017071-standard?show=3292#a3292</guid>
<pubDate>Mon, 25 Aug 2025 17:03:20 +0000</pubDate>
</item>
<item>
<title>Answered: Cannot call property escapeCsv in object [JavaPackage org.apache.commons.lang.StringEscapeUtils].</title>
<link>https://www.qvera.com/kb/index.php/3289/property-escapecsv-javapackage-commons-stringescapeutils?show=3290#a3290</link>
<description>&lt;p&gt;This is caused by libraries in QIE switching from the older Apache commons-lang&amp;nbsp;packages to the new commons-lang3 packages. This was necessary to ensure that the Apache libraries are kept up-to-date with the latest versions that do not have vulnerabilities.&lt;/p&gt;&lt;p&gt;However, the fix to this error is simple, but does required the channel to be updated.&amp;nbsp; We can fix the script by replacing all instances of &#039;Packages.org.apache.commons.lang.&#039; in the code with &#039;Packages.org.apache.commons.lang3.&#039;.&amp;nbsp; For example, to fix this script&lt;/p&gt;&lt;pre&gt;var csv = Packages.org.apache.commons.lang.StringEscapeUtils.escapeCsv(&#039;select * from patient&#039;);
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;we will replace it with this&lt;/p&gt;&lt;pre&gt;var csv = Packages.org.apache.commons.lang3.StringEscapeUtils.escapeCsv(&#039;select * from patient&#039;);&lt;/pre&gt;&lt;p&gt;Once the references to commons.lang&amp;nbsp;are replaced with commons.lang3&amp;nbsp;you will be able to save the channel and restart it.&amp;nbsp; The process should start working as designed.&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3289/property-escapecsv-javapackage-commons-stringescapeutils?show=3290#a3290</guid>
<pubDate>Mon, 18 Aug 2025 19:39:49 +0000</pubDate>
</item>
<item>
<title>Answered: What version of the mssql-jdbc_auth-{version} file do I need.</title>
<link>https://www.qvera.com/kb/index.php/3287/what-version-of-the-mssql-jdbc_auth-version-file-do-i-need?show=3288#a3288</link>
<description>&lt;p&gt;25.2 -&amp;nbsp;12.10.0:&amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://repo1.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc_auth/12.10.0.x64/&quot;&gt;https://repo1.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc_auth/12.10.0.x64/&lt;/a&gt;&lt;br&gt;24.3 - 12.8.1: &lt;a rel=&quot;nofollow&quot; href=&quot;https://repo1.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc_auth/12.8.1.x64/&quot;&gt;https://repo1.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc_auth/12.8.1.x64/&lt;/a&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3287/what-version-of-the-mssql-jdbc_auth-version-file-do-i-need?show=3288#a3288</guid>
<pubDate>Thu, 14 Aug 2025 15:57:44 +0000</pubDate>
</item>
<item>
<title>Answered: QIE Build 25.2.1.16482 requires MariaDB 10.4 or greater, or MySQL 8.0 or greater.</title>
<link>https://www.qvera.com/kb/index.php/3285/qie-build-25-16482-requires-mariadb-10-greater-mysql-greater?show=3286#a3286</link>
<description>QIE installer installed MariaDB 10.3 in the past. This is not compatible with Qvera version 25.2. These are the steps to update.&lt;br /&gt;
&lt;br /&gt;
1. Stop QIE service using the qie service manager.&lt;br /&gt;
2. Download MariaDB Server 10.11. &lt;br /&gt;
3. Install MariaDB Server and when prompted you want a new DB or upgrade. You need to choose to upgrade the existing install. Run the install from there. On the last screen you need to choose to run the upgrade wizard.&lt;br /&gt;
4. In the upgrade wizard you will check the QIEMariaDB and then run the upgrade.&lt;br /&gt;
5. Once the upgrade is complete go to the qie service manager. In the startup tab update the dialect to this: com.qvera.qie.persistence.MariaDB107UnicodeDialect&lt;br /&gt;
6. Start QIE and once you can login go to System Administration -&amp;gt; System Configuration. Under QIE Update Status click on check now and then production. It should show 25.2 is available. &lt;br /&gt;
7. Click on Download Now and wait for it to download. Once complete click on install now.&lt;br /&gt;
8. Once the upgrade is complete you will want to stop the service in the qie service manager. &lt;br /&gt;
9. Update the dialect to: com.qvera.qie.persistence.MariaDB1011UnicodeDialect&lt;br /&gt;
10. Apply the changes and then start the service.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3285/qie-build-25-16482-requires-mariadb-10-greater-mysql-greater?show=3286#a3286</guid>
<pubDate>Wed, 13 Aug 2025 15:51:02 +0000</pubDate>
</item>
<item>
<title>Answered: Security Cert expiry notifications</title>
<link>https://www.qvera.com/kb/index.php/3281/security-cert-expiry-notifications?show=3282#a3282</link>
<description>Unfortunately, the certificate expiration notifications are not user modifiable at this time. &amp;nbsp;Currently QIE sends notifications when the certificate is 90 days, 30 days, 10 days, or less than 5 days from expiration. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Note that only certificates that have been imported into the Certificates page within QIE will be included in the alerts.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3281/security-cert-expiry-notifications?show=3282#a3282</guid>
<pubDate>Tue, 12 Aug 2025 15:35:39 +0000</pubDate>
</item>
<item>
<title>Answered: How do you set up a database connection using windows authentication?</title>
<link>https://www.qvera.com/kb/index.php/828/how-you-database-connection-using-windows-authentication?show=3280#a3280</link>
<description>&lt;p&gt;You might see this error on startup when trying to use integratedSecurity:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;background-color:#f0eee6; color:#141413; font-family:styreneB,&amp;quot;styreneB Fallback&amp;quot;,ui-sans-serif,system-ui,-apple-system,&amp;quot;system-ui&amp;quot;,&amp;quot;Segoe UI&amp;quot;,Roboto,&amp;quot;Helvetica Neue&amp;quot;,Arial,&amp;quot;Noto Sans&amp;quot;,sans-serif,&amp;quot;Apple Color Emoji&amp;quot;,&amp;quot;Segoe UI Emoji&amp;quot;,&amp;quot;Segoe UI Symbol&amp;quot;,&amp;quot;Noto Color Emoji&amp;quot;; font-size:15px&quot;&gt;Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication. ClientConnectionId:3502a431-3771-478d-a418-034b75fe2136&lt;/span&gt;&lt;br&gt;&lt;br&gt;In a domain environment make sure to work with your Domain Administrator to ensure the following are properly configured:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Run the QIE service as a domain account&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;&lt;strong&gt;QIE Server Logged in with domain account:&amp;nbsp;&lt;/strong&gt;The machine might be on a workgroup instead of a domain. Make sure the Windows service or process running your app is logged on as a domain user that SQL Server can trust.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Join the Domain&lt;/strong&gt;: Ensure the machine running the QIE application is joined to the same Active Directory domain as the SQL Server.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Establish Trust&lt;/strong&gt;: If the machines are in different domains, an administrator must configure a trust relationship between the two domains. This allows credentials from one domain to be authenticated by the other.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Grant Permissions&lt;/strong&gt;: Once the trust is in place, the domain account you&#039;re using to run the QIE app must be granted appropriate permissions to the SQL Server database.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Check SQL Server Configuration:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Verify that:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SQL Server is configured to accept Windows Authentication&lt;/li&gt;&lt;li&gt;The SQL Server service is running under an appropriate domain account&lt;/li&gt;&lt;li&gt;Mixed mode authentication is enabled if you want to use&amp;nbsp;SQL auth and Windows auth&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/828/how-you-database-connection-using-windows-authentication?show=3280#a3280</guid>
<pubDate>Wed, 06 Aug 2025 21:28:43 +0000</pubDate>
</item>
<item>
<title>Answered: Forcing DICOM Association Release</title>
<link>https://www.qvera.com/kb/index.php/3277/forcing-dicom-association-release?show=3279#a3279</link>
<description>Currently there are no exposed or available methods to close an association between requests.&lt;br /&gt;
&lt;br /&gt;
I have added an enhancement request to add a checkbox to the DICOM connection configuration that would force a new association to be established with every request. &amp;nbsp;Would this satisfy the requirements of your scenario?</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3277/forcing-dicom-association-release?show=3279#a3279</guid>
<pubDate>Tue, 08 Jul 2025 17:21:19 +0000</pubDate>
</item>
<item>
<title>Answered: Json to HL7 mapping with array</title>
<link>https://www.qvera.com/kb/index.php/3275/json-to-hl7-mapping-with-array?show=3276#a3276</link>
<description>&lt;p&gt;You can loop through the JSON array and add the elements to your HL7 like this:&lt;/p&gt;&lt;p&gt;First we set up the HL7 message object:&lt;/p&gt;&lt;pre&gt;message = qie.createHL7Message();&lt;/pre&gt;&lt;p&gt;Then we loop through the AIG array, adding each element to the HL7 (in the example below, I&#039;ve only added the &quot;setId&quot; element, but you can extrapolate how to add additional fields)&lt;/p&gt;&lt;pre&gt;for (var i = 1; i &amp;lt;= source.getCount(&#039;/AIG/[]&#039;); i++) {
   message.addChild(&#039;/&#039;, &#039;AIG&#039;, &#039;AIG|&#039;, i);
   message.setNode(&#039;AIG-1&#039;, source.getNode(&#039;/AIG/[&#039; + i + &#039;]/setId&#039;), i);
}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3275/json-to-hl7-mapping-with-array?show=3276#a3276</guid>
<pubDate>Mon, 30 Jun 2025 13:05:15 +0000</pubDate>
</item>
<item>
<title>Answered: Can a NTE immediately follow a ORC in HL7? If not, how do I remove it?</title>
<link>https://www.qvera.com/kb/index.php/3273/can-a-nte-immediately-follow-orc-in-hl7-if-not-how-do-remove-it?show=3274#a3274</link>
<description>&lt;p&gt;Yes a NTE is valid after A ORC segment. However some systems do not accept it. You can use the following mapping that uses a regex to remove them.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;var nteRemoved = (message.getNode(&quot;/&quot;) + &#039;&#039;).replace(/(ORC.*\r)(NTE.*\r)+(OBR.*)/gm,&#039;$1$3&#039;);&lt;/p&gt;&lt;p&gt;message.setNode(&#039;/&#039;, nteRemoved);&lt;/p&gt;&lt;/blockquote&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3273/can-a-nte-immediately-follow-orc-in-hl7-if-not-how-do-remove-it?show=3274#a3274</guid>
<pubDate>Tue, 17 Jun 2025 17:10:36 +0000</pubDate>
</item>
<item>
<title>Answered: What are parameter maps and how do I use them.</title>
<link>https://www.qvera.com/kb/index.php/1416/what-are-parameter-maps-and-how-do-i-use-them?show=3266#a3266</link>
<description>&lt;p&gt;ParameterMaps, channelCache, and messageCache in QIE are all key-value variables that let you store and retrieve data using a unique key name. The main difference between them is scope and syntax. channelCache stores values shared across the entire channel and is accessible throughout the interface; messageCache stores data specific values for a single message as it moves through the channel; and parameterMaps typically hold named key-value values within a given script or step. While channelCache and messageCache use function-style access like getValue(key) and setValue(key, value), parameterMaps use Java-style methods such as get(key) and put(key, value). Despite the differences in how they&#039;re accessed, all three are used to temporarily manage data in the form of key-value pairs during interface execution.&lt;/p&gt;&lt;p&gt;For a list a parameterMap Methods see Java Docs HashMap methods:&amp;nbsp;&lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html?utm_source=chatgpt.com&quot; rel=&quot;nofollow&quot;&gt;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html?utm_source=chatgpt.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here is a table listing the popular&amp;nbsp;HashMap (parameterMap) methods along with the QIE channelCache and messageCache functions.&lt;/p&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; style=&quot;width:500px; text-align: left; border-spacing: 5px;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Operation&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;&lt;strong&gt;parameterMaps&lt;/strong&gt; (Methods)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;channelCache &amp;amp; messageCache (Functions)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Check if key exists&lt;/td&gt;&lt;td&gt;map.containsKey(&quot;key&quot;)&lt;/td&gt;&lt;td&gt;channelCache.checkValueExists(&quot;key&quot;)&lt;br&gt;messageCache.checkValueExists(&quot;key&quot;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get value&lt;/td&gt;&lt;td&gt;map.get(&quot;key&quot;)&lt;/td&gt;&lt;td&gt;channelCache.getValue(&quot;key&quot;)&lt;br&gt;messageCache.getValue(&quot;key&quot;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Set value&lt;/td&gt;&lt;td&gt;map.put(&quot;key&quot;, &quot;value&quot;)&lt;/td&gt;&lt;td&gt;channelCache.setValue(&quot;key&quot;, &quot;value&quot;)&lt;br&gt;messageCache.setValue(&quot;key&quot;, &quot;value&quot;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Remove value&lt;/td&gt;&lt;td&gt;map.remove(&quot;key&quot;)&lt;/td&gt;&lt;td&gt;channelCache.removeValue(&quot;key&quot;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get as boolean&lt;/td&gt;&lt;td&gt;(Use cast or comparison logic)&lt;/td&gt;&lt;td&gt;channelCache.getBoolean(&quot;key&quot;, defaultValue)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get as number&lt;/td&gt;&lt;td&gt;Number(map.get(&quot;key&quot;))&lt;/td&gt;&lt;td&gt;channelCache.getNumber(&quot;key&quot;, defaultValue)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get as date&lt;/td&gt;&lt;td&gt;Use map.get then parse with QIE date functions&lt;/td&gt;&lt;td&gt;channelCache.getDate(&quot;key&quot;, defaultValue)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Iterate over keys&lt;/td&gt;&lt;td&gt;map.keySet().toArray()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get size&lt;/td&gt;&lt;td&gt;map.size()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Clear all entries&lt;/td&gt;&lt;td&gt;map.clear()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Contains a Key&lt;/td&gt;&lt;td&gt;map.containsKey(Object key)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Contains a Value&lt;/td&gt;&lt;td&gt;map.containsValue(Object value)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Remove All entries&lt;/td&gt;&lt;td&gt;map.clear()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returns all key entries&lt;/td&gt;&lt;td&gt;map.keySet()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returns all Value entries&lt;/td&gt;&lt;td&gt;map.valueSet()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returns all keys and entries&lt;/td&gt;&lt;td&gt;map.entrySet()&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/1416/what-are-parameter-maps-and-how-do-i-use-them?show=3266#a3266</guid>
<pubDate>Thu, 12 Jun 2025 15:30:02 +0000</pubDate>
</item>
<item>
<title>Answered: Global way to handle Error Management Alert Handler Script</title>
<link>https://www.qvera.com/kb/index.php/3264/global-way-to-handle-error-management-alert-handler-script?show=3265#a3265</link>
<description>&lt;p&gt;In the &quot;System Configuration&quot; under the &quot;Advanced Settings&quot; There is a checkbox for &quot;Error Management Alert Handler Script&quot;.&lt;/p&gt;&lt;p&gt;This script will change how all error emails are handled.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://www.qvera.com/kb/?qa=blob&amp;amp;qa_blobid=14615051694822425240&quot; style=&quot;height:814px; width:559px&quot;&gt;&lt;/p&gt;&lt;p&gt;Here is an example of a sample script:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;function createModifiedErrorBody (emailOrigin, alertEmail, newError) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;var parameterMap = qie.newParameterMap();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;newError = StringUtils.replace(newError, &#039;\r\n&#039;, &#039;\r&#039;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;newError = StringUtils.replace(newError, &#039;\r&#039;, &#039;&amp;lt;br/&amp;gt;&#039;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;newError&#039;, newError);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;zone&#039;, java.lang.String(emailOrigin.zoneName));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;channel&#039;, java.lang.String(emailOrigin.channelName));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;messageId&#039;, java.lang.String(emailOrigin.sourceId));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;errorCount&#039;, java.lang.String(emailOrigin.errorCount));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;threadName&#039;, java.lang.String(emailOrigin.threadName));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;parameterMap.put(&#039;date&#039;, qie.formatDate(&#039;EEE, d MMM yyyy HH:mm:ss z&#039;, alertEmail.date));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;return qie.evaluateTemplate(qie.getVariable(&#039;errorTemplate&#039;), parameterMap, &#039;xml&#039;);&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;//todo - implement alert email handling here&lt;/p&gt;&lt;p&gt;//qie.sendEmail(&#039;sampleFakeZZZ@NotRealEmailZZZ.com&#039;, &#039;testing&#039;, &#039;zone: &#039; + emailOrigin.zoneName + &#039; channel: &#039; + emailOrigin.channelName + &#039; body: &#039; + alertEmail.htmlBody + &#039;excetpion: &#039; + exceptionMessage);&lt;/p&gt;&lt;p&gt;if (StringUtils.equalsIgnoreCase(emailOrigin.zoneName, &#039;Default&#039;) &amp;amp;&amp;amp; StringUtils.equalsIgnoreCase(emailOrigin.channelName, &#039;Error Channel1&#039;)) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;try{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (StringUtils.startsWithIgnoreCase(exceptionMessage, &#039;ack error:&#039;)) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exceptionMessage = StringUtils.trim(StringUtils.substringAfter(exceptionMessage, &#039;ack Error:&#039;));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; var errorHl7 = qie.parseHL7String(exceptionMessage);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; errorHl7.removeFirstNode(&#039;ERR&#039;);&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; sendOriginalEmail = false;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; var emailBody = createModifiedErrorBody (emailOrigin, alertEmail, errorHl7.getNode(&#039;/&#039;));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; qie.sendEmail(alertEmail.to, alertEmail.subject, emailBody);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // var emailAttachments = qie.newEmailAttachmentMap();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // qie.addEmailAttachment(emailAttachments, &#039;bodyHtml&#039;, alertEmail.htmlBody);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // qie.sendEmail(&#039;sampleFakeZZZ@NotRealEmailZZZ.com&#039;, &#039;new error&#039;, errorHl7, emailAttachments);&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;} catch (e) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; qie.sendEmail(&#039;sampleFakeZZZ@NotRealEmailZZZ.com&#039;, &#039;error&#039;, e);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;} else {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;sendOriginalEmail = true;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;//To send the original email after this script executes set sendOriginalEmail to true:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;//To discard the original email set it to false:&lt;/p&gt;&lt;p&gt;// sendOriginalEmail = false;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;//qie.sendEmail(&#039;sampleFakeZZZ@NotRealEmailZZZ.com&#039;, &#039;testing&#039;, &#039;this is a test&#039;);&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;//NOTE: If this script throws an exception the original email will be sent and a new&lt;/p&gt;&lt;p&gt;//&amp;nbsp; &amp;nbsp; &amp;nbsp; email will be created and sent to administrators with the script exception.&lt;/p&gt;&lt;/blockquote&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3264/global-way-to-handle-error-management-alert-handler-script?show=3265#a3265</guid>
<pubDate>Wed, 28 May 2025 21:01:09 +0000</pubDate>
</item>
<item>
<title>Answered: Can Qvera connect using Microsoft SQL using Manged Idenity (Passwordless login)</title>
<link>https://www.qvera.com/kb/index.php/3262/qvera-connect-using-microsoft-manged-idenity-passwordless?show=3263#a3263</link>
<description>&lt;p&gt;QIE does support connecting to a Azure SQL db that is setup using Managed Identity for authentication.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This is how you connect to a DB in the Database Connection:&lt;/p&gt;&lt;p&gt;1. Select the Microsoft SQL Server as the Driver&lt;br&gt;2. Enter the Client ID from the managed Identity in the Username field&lt;br&gt;3. Check the &quot;Manullay set the Connection URL&quot; box&lt;br&gt;4. Use the following template for the connection URL:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-size:12px&quot;&gt;jdbc:sqlserver://{sqlServerName}.database.windows.net;databaseName={dbName};encrypt=false;;Authentication=ActiveDirectoryManagedIdentity&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is the setup for using the managed identity as the QIE Database (Requires version 25.2 or higher):&lt;/p&gt;&lt;p&gt;1. Update the qie service manager or qie.service with the following java options. Note: spaces have been added for page formatting. These need to be removed when pasted into qie.service or start.sh:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-size:12px&quot;&gt;-Dconnection.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver \&lt;br&gt;-Dconnection.url=jdbc:sqlserver://&lt;strong&gt;{serverName}&lt;/strong&gt;.database.windows.net:1433; databaseName&lt;strong&gt;{dbName}&lt;/strong&gt;;Authentication=ActiveDirectoryManagedIdentity; encrypt=true;trustServerCertificate=true; \&lt;br&gt;-Dhibernate.dialect=com.qvera.qie.persistence.SQLServer2022UnicodeDialect \&lt;br&gt;-Dconnection.username=&lt;strong&gt;{clientIdFromManagedIdentity}&lt;/strong&gt;&amp;nbsp;\&lt;br&gt;-Dconnection.ignorePassword=true \&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3262/qvera-connect-using-microsoft-manged-idenity-passwordless?show=3263#a3263</guid>
<pubDate>Thu, 15 May 2025 20:38:45 +0000</pubDate>
</item>
<item>
<title>Answered: Getting an error when using a String variable for the public key qie.pgpEncryptBytesNoSig</title>
<link>https://www.qvera.com/kb/index.php/3260/getting-error-string-variable-public-pgpencryptbytesnosig?show=3261#a3261</link>
<description>&lt;p&gt;Using qie.getVariable() returns an object, rather than the String that qie.pgpEncryptBytesNoSig() is expecting.&amp;nbsp; Try using this instead:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color:#444444; font-family:Arial,&amp;quot;Liberation Sans&amp;quot;,&amp;quot;DejaVu Sans&amp;quot;,sans-serif; font-size:14px&quot;&gt;var PGPTrilliumPublic = qie.getVariable(&#039;PGPTrilliumPublic&#039;)&lt;strong&gt;.getBytes();&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3260/getting-error-string-variable-public-pgpencryptbytesnosig?show=3261#a3261</guid>
<pubDate>Thu, 08 May 2025 20:44:52 +0000</pubDate>
</item>
<item>
<title>Answered: Find all instances of a node reference in a channel</title>
<link>https://www.qvera.com/kb/index.php/3257/find-all-instances-of-a-node-reference-in-a-channel?show=3258#a3258</link>
<description>Control+Shift+F (Global Search) within QIE and then type: &amp;nbsp;1-7.1 (specifying the specific zone by name) . &amp;nbsp;That search will point out all nodes that reference that node path.</description>
<guid isPermaLink="true">https://www.qvera.com/kb/index.php/3257/find-all-instances-of-a-node-reference-in-a-channel?show=3258#a3258</guid>
<pubDate>Sat, 19 Apr 2025 15:37:52 +0000</pubDate>
</item>
</channel>
</rss>