Thank you Alex.

I just ran a HL7 Message with bad characters. But i do not see string "BAD" in the message which is sent to the HL7 Router.

I am looking for the Built map status, but it says nothing. But when i open the contents it gives an error.

If i can detect in some way that the sent message could not parse, then i can shutdown the service.

Hello Alex,

Sorry for late response.

I see this approach is very interesting. So in the router, i am checking if it is a bad message. If yes, then i shutdown the service. Right?

Sounds very applicable. I will try and see. Just a question. When the router receives the message, if it is bad, the rawcontent has "BAD" in it?

Thanks,

Jimmy Christian.

I have found another way around. Not perfect but can solve the problem i am having for the Settings valuesmiley

So i am thinking to use the Comment section of the Config Item. Then using the below function i can grab the value of it in my Standard Rule Class. Also i can change the value during downtime. Tested it and its working. If i dont find a way to create a CUSTOM Settings, i can use the "Comment" settings. !!

ClassMethod ShowComment(ConfigItem As %String) As %String
{
Set tSC=$$$OK Try{
    
     &sql(SELECT Comment INTO :tComment FROM Ens_Config.Item WHERE Name = :ConfigItem)
        If (SQLCODE = 0)
         {
Set tSC=$$$OK   
}
  } Catch(ex){
Set tSC = ex.AsStatus()
$$$LOGERROR("Error in function ShowComment: "_tStatus)  }
 tComment
}

Hey Craig,

Thanks for your response. Yes, that is a good alternate . I had initially thought about it but the only reason i am not planning to use a table is to avoid extra step to import this updated table in the prod environment. We cannot just make direct changes to the table because of some source control reasons also. So having a setting in the router which i can use just to flip it from 0 to 1 or vice versa would be very handy .

Thank you Craig.

My mistake. I think i did not explain correctly.

So i want a setting in my HL7 Router something like below. I included it in my rule definition, but the SETTING is not showing in the Router in the management portal. Once i can have the SETTINGS  available in my Router, i can access its value. Let me know.

Property RouteToDowntimeRouter As %Boolean;

Parameter SETTINGS = "RouteToDowntimeRouter";
 

Thank you Andy.

I am but not able to add a PARAMETER "RouteToDowntimeRouter
to my standard RULE Definition class. Once set i want to access it when the message goes through. Is there a way to add it in standard definition as below?

Class XYZRules Extends Ens.Rule.Definition CompileAfter CUSTOM.Util.Rules.FunctionSet ]
{ Parameter RuleAssistClass = "EnsLib.HL7.MsgRouter.RuleAssist"; XData RuleDefinition [ XMLNamespace "http://www.intersystems.com/rule]
{

Parameter SETTINGS = "RouteToDowntimeRouter";
Property  RouteToDowntimeRouter as %Boolean;


<ruleDefinition alias="" context="EnsLib.HL7.MsgRouter.RoutingEngine" production="HL7Production">
<ruleSet name="" effectiveBegin="" effectiveEnd="">
<rule name="Discard" disabled="false">
<when condition="ProcessMessage=0">
<return></return>
</when>
</rule>.

.

.

.

Hello Pankaja,

Seems like for now custom code is the only option. I was not able to find any out of the box functionality for writing the counts of the total transactions without a custom code.

Here are few strategies for custom code i looked into.

1) In the File Operation , write the messages to a "Temp" File. At a certain time through a task or some other logic read from the temp file and collect all details you need and then write to another File.

2) I yet have to explore this option. At a point in time when you want your file, read from the Enslib.Hl7.Msg and create a file per your needs.

3) Write the live messages to a temp database. Generate necessary file from it when needed. Delete the messages from the DB and copy it to a Archive DB if needed.

4) As live messages are coming write to a Global and then run a task to create messages from the Globals.

Thanks,

Jimmy Christian.

Thank you Marc for the detailed information.

I earlier tried the approach using the Record Mapper but it did not seam feasible in this scenario. 

So i have done is 

Created a CUSTOM operation class which extends Ens.BusinessOperation, EnsLib.HL7.Operation.Standard

It uses the file adapter.

Then I overided the oninit and outputDocument method.

  1. The file adapter creates HL7 file as usual
  2. I created a new method which calls the override outputDocument method and passes the filename . Then I do a count of segments and create another file into which I copy all the necessary information and delete the file which was originaly created .
  3. Above method is called in oninit, so it is triggered on schedule whenever the operation starts. First I check if a file exists, if it does and is not the current file then I call this new method.