Forum Discussion

YanSavinsky's avatar
YanSavinsky
New Contributor III
7 months ago

Running DM package from the BR and completing the workflow step

I would like to give my users the ability to launch the DM sequence from the workflow step. I have the dashboard with the button that passes the parameters to the DM package and launches the package. The last step in the DM sequence runs the Extensibility BR that completes the workflow step. Everything seems to work except that the workflow step window does not refresh after the sequence completion. The workflow step appears incomplete even though it is. The click on the "refresh Application" icon is required.

Is there a way to address it?

My Extensible BR is below:

 

  • MikeG's avatar
    MikeG
    7 months ago

    Create 1 Dashboard Extender rule with 2 functions - one to Complete and one to Revert.  Do not do this by way of a DM Sequence.  There is no API for Refresh Application.  Take 1 step back to take 2 steps forward.

    Hope this helps!

  • FredLucas's avatar
    FredLucas
    6 months ago

    Hi YanSavinsky,

    I believe the following solution will give you what you are looking for with minimal changes to your existing logic:

    1. Remove the last step from your DM Sequence - EPU_Complete_WF
    2. Create a Dashboard Extender Rule that triggers the DM Sequence and updates the WF Status in case of success (see snippet below)
    3. Update the button to trigger this dashboard Extender Rule instead
    Case Is = DashboardExtenderFunctionType.ComponentSelectionChanged
      If args.FunctionName.XFEqualsIgnoreCase("ProcessDMSequenceAndUpdateWFStatus") Then
        '{REP_SolutionHelper}{ProcessDMSequenceAndUpdateWFStatus}{}
        Dim selectionChangedTaskResult As New XFSelectionChangedTaskResult()
        selectionChangedTaskResult.IsOK = False
        selectionChangedTaskResult.ShowMessageBox = True
    
        'Launch data management sequence
        Dim customSubstVars As New Dictionary(Of String, String) 'You can use this dictionary to pass on parameters to your DM Sequence
        Dim objTaskActivityItem As TaskActivityItem = BRApi.Utilities.ExecuteDataMgmtSequence(si, "Workflow EPU Process IFRS", customSubstVars)
        objTaskActivityItem = BRApi.TaskActivity.GetTaskActivityItem(si, objTaskActivityItem.UniqueID)
        If (objTaskActivityItem.HasError) Then ' -- If there were errors 
          selectionChangedTaskResult.Message = "Process completed with errors."
          Return selectionChangedTaskResult
        Else ' -- If DM sequence runs ok
          selectionChangedTaskResult.IsOK = True
          selectionChangedTaskResult.Message = "Process has completed successfully."
          ' You can paste and adapt your existing WF Status Update code here
    
          Return selectionChangedTaskResult									
        End If
      End If

     

    I hope this helps.

    Thanks,

    Fred

  • sameburn's avatar
    sameburn
    Contributor II

    Hi YanSavinsky 

    Try either setting a Refresh of the Main dashboard via your button.  Or you can do the same with the XFSelectionChangedTaskResult object in a Dashboard Extender Business Rule.  See example below

    
    ' Usage: {WF_SolutionHelper}{CompleteWorkflow}{WFProfile = [|WFProfile|], Scenario = [|WFScenario|], Time = [|WFTime|]}
    If args.FunctionName.XFEqualsIgnoreCase("CompleteWorkflow") Then
    	' Pass in variables
    	Dim profileName As String = args.NameValuePairs.XFGetValue("WFProfile")
    	Dim scenario As String = args.NameValuePairs.XFGetValue("Scenario")
    	Dim time As String = args.NameValuePairs.XFGetValue("Time")
    
    	' Create WorkflowUnitClusterPk from variables passed in from dashboard
    	Dim wfClusterPK As WorkflowUnitClusterPk = BRApi.Workflow.General.GetWorkflowUnitClusterPk(si, profileName, scenario, time)
    	' BRApi used to complete a workspace
    	BRApi.Workflow.Status.SetWorkflowStatus(si, wfClusterPK, StepClassificationTypes.Workspace, WorkflowStatusTypes.Completed, "Workspace Completed", String.Empty, "Admin clicked complete workflow", Guid.Empty)
    					
    	' Declare XFSelectionChangedTaskResult				
    	Dim selectionChangedTaskResult As New XFSelectionChangedTaskResult()						
    	' Use to update the wfstatus automatically
    	selectionChangedTaskResult.WorkflowWasChangedByBusinessRule = True
    	selectionChangedTaskResult.IsOK = True							
    	' Used to refresh a named dashboard e.g. 0_Frame_XXX -> Update string below with your dashboard name
    	selectionChangedTaskResult.ChangeSelectionChangedUIActionInDashboard = True	
    	selectionChangedTaskResult.ModifiedSelectionChangedUIActionInfo.SelectionChangedUIActionType = XFSelectionChangedUIActionType.Refresh
    	selectionChangedTaskResult.ModifiedSelectionChangedUIActionInfo.DashboardsToRedraw = "[Enter the dashboard name that you want to refresh here]"			
    	Return selectionChangedTaskResult
    	
    End If

     

  • RobbSalzmann's avatar
    RobbSalzmann
    Valued Contributor II

    In the properties for the button your user clicks to launch the DM, Set the User Interface Action to "Refresh" and select the dashboard where your workflows are shown in the Dashboards to Redraw

     

  • YanSavinsky's avatar
    YanSavinsky
    New Contributor III

    Thank you, Rob and Sam!

    Unfortunately using the "User Interface Action" properties of the button does not do the trick. Refreshing the dashboard manually does not work either, neither does reloading the dashboard by clicking on the workflow step in the period area of the workflow screen. The only thing that does work is clicking the "Refresh Application" icon on the top right of the Windows Client window.

    Currently my button is launching the DM sequence and the last step in the sequence launches the BR that completes the workflow. It is the "extensibility" BR. My understanding is that "Extensibility" type of BR is the only flavor of BR that can be launched via DM step. When I tried to specify the Dashboard Extender rule in the DM step it generates an error on execution: "Invalid Business Rule"

    I wonder if my option is to have my button launch the BR and that BR launch the DM sequence and complete the workflow?

     

  • MikeG's avatar
    MikeG
    Contributor III

    Hi YanSavinsky 

    It should be a Dashboard Extender (not an Extensibility rule) - And it should be a ComponentSelectionChanged type of DashboardExternderFunctionType.

     

     

    Those are excerpts from a larger rule but the keys are:

    - Dashboard Extender Rule > Extender Function Type is ComponentSelectionChanged > The specific function you are calling (important because you can have 1 rule that does both the Complete and Revert actions.  > WorkflowWasChangedByBusinessRule = True > End the Rule with a Return TaskResult.

    This will refresh the Workspace - and for sanity - make sure you Workflow is of Type Workspace.

    Best,

     

     

  • YanSavinsky's avatar
    YanSavinsky
    New Contributor III

    Thank you very much, Fred.

    I came to the same conclusion: instead of using DM steps to launch business rules, in which case I am limited to the Extensibility type rules, I need to create the Dashboard Extender rule to both check the status of the workflow, execute the DM sequence and complete the workflow step if DM sequence completes without errors.

    Once I test it successfully, I will post the code here for reference.

  • YanSavinsky's avatar
    YanSavinsky
    New Contributor III

    Thank you, Mike!

    Here is my issue: my current setup actually works exactly as I intended: there is a button on my dashboard that launches the DM sequence. The last step in that sequence runs the BR that completes the workflow step, which is type "Workspace". That rule DOES complete the step. The problem is that this step does not show as completed. The only way to make it show as completed is for the user to click on the "Refresh Application" icon.

    In addition, on my dashboard I also have 2 buttons to complete and revert the workflow. These buttons are configured with the call to the Dashboard Extender, as you advised, and they work fine.

    I wonder if there is a method in BRApi to "Refresh Application"?

     

     

    • FredLucas's avatar
      FredLucas
      Contributor III

      Hi YanSavinsky,

      I believe the following solution will give you what you are looking for with minimal changes to your existing logic:

      1. Remove the last step from your DM Sequence - EPU_Complete_WF
      2. Create a Dashboard Extender Rule that triggers the DM Sequence and updates the WF Status in case of success (see snippet below)
      3. Update the button to trigger this dashboard Extender Rule instead
      Case Is = DashboardExtenderFunctionType.ComponentSelectionChanged
        If args.FunctionName.XFEqualsIgnoreCase("ProcessDMSequenceAndUpdateWFStatus") Then
          '{REP_SolutionHelper}{ProcessDMSequenceAndUpdateWFStatus}{}
          Dim selectionChangedTaskResult As New XFSelectionChangedTaskResult()
          selectionChangedTaskResult.IsOK = False
          selectionChangedTaskResult.ShowMessageBox = True
      
          'Launch data management sequence
          Dim customSubstVars As New Dictionary(Of String, String) 'You can use this dictionary to pass on parameters to your DM Sequence
          Dim objTaskActivityItem As TaskActivityItem = BRApi.Utilities.ExecuteDataMgmtSequence(si, "Workflow EPU Process IFRS", customSubstVars)
          objTaskActivityItem = BRApi.TaskActivity.GetTaskActivityItem(si, objTaskActivityItem.UniqueID)
          If (objTaskActivityItem.HasError) Then ' -- If there were errors 
            selectionChangedTaskResult.Message = "Process completed with errors."
            Return selectionChangedTaskResult
          Else ' -- If DM sequence runs ok
            selectionChangedTaskResult.IsOK = True
            selectionChangedTaskResult.Message = "Process has completed successfully."
            ' You can paste and adapt your existing WF Status Update code here
      
            Return selectionChangedTaskResult									
          End If
        End If

       

      I hope this helps.

      Thanks,

      Fred

    • MikeG's avatar
      MikeG
      Contributor III

      Create 1 Dashboard Extender rule with 2 functions - one to Complete and one to Revert.  Do not do this by way of a DM Sequence.  There is no API for Refresh Application.  Take 1 step back to take 2 steps forward.

      Hope this helps!

  • YanSavinsky's avatar
    YanSavinsky
    New Contributor III

    As promised, here is the complete Dashboard Extender rule that is now being launched from the dashboard button.

    I do have another issue manifest itself: lines 40 - 46 in the below sample are there to terminate the business rule if the DM sequence does not complete successfully. It does not work. I made my DM sequence error out during various steps and the condition of " If (objTaskActivityItem.HasError) Then ' -- If DM Sequence generates errors " is not being triggered. I can see entries being generated in the error log.

    Namespace OneStream.BusinessRule.DashboardExtender.EPU_SolutionHelper
    	Public Class MainClass
    		Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardExtenderArgs) As Object
    			Try
    				Select Case args.FunctionType
    				Case Is = DashboardExtenderFunctionType.ComponentSelectionChanged
    	  				If (args.FunctionName.XFEqualsIgnoreCase("ExecuteEPUProcess")) Then
    
    					Dim wfProfileKey As Guid = si.WorkflowClusterPk.ProfileKey
    					Dim wfProfile As String = BRApi.Workflow.Metadata.GetProfile(si, si.WorkflowClusterPk.ProfileKey).Name
    					Dim scenario As String = ScenarioDimHelper.GetNameFromID(si, si.WorkflowClusterPk.ScenarioKey)
    					Dim time As String = BRApi.Finance.Time.GetNameFromId(si, si.WorkflowClusterPk.TimeKey)
    					Dim wfToUpdate As WorkflowUnitClusterPk = BRApi.Workflow.General.GetWorkflowUnitClusterPk(si, wfProfile, scenario, time)						
    	                Dim wfStatus As WorkflowInfo = BRApi.Workflow.Status.GetWorkflowStatus(si, si.WorkflowClusterPk, True)
    					Dim calcEntity As String = BRApi.Dashboards.Parameters.GetLiteralParameterValue(si,"False","WFEPUEntity")
    					Dim EPU_DM_Sequence As String = args.NameValuePairs.XFGetValue("EPU_DM_Sequence", Nothing)
    					Dim EPU_Entity_Selection_S4 As String = args.Namevaluepairs.XFGetValue("EPU_Entity_Selection_S4",Nothing)
    					Dim EPU_Period As String = args.Namevaluepairs.XFGetValue("EPU_Period",Nothing)
    
    
    							
    					'Make sure the Workflow is not Complete or Locked before proceeding with DM Sequence
    					If (wfStatus.Locked)
    						Throw New System.Exception ("EPU Process could not be executed. EPU Workflow Step is locked.")
    					Else If wfStatus.GetOverallStatus().Equals(WorkflowStatusTypes.Completed)
    						Throw New System.Exception ("EPU Process could not be executed. EPU Workflow Step is complete.")
    					End If
    						
    
    					Dim selectionChangedTaskResult As New XFSelectionChangedTaskResult()
    					selectionChangedTaskResult.IsOK = False
    					selectionChangedTaskResult.ShowMessageBox = True
    
    				    'Launch data management sequence
    					 Dim customSubstVars As New Dictionary(Of String, String) 'You can use this dictionary to pass on parameters to your DM Sequence
    						customSubstVars.Add("EPU_Entity_Selection_S4", EPU_Entity_Selection_S4)
    						customSubstVars.Add("EPU_Period", EPU_Period)
    					 Dim objTaskActivityItem As TaskActivityItem = BRApi.Utilities.ExecuteDataMgmtSequence(si, EPU_DM_Sequence, customSubstVars)
    
    					 If (objTaskActivityItem.HasError) Then ' -- If DM Sequence generates errors 
    				     	selectionChangedTaskResult.Message = "EPU Process completed with errors."
    				     	Return selectionChangedTaskResult
    				     Else ' -- If DM Sequence completes successfully
    				     	selectionChangedTaskResult.IsOK = True
    				      	selectionChangedTaskResult.Message = "EPU Process has completed successfully."
    						'Define Workflow Profile
    
    					'Complete the workflow step if and when DM sequence completes sucessfully
    						BRApi.Workflow.Status.SetWorkflowStatus(si, wfToUpdate, StepClassificationTypes.Workspace, WorkflowStatusTypes.Completed, "Auto completing Workspace", _
    						"Error autocompleting Workspace", "Auto completing", Nothing)						
    					    ' You can paste and adapt your existing WF Status Update code here
    						selectionChangedTaskResult.WorkflowWasChangedByBusinessRule = True
    						selectionChangedTaskResult.IsOK = True
    
    		      				Return selectionChangedTaskResult									
    	    			End If
    	  				End If
    				End Select
    
    				Return Nothing
    			Catch ex As Exception
    				Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
    			End Try
    		End Function
    	End Class
    End Namespace

     

    • FredLucas's avatar
      FredLucas
      Contributor III

      Thanks for sharing your solution YanSavinsky 

      I believe the error will get fixed if you add the following code to line 39:

      objTaskActivityItem = BRApi.TaskActivity.GetTaskActivityItem(si, objTaskActivityItem.UniqueID)

      Apologies for missing that statement in my original post, will edit not to confuse other people 🙂

      Hope this helps.

    • Pawel's avatar
      Pawel
      New Contributor II

      Hello gentlemen,

      I struggle with quite similar issue, the button executes the Dashboard Extender rule, it starts the DM, waits for the end, i can see the result message but the application does not refresh

      What could be wrong?

      • FredLucas's avatar
        FredLucas
        Contributor III

        Hi Pawel 

        Can you share your code, have you included this last part at the end?

        'Complete the workflow step if and when DM sequence completes sucessfully
        						BRApi.Workflow.Status.SetWorkflowStatus(si, wfToUpdate, StepClassificationTypes.Workspace, WorkflowStatusTypes.Completed, "Auto completing Workspace", _
        						"Error autocompleting Workspace", "Auto completing", Nothing)						
        					    ' You can paste and adapt your existing WF Status Update code here
        						selectionChangedTaskResult.WorkflowWasChangedByBusinessRule = True
        						selectionChangedTaskResult.IsOK = True
        
        		      				Return selectionChangedTaskResult