No Calculate Rule running on all workflow steps
Hi Everyone,
I've written a business rule that peforms a certain task when the process button is clicked in the workflow via the "No Calculate" function within the calculation definitions of the workflow profile (see reference (1) in the screenshot). Broadly speaking it works ok, however I intended for it to only be triggered when clicking process on the "top" node of the workflow (see reference (2) in the screenshot).
In actual fact it's running when process button is clicked in any of child workflow step (eg. "Asset Movement" in the example here, see reference (3) in the screenshot).
So my question is: can I have a business rule that is triggered by the No Calculate function but only in certain steps within the workflow? Or will it trigger wherever process is clicked? I had thought it would be possible because calculation definitions can be defined in each workflow step which is why I was surprised with the above.
(By the way calculation definitions are blank in the "Asset Movement" step).
What am I missing?!!!
Thanks for any ideas!
Richard
Hi Richard_Mayo,
You'll hopefully find the answer to your question on the above options given by aformenti.
However, if that's not the case, or you need something a little bit more dynamic / custom, here is another option you could explore:
As you probably know OS does not trigger sequences on No Calculate by default, that sequence is triggered via a custom function defined as part of the DataQualityEventHandler.
Having said that, you could update this custom function (that triggers the sequences defined on the No Calculate) to only trigger it if a certain criteria is met. The criteria could be for example: if the Workflow step is a base step or of a certain type, if there's a specific Text property defined, if it follows a specific naming convention, if the name matches the one passed on as a parameter, etc, etc.
That's a good idea Fred,
See below a screenshot of an slide explaining what Fred means:
The code would be something like this:
#Region "ProcessCube.NoCalculate Helpers" Private Sub OSB_HandleProcessCubeNoCalculate(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DataQualityEventHandlerArgs) '------------------------------------------------------------------------------------------------------------ 'Reference Code: XFR_HandleProcessCubeNoCalculate ' 'Description: Run a DataMgmt Sequence after the workflow process cube task is run. ' Note: the DataMgmt sequence name is assigned to a Workflow Profile CalcDef filter field ' so this event does not have to be modified, the user can simply edit the CalcDef grid ' for a workflow profile and this business rule will execucte the specified sequence. ' *******Note******** This is designed to prevent a DM job from triggering more than ' once for range scenarios that span multiple years. ' 'Usage: Used to kick off a DM job specified in a No Calculate calculation definition and pass the entity filter ' specified on the calculation defintion to the entity filter in the data mgmt job. '------------------------------------------------------------------------------------------------------------ Try 'Get the DataUnitInfo from the Event arguments so that we can get the name of the DataManagement sequence to process. Dim calcInfo As DataUnitInfo = DirectCast(args.Inputs(2), DataUnitInfo) Dim WfUnitPK As WorkflowUnitPk = DirectCast(args.Inputs(0), WorkflowUnitPk) If Not Brapi.Workflow.Metadata.GetProfile(si,WfUnitPK.ProfileKey).IsInputChild If Not calcInfo Is Nothing Then 'Make sure that a Sequence name is assigned to the filter value of the Calc Definition of the executing Workflow Profile If calcInfo.FilterValue <> String.Empty Then 'set the passEntityCalcDef variable to true if there is a need to pass the calculation definition entity value to the DM job Dim passEntityCalcDef As Boolean = False 'dictionary of DM job params Dim dmParams As New Dictionary(Of String, String) 'if we want to pass the entity from the calc def to the DM job, specify a parameter on the DM job called ParamEntity If passEntityCalcDef Then 'pass the entity from the calc def to the ParamEntity parameter on the DM job. Swap ParamEntity with your custom parameter name dmParams.Add("ParamEntity", calcInfo.DataUnitNames.EntityName) End If Dim varScenarioID As String = calcInfo.DataUnitIds.ScenarioId Dim wfTracking As WorkflowTrackingFrequency = BRApi.Finance.Scenario.GetWorkflowTrackingFrequency(si, varScenarioID) 'if the workflow tracking frequency is range, ensure we are only executing a DM sequence for the first year in the range If wfTracking = WorkflowTrackingFrequency.Range Then Dim processedYear As Integer = BRApi.Finance.Time.GetYearFromId(si, calcInfo.DataUnitIds.TimeId) Dim wfStartTime As Integer = BRApi.Finance.Scenario.GetWorkflowStartTime(si, varScenarioID) Dim firstWFStartYear As Integer = BRApi.Finance.Time.GetYearFromId(si, wfStartTime) If processedYear = firstWFStartYear Then 'Now, execute the DataMgmt Sequence that was specified in the FilterValue (In a background thread) BRApi.Utilities.StartDataMgmtSequence(si, calcInfo.FilterValue, dmParams) End If 'non range scenarios Else 'Now, start the DataMgmt Sequence that was specified in the FilterValue (In a background thread) BRApi.Utilities.StartDataMgmtSequence(si, calcInfo.FilterValue, dmParams) End If End If End If End If Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End Sub #End Region