Hi.

Try use this command from console (Powershell, console Linux, etc..) for Intersytems Ensemble

ccontrol.exe force HEALTHSHARE

HEALTHSHARE is the name of your instance

This command should be executed in bin folder (ex. c:\Intersystems\Healthshare\bin)

For IRIS the command is

iris.exe forece IRISHealth

IRISHealth is the name of your instance, it is in the folder bin (ex. c:\Intersystems\IRISHealth\bin)

Best regards
Francisco Lopez

This is the transformation code (if you want). In my example, I was transforming OUL^R22 to OUL^R22

Class Kurro.DTL.test Extends Ens.DataTransformDTL [ DependsOn = EnsLib.HL7.Message ]
{

Parameter IGNOREMISSINGSOURCE = 1;

Parameter REPORTERRORS = 1;

Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;

XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.HL7.Message' targetClass='EnsLib.HL7.Message' sourceDocType='2.7:OUL_R22' targetDocType='2.7:OUL_R22' create='new' language='objectscript' >
<assign value='source.{PIDgrp.PID}' property='target.{PIDgrp.PID}' action='set' />
<if condition='..Length(source.{PIDgrp.PID:11(1).8})&gt;0' >
<true>
<assign value='source.{PIDgrp.PID:11(1).1}_" "_source.{PIDgrp.PID:11(1).2}' property='target.{PIDgrp.PID:11(1).1}' action='set' />
<assign value='source.{PIDgrp.PID:11(1).8}' property='target.{PIDgrp.PID:11(1).2}' action='set' />
<assign value='""' property='target.{PIDgrp.PID:11(1).8}' action='set' />
</true>
<false>
<assign value='""' property='target.{PIDgrp.PID:11(1).8}' action='set' />
</false>
</if>
</transform>
}

}

Regards,

Kurro Lopez

Hi,

if you read your requirements, that is that you have to write in your DTL

The first line copy all your PID in the new destination (green box)

the condition, check if the 11(1).8 has value, in this case, concatenate PID:11(1).1_PID:11(1).2 to new PID:11(1).1

I understand, when you say "move 11(1).8 to 11(1).2 means that the value in 11(1).8 will be empty (red box), if it is not the case, don't use this line.

For other case (step 7). remove the value of the PID:11(1).8

The DTL conditions are executed in order, It means, that the value in PID:11(1).2 in step 3 is the original then it is replaced by PID:11(1).8 in the following step.

This is the test result:

I hope it helps you,

Regards,

Kurro Lopez

Hi Kurt,

Check if you are using ODBC 32 or 64 bits. Maybe there are two applications (one for each configuration) and not all ODBC connection are displayed.

I'm using ODBC 64 bits and my connections are availables

Also, check if your ADO .Net driver is for 32 or 64 bits compatible.

I hope it is help for you,

Regards,
Kurro

Hi Tim,

I know that is a old question, and I don't know if you have resolved your problem.

I have something like you are asking in a process. Maybe it could help you.

I created a persistent class with theses properties, also add a Query to retrieve info from a ProcessId:

Class FtpFileReport Extends %Persistent
{

/// ProcessId
Property ProcessId As %String;

/// Filename
Property FileName As %String;

/// Retrieve records of a ProcessId
Query GetRecordsByProcessId(pProcessId As %String) As %SQLQuery
{
    SELECT ProcessId, FileName
    FROM FtpFileReport
    WHERE ProcessId = :pProcessId
}

}

Then, when my process start to grabs the file, create a ProcessId, for example, using a combination of horolog and cryptotoken, to create an unique Id.

set pProcessId = "ID"_$PIECE($HOROLOG,",")_$PIECE($HOROLOG,",",*)_$SYSTEM.Encryption.GenCryptToken()

For each file grabbed, you save a record in your persistent class

set obj=##class(FtpFileReport).%New()

set obj.ProcessId = pProcessId    ;pProcessId is the variable with the Id created previously

set obj.FileName =  pFileName   ;if you are using retrieveFile method, it is the name the file that is grabbing

do obj.%Save()

Afterward, create a message to a BO that send the email with the ID of the process and create the message body based on ProcessId files:

Class SendEmail Extends Ens.BusinessOperation
{

Parameter ADAPTER = "EnsLib.EMail.OutboundAdapter";

Parameter INVOCATION = "Queue";

/// Send email of FTP Report
Method SendFtpReport(pRequest As Ens.StringRequest, Output pResponse As Ens.StringResponse) As %Status
{
    #dim myList As %Library.ListOfObjects

    set report  = ##class(FtpFileReport).%New()
    set myList = ##class(%Library.ListOfObjects).%New()
    set resultset = report.GetRecordsByProcessId(pRequest.StringValue)
    set data = ##class(%Stream.GlobalCharacter).%New()
    while resultset.%Next()
    {
        set fileNum = $Increment(fileNum)
        do data.Write("<b>"_fileNum_":</b><p>"_resultset.%Get("FileName")_"</p><hr>")
        do myList.Insert(data)
    }

    set msg = ##class(%Net.MailMessage).%New()
    set msg.IsHTML = 1
    do msg.TextData.WriteLine("<h1>FileReport</h1><br><h2>This is the FTP report: <h2><br><br>")    ; This is the body of the email

    for pos=1:1:myList.Size
    {
        do msg.TextData.Write(myList.GetAt(pos).Read())
    }

    set msg.To = ##class(%Library.ListOfObjects).%New()  ;Destinations address
    do msg.To.Insert("destination@mydomain.com")
    set msg.Subject= "File report"
    do ..Adapter.SendMail(msg)

    set pResponse = ##Class(Ens.StringResponse).%New("Ok")
    quit $$$OK
}

XData MessageMap
{
<MapItems>
  <MapItem MessageType="Ens.StringRequest">
    <Method>SendFtpReport</Method>
  </MapItem>

</MapItems>
}

}

I hope helps you.

Regards,
Francisco Lopez

Indeed.

The parameter 3 in $ZDATE and $ZDATEH is the format of the date YYYY-MM-DD ODBC format

$HOROLOG retrieves the system datetime, so $ZDATE($HOROLOG,3) gives the current sytem date

Usually, HL7.{PID.7} uses the format YYYY-MM-DD, so it converts the string into a datetime variable ($ZDATEH(dob,3))

Please, find out the info in $ZDATE and $ZDATEH documentation.

Best regards,
Francisco Lopez

P.S. Don't forget mark the answer as accepted wink

I've found the solution.

ClassMethod CreateTask() As %Status
{
    Set task=##class(%SYS.Task).%New()
    Set task.Name = "Check laboratory process"
    Set task.NameSpace=$Namespace
    Set task.TimePeriod=0 // Daily
    Set task.TimePeriodEvery=1 // Every 1 day
    Set task.DailyFrequency=0 // Run once
    Set taskdef = ##class(MyTasks.LabsTask).%New()
    Do task.AssignSettings(taskdef)
    Set task.TaskClass=$classname(taskdef)
    Set task.Settings=$lb("Laboratory","LABS1")
    
    Set st = task.%Save()
    Return:$$$ISERR(st) st
    Return ##class(%SYS.Task).RunNow(task.%Id())
}