Did you select EnsLib.HL7.Service.SOAPService as your service's class? If yes, then I know the following XML format works:

<?xml version="1.0" encoding="UTF-8" ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>

      <SOAP-ENV:Body>

            <Send xmlns="http://tempuri.org">

                  <Input>

                        <![CDATA[MSH|^~\&|... rest of hl7 message here, with <CR><LF> at end

]]>

                  </Input>

            </Send>

      </SOAP-ENV:Body>

</SOAP-ENV:Envelope>

I'm assuming you don't have "Act on Validation Error" enabled in the router's settings  ... in which case the message will be set to Completed status even though it failed validation.

If you enable "Act on Validation Error" its status will be set to Error; you'll then be able to select for that status in the Message Viewer and resend. Note that with this setting enabled, you may want to set "Reply Code Actions" to do something other than the default, such as sending the messages to the Suspended Messages facility.

Another option would be to specify a Bad Message Handler; this forwards failed validations to a business host where other actions can be taken such as alerting or logging to a file. You'll also have the option of resubmitting those messages to their original destination by specifying a new target in the Message Viewer's Resend facility.

 

Looking at the docs, %OpenId() accepts a  concurrency argument. 0 is "no lock," but when using it on a mirror backup I get:

ERROR #939: Insufficient privilege for object access 'EnsLib.HL7.Message::%Open'

Not sure what privilege I can be granted to allow it as I'm running it with the %All role ... but I get the feeling I'm barking up the wrong tree.

Thanks Vic for the confirmation and explanation.

What I still can't figure out, though, is why a lock is needed to read a message body from the database and write it to flat file. Practically speaking I don't need the lock ... the message has almost reached its sell-by date and will be purged from the database within the week. It's never going to be modified again.

A DR Async/Reporting member is a possibility, but not for the near term ...

1. Sure, this will work find for just passing a file through to the target system.

2. Yes. You can use public/private key authentication as well.

3. Do you really want to put the files into the root directory? Normally, a FTP/SFTP server will default to the "home" directory for the account your operation logs in under. If you don't specify a path, that's where the data you're transferring will end up. If the account has its home directory set to the root directory and has permission to write there, your files will end up there.

4. You'll need to set the SSL configuration to the special value "!SFTP". There's no profile for it; it's just an indicator for the operation that you'll be using the SFTP protocol.

Hi Leon,

You're actually looking to create a batch, with a batch header for your file output.

To do this you'll need to define a batch class in your RecordMap, and in that class define your header (I'm assuming it's a fixed header, like field names).

You'll then want to use EnsLib.RecordMap.Operation.BatchFileOperation (or BatchFTPOperation) to deliver the batches. There are a few ways to trigger the batch rollover; a schedule, a record limit, or a Batch Rollover Request depending on your needs.

Hi Robert,

You can actually export the entire production in a single go through the Export button found in the Actions tab of the Production Settings. You would then use the "Manage / Deployment Changes" page on the target system to deploy the entire production to the destination namespace.

Other options include: Select "Files of type: DTL Document (*.dtl)" in Studio's Export option under the Tools menu (click "Add"), and select the entire list with shift-click (and similarly import through Studio), or use the ObjectScript class method  $System.OBJ.Export("*.dtl","/path/to/exportfile.xml") and corresponding import method $system.OBJ.Load("/path/to/importfile.xml") in the target environment.

The class methods work locally on your HealthConnect servers; if they're physically distinct hosts you'll need to copy the export file to the target server. Also you would run the export/load utilities in the namespace in which your production is located, of course ...

Ah, now it makes sense. The Document type you'd specified for the inbound message did not match the structure of the message itself, so the RemoveSegmentAt() method didn't know how to "find" the EVN segment ... it didn't exist in that schema.

The recommended approach would be to use a schema/document type (custom if necessary) that matches the structure of your inbound message, making the segment to be removed optional in the definition. With that in place, the RemoveSegmentAt() method would have worked as expected.

I've cobbled together a little TamperMonkey/GreaseMonkey script that diddles with the style sheet without having to make unsupported changes to your installation's configuration. Adust the devattr, qaattr and prdattr variables to suit your color tastes, and the match arguments for the hostnames to identify your servers.

// ==UserScript==

// @name         Management Console Banner

// @namespace    http://tampermonkey.net/

// @version      0.2

// @description  Seems to work for both Chrome and Firefox

// @author       Jeff Drumm, HICG LLC

// @include      *://*/csp/sys*

// @include      *://*/csp/healthshare*

// @grant        none

// ==/UserScript==

function addGlobalStyle(css) {

    var head, style;

  head = document.getElementsByTagName('head')[0];

    if (!head) { return; }

  style = document.createElement('style');

  style.type = 'text/css';

  style.innerHTML = css;

  head.appendChild(style);

}

var devattr = 'color-stop(0.0,rgb(95, 246, 18)), color-stop(0.5,rgb(20, 204, 51)), color-stop(1.0,rgb(232, 227, 226))'

var qaattr = 'color-stop(0.0,rgb(248, 252, 10)), color-stop(0.5,rgb(204, 199, 20)), color-stop(1.0,rgb(232, 227, 226))'

var prdattr = 'color-stop(0.0,rgb(255, 2, 49)), color-stop(0.5,rgb(204, 18, 18)), color-stop(1.0,rgb(232, 227, 226))'

var curattr = ''

if (window.location.hostname.match('^ensprod.*')) {

    curattr = prdattr;

} else if (window.location.hostname.match('^ensqa.*')) {

    curattr = qaattr;

} else {

    curattr = devattr;

}

addGlobalStyle('.portalTitle { background: -webkit-gradient(linear, left top, left bottom, ' + curattr + ') !important; } ');