Written by

Barts Health NHS Trust
Question Mary George · Jul 7, 2022

Dynamically change output file name for a schedule task

Is there any way to dynamically generate the output filename for a schedule task?  For example when running a legacy code task every hour , is there anyway to specify the output file name to be appended with time stamp or some incrementing number to avoid overwriting ? 

Product version: IRIS 2021.1

Comments

Justin Owens · Jul 8, 2022

I'm not sure about doing it through the task menu.  I would create a custom class that extends %SYS.Task.Definition and then overwrite the OnTask method with whatever custom code you want to run. For example, if you wanted to export your Business Partners to a daily file for some reason.  You could use the method below to always pull the current date.  Once you have the new class built it will be selectable in the Task Type drop down.

Method OnTask() As%Status
    {
        set tCurDate = $ZDATE($H,8)
        do##class(Ens.Config.BusinessParnter).%ExportAll("C:\TEST\"_tCurDate_"BusinessParnters.xml")
        Quit$$$OK
    }
0
Alex Woodhead · Jul 11, 2022

Interesting challenge as these are not overrideable properites of the Task Definition.

However you can hijack the device to output somewhere else.

Here is an example dynamically adding a datetime suffix to the logfile for a built-in System Task.

So if you enable Logging to "c:\temp\T" (WIndows example) on this task and selected OutputFileSuffix property "[YY]YY-MM-DD" then your Task output is actually directed to new file "c:\temp\T20220711_153600".

/// Seems to need %SYS.Task.Definition in super list to be/// visible in Task Schedule WizardClass Test.SuperRunLegacyTask Extends (%SYS.Task.RunLegacyTask, %SYS.Task.Definition)
{

/// Example flexible property to enable selecting a given Date and Time format /// from the Schedule Wizard, to use as Suffix appended to log file name (When in use)Property OutputFileSuffix As%String(DISPLAYLIST = ",MM/DD/[YY]YY,DD Mmm [YY]YY,[YY]YY-MM-DD,DD/MM/[YY]YY", VALUELIST = ",1,2,3,4") [ InitialExpression = 3 ];

Method OnTask() As%Status
{
	set current=$IOset useDev=0// Checks has at least 2 path seperators// Checks not a null deviceif$L($TR(current,"\/"))<($L(current)-1),$L(current,":")<2 {
		set dev=current_$TR($ZDT($ZTS,..OutputFileSuffix),", :/()-","__")
		Open dev:"NWS":2if$Tset useDev=1
	}
	if useDev {
		use dev do {
			set tSC=##super()
			close dev	
		} while0
	} else {
		set tSC=##super()
	}
	quit tSC
}

}
0
Mary George · Jul 13, 2022

Thank you @Justin Owens  and @Alex Woodhead .  I managed to combine both your ideas and managed to create a custom task to get the system dashboard information written to a file every hour without the file getting overwritten. 

0