Summary
Job Variables allow you to define changeable values that can be used throughout your jobs. While a job is executing, you can easily create and modify variables from within scripts. However, any changes made using the simple approach only affect the job in which the changes are made; other jobs are not affected.
In some cases you may want to programmatically make changes to variables and have those changes affect all jobs. For example, you may have variables that are used by several jobs in your nightly processing cycle, and you need to update these variables at the beginning of the cycle, setting the values based on the current date.
This article explains how to use the adTempus API to make the changes.
Note
Beginning with version 4, the Job Variable Update Task or Job Variable Update Action can be used to update variables.
Procedure
You will first create a Script Library that contains supporting code.You will then create a job that runs the script code to set the values.
Create the Script Library
1. In the adTempus Console, expand the Scripts folder, then right-click Script Libraries and choose New Script Library....
2. In the Script Library Properties window:
a. Name the library "SetVariables"
b. Select "VB.NET" for the Language
c. Erase the default script code and paste in the following code:
Imports System.Collections.Generic Imports ArcanaDevelopment.adTempus.Client 'This code can be called from adTempus scripts to create or modify Job Variables for a Job Group. 'From your script, reference the SetVariables library, and then call the SetGroupVariable methods to 'set the variables. See www.arcanadev.com/support/kb/K00000379.aspx for more information. Public Module SetVariables 'Sets a JobVariable for the specified group. 'This method will update the variable if it already exists, or create a new variable if it does not. 'Important: The job that calls this script must be running under the account of a user who has permission to update the target group. 'the groupName should be the fully-qualified name of the group. For example: ' "" or "\" for the root group ' "GroupLevel1" for a top-level group ' "GroupLevel1\GroupLevel2" for a second-level group Public Sub SetGroupVariable(ByVal groupName As String, ByVal variableName As String, ByVal variableValue As String) Dim session As Scheduler Dim variable As JobVariable Dim group As JobGroup 'create a new session to the local adTempus instance session = CreateSession() group = FindGroup(session, groupName) If group Is Nothing Then 'the group does not exist Throw New System.Exception("The requested group could not be found") End If 'get the existing variable with the specified variableName, if there is one variable = FindVariable(group.JobVariables, variableName) If variable Is Nothing Then 'no variable has been defined with that name, so create a new JobVariable object, initialize it with the correct name, and add 'it to the server settings. variable = CType(session.CreateObject(ClassIDEnum.CID_JobVariable), JobVariable) variable.Name = variableName group.JobVariables.Add(variable) 'else we will update the value for the variable that already existed. End If variable.Value = variableValue group.Save() End Sub Private Const DEFAULT_JOB_GROUP_OID As String = "{2C13CBB7-57D7-44A7-A74C-92B9F92A2A01}:{9A3EA996-9137-4EA7-8CAC-55E70695B473}" Private Function FindGroup(ByVal session As Scheduler, ByVal groupName As String) As JobGroup Dim groupPath As New Queue(Of String) Dim pathParts As System.Text.RegularExpressions.MatchCollection pathParts = System.Text.RegularExpressions.Regex.Matches(groupName, "([^\\]+)") For Each match As System.Text.RegularExpressions.Match In pathParts groupPath.Enqueue(match.Value) Next If groupPath.Count > 0 AndAlso groupPath.Peek() = "Root" Then groupPath.Dequeue() End If Dim group As JobGroup group = CType(session.GetObject(DEFAULT_JOB_GROUP_OID), JobGroup) Return FindGroup(group, groupPath) End Function Private Function FindGroup(ByVal currentGroup As JobGroup, ByVal groupPath As Queue(Of String)) As JobGroup If groupPath.Count = 0 Then Return currentGroup End If For Each group As JobGroup In currentGroup.Groups If String.Compare(group.Name, groupPath.Peek, True) = 0 Then groupPath.Dequeue() Return FindGroup(group, groupPath) End If Next Return Nothing End Function Private Function FindVariable(ByVal variables As JobVariables, ByVal variableName As String) As JobVariable For Each variable As JobVariable In variables If String.Compare(variable.Name, variableName, True) = 0 Then Return variable End If Next Return Nothing End Function 'Sets a JobVariable at the server level. 'This method will update the variable if it already exists, or create a new variable if it does not. 'Important: The job that calls this script must be running under the account of a user who has permission to update server settings. Public Sub SetServerVariable(ByVal variableName As String, ByVal variableValue As String) Dim session As Scheduler Dim settings As ServerSettings Dim variable As JobVariable 'create a new session to the local adTempus instance session = CreateSession() 'retrieve the server settings, which contain the job variables settings = session.GetServerSettings() 'get the existing variable with the specified variableName, if there is one variable = FindVariable(settings.JobVariables, variableName) If variable Is Nothing Then 'no variable has been defined with that name, so create a new JobVariable object, initialize it with the correct name, and add 'it to the server settings. variable = CType(session.CreateObject(ClassIDEnum.CID_JobVariable), JobVariable) variable.Name = variableName settings.JobVariables.Add(variable) 'else we will update the value for the variable that already existed. End If variable.Value = variableValue settings.Save() End Sub Private Function CreateSession() As Scheduler Dim app As Application app = New Application 'create a new session to the local adTempus instance Return app.Connect("", "") End Function End Module
d. Click OK to save the Script Library.
Set Variables from a Script
Once the Script Library has been created you can call the SetGroupVariable method from an adTempus script to set variable values.
To use the code defined in the Script Library:
1. Create a new job, or edit an existing job. Keep in mind the following points:
- The values that a job sees for the Job Variables are fixed at the time the job begins executing. Therefore changing variables using this code will not affect any jobs that are already running, including the job that is making the changes. Therefore you should make the variable changes in a standalone job that runs before any jobs that depend on the variables.
- The script uses the adTempus API to update the variables. The API is subject to the same security checks as the adTempus Console. Therefore you must run the job under the User Account of a user who has permission within adTempus to modify the Job Group whose variables you are updating.
2. On the Steps page of the Job Properties, add a new step, selecting the "Execute a script" option in the Select Task window.
3. In the Script Execution Task Properties window, select the "Execute a script stored in adTempus" option, then click the Select... button.
4. In the Select Script window, click New... to create a new script.
5. In the Script Properties window, select "VB.NET" as the script Language.
6. Under Included Script Libraries, check the "SetVariables" library.
7. Add whatever code you need to calculate the value(s) of the variable(s) you need to set.
8. To set the variable values, call the SetGroupVariable method using the following syntax:
where GroupName is the name of the group where you want to set the variable, VariableName is the variable's name, and VariableValue is the new value for the variable.
To set variables for the root group (represented by the base "Jobs" folder in the Console), specify an empty string for GroupName:
Imports System Imports System.Collections Imports ArcanaDevelopment.adTempus.Server Public Class UserScript Inherits ArcanaDevelopment.adTempus.ScriptEngine.UserScriptBase Public Overrides Function Run() As Object Dim runDate As String runDate=DateTime.Now.ToString("yyyyMMdd") SetGroupVariable("","RunDate", rundate) adtempus.LogMessage(MessageTypeEnum.Informational, 0, "Set RunDate to " & runDate) Return 0 End Function End Class
Use a backslash to separate levels of hierarchy when settings values for groups below the first level:
SetGroupVariable("Top Level Group","SomeVariable", "some value") SetGroupVariable("Top Level Group\Second Level Group","SomeOtherVariable", "some value")
If the Job Variable already exists, its value will be updated. If it does not exist, it will be created. The variable will retain the new value until it is modified by another script or by a user.