The OneStream Community is temporarily frozen until June 29th due to the ongoing maintenance. Please read the blog post here to learn more.
Forum Discussion
BenEppel
7 months agoContributor
Losing Dynamic Parameters on Dashboard Refresh
Hello,
I would be very grateful if someone could offer some direction on fixing the issue of dynamically generated parameters disappearing on a refresh action.
When the dashboard initially loads, all of the dynamic parameters render as expect. I have an extender service setting the count of parameters to 2 for each param type (Debits,Credits). These work off two stored member list parameters, par_DebitList and par_CreditList.
When the dashboard is refreshed, I lose the _dynamic_2 even though the parameter count is still 2.
Public Function GetDynamicParametersForDynamicComponent( _
ByVal si As SessionInfo,
ByVal api As IWsasDynamicDashboardsApiV800,
ByVal workspace As DashboardWorkspace,
ByVal maintUnit As DashboardMaintUnit,
ByVal dynamicComponentEx As WsDynamicComponentEx,
ByVal customSubstVarsAlreadyResolved As Dictionary(Of String, String)) _
As WsDynamicParameterCollection Implements IWsasDynamicDashboardsV800.GetDynamicParametersForDynamicComponent
Try
If api Is Nothing Then Return Nothing
Dim CompName As String = dynamicComponentEx.DynamicComponent.Component.Name
If CompName.Contains("CBX_Credits") Or CompName.Contains("CBX_Debits") Then
Dim params As WsDynamicParameterCollection = api.GetDynamicParametersForDynamicComponent( _
si,workspace,dynamicComponentEx,String.empty,Nothing,tristatebool.TrueValue,WsDynamicItemStateType.MinimalWithTemplateParameters)
Dim paramname As String = Nothing
If CompName.Contains("CBX_Credits") Then
paramname = "par_CreditList"
Else
paramname = "par_DebitList"
End If
Dim ParamComp As WsDynamicCompParamMemberEx = params.GetParameterUsingBasedOnName(paramname)
Return params
Else
Return api.GetDynamicParametersForDynamicComponent(si, workspace, dynamicComponentEx, String.Empty, Nothing, TriStateBool.TrueValue, WsDynamicItemStateType.MinimalWithTemplateParameters)
End If
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End FunctionThis is my setting on the combo box:
When refreshing the dashboard, all the components render, but just the parameters are lost. When loading the dashboard, GetDynamicParametersForDynamicComponent executes 8 times, while on a refresh it is only executing 6 times.
Would appreciate any guidance on this.
Thanks!
I could not resolve the issue and went with a traditional route. Everything worked as expected when i hard coded the parameter, so i believe the issue was with passing in the parameter values on a refresh. The rule would be called twice each refresh, and one of the calls customSubstVars would be empty.
7 Replies
- sameburn
OneStream Employee
Hi BenEppel
Are you setting "par_CreditList_dynamic_1", "par_DebitList_dynamic_2", etc on your dynamic component e.g. combobox in the GetDynamicComponentsForDynamicDashboard method?
Based on your description it looks like you might have a conflict between bound parameter name set on the component and the parameter name returned by the your logic? e.g. your dynamic component is not expecting "par_CreditList_dynamic_1" to be returned
Hope this helps
Sam
- BenEppelContributor
Hi Sam,
Appreciate your help! I am not modifying the bound parameter in GetDynamicComponentsForDynamicDashboard method. If I modify the bound parameter name, then I don't retrieve any parameters in the GetDynamicParametersForDynamicComponent method when using api.GetDynamicParametersForDynamicComponent.
Public Function GetDynamicParametersForDynamicComponent( _ ByVal si As SessionInfo, ByVal api As IWsasDynamicDashboardsApiV800, ByVal workspace As DashboardWorkspace, ByVal maintUnit As DashboardMaintUnit, ByVal dynamicComponentEx As WsDynamicComponentEx, ByVal customSubstVarsAlreadyResolved As Dictionary(Of String, String)) _ As WsDynamicParameterCollection Implements IWsasDynamicDashboardsV800.GetDynamicParametersForDynamicComponent Try If api Is Nothing Then Return Nothing Dim CompName As String = dynamicComponentEx.DynamicComponent.Component.Name Dim params As WsDynamicParameterCollection = api.GetDynamicParametersForDynamicComponent( _ si,workspace,dynamicComponentEx,String.empty,Nothing,tristatebool.TrueValue,WsDynamicItemStateType.Unknown) Dim paramname As String = Nothing If CompName.Contains("CBX_Credits") Then paramname = "par_CreditList" Else paramname = "par_DebitList" End If Dim ParamColl As New List(Of WsDynamicCompParamMemberEx) Dim ParamComp As WsDynamicCompParamMemberEx = params.GetParameterUsingBasedOnName(paramname) ParamComp.DynamicParameterEx.DynamicParameter.Parameter.Name = _ dynamicComponentEx.DynamicComponent.Component.BoundParameterName ParamColl.Add(ParamComp) Return New WsDynamicParameterCollection(dynamicComponentEx,ParamColl) Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End FunctionWhen logging the bound parameter of dynamicComponentEx within GetDynamicParametersForDynamicComponent, it is no longer the stored name, it is par_DebitList_dynamic_Dyn_2.
The components are returned based off the parameter par_Entries_Count, which is initially set during the Load Dash Service. When the Load Dash service is executed, GetDynamicComponentsForDynamicDashboard is being executed twice. On the first run, customSubstVarsAlreadyResolved holds the par_Entries_Count value that was set in the load rule. On the 2nd execution, customSubstVarsAlreadyResolved has par_Entries_Count and literal formatting parameters from other components in the dashboard. At this point everything is behaving as expected.
When the dashboard is refreshed by changing the combo box associated with par_Entries_Count, GetDynamicComponentsForDynamicDashboard is being executed twice. The first time, customSubstVarsAlreadyResolved is empty, and the 2nd time has all the parameters like the 2nd load dash execution. The combo boxes are rendering the correct count, but the parameters are not retained. If I only Refresh using a button and not change par_Entries_Count, I still have the same issue. It seems like if customSubstVarsAlreadyResolved was not empty, the issue would be resolved.
Below is my code for the GetDynamicComponentsForDynamicDashboard method.
Public Function GetDynamicComponentsForDynamicDashboard(ByVal si As SessionInfo, ByVal api As IWsasDynamicDashboardsApiV800, ByVal workspace As DashboardWorkspace, _ ByVal maintUnit As DashboardMaintUnit, ByVal dynamicDashboardEx As WsDynamicDashboardEx, ByVal customSubstVarsAlreadyResolved As Dictionary(Of String, String)) _ As WsDynamicComponentCollection Implements IWsasDynamicDashboardsV800.GetDynamicComponentsForDynamicDashboard Try If (api IsNot Nothing) Then If dynamicDashboardEx.DynamicDashboard.Name.StartsWith("0_Content_EntryDialog_Comps") Then Dim Vars As New Text.StringBuilder For Each var In customSubstVarsAlreadyResolved Vars.AppendLine($"Key: {var.Key} Value: {var.Value}") Next brapi.ErrorLog.LogMessage(si,"DashName: " & dynamicDashboardEx.DynamicDashboard.Dashboard.Name _ & vbCrLf & Vars.ToString) Return Me.GetMemberComponents(si,api,workspace,maintUnit,dynamicDashboardEx,customSubstVarsAlreadyResolved) Else Return api.GetDynamicComponentsForDynamicDashboard(si, workspace, dynamicDashboardEx, String.Empty, Nothing, TriStateBool.TrueValue, WsDynamicItemStateType.MinimalWithTemplateParameters) End If End If Return Nothing Catch ex As Exception Throw New XFException(si, ex) End Try End Function Public Function GetMemberComponents(ByVal si As SessionInfo, ByVal api As IWsasDynamicDashboardsApiV800, ByVal workspace As DashboardWorkspace, _ ByVal maintUnit As DashboardMaintUnit, ByVal dynamicDashboardEx As WsDynamicDashboardEx, ByVal customSubstVarsAlreadyResolved As Dictionary(Of String, String)) _ As WsDynamicComponentCollection Dim wsDynCompMembers As New List(Of WsDynamicDbrdCompMemberEx)() Dim CompCount As Integer = 0 For Each var In customSubstVarsAlreadyResolved If var.Key = "par_Entries_Count" Then CompCount = var.Value End If Next For i As Integer = 1 To CompCount Dim compName As String = Nothing If dynamicDashboardEx.DynamicDashboard.Dashboard.Name = "0_Content_EntryDialog_Comps_Credits" Then compName = "CBX_Credits" Else compName = "CBX_Debits" End If Dim wsDynCompMemberEx = BuildDynamicComponentFromStoredComponent( si, api, workspace, maintUnit, dynamicDashboardEx, compName, "Dyn_" & i, Nothing, WsDynamicItemStateType.EntireObject ) If wsDynCompMemberEx IsNot Nothing Then Dim comp = wsDynCompMemberEx.DynamicComponentEx.DynamicComponent.Component ' brapi.ErrorLog.LogMessage(si, "Comp Bound param name: " & comp.BoundParameterName) wsDynCompMembers.Add(wsDynCompMemberEx) End If Next Return New WsDynamicComponentCollection(dynamicDashboardEx, wsDynCompMembers) End Function Private Function BuildDynamicComponentFromStoredComponent(ByVal si As SessionInfo, ByVal api As IWsasDynamicDashboardsApiV800, ByVal workspace As DashboardWorkspace, ByVal maintUnit As DashboardMaintUnit, ByVal dynamicDashboardEx As WsDynamicDashboardEx, ByVal storedComponentName As String, ByVal nextLevelNameSuffixToAdd As String, ByVal nextLevelTemplateSubstVarsToAdd As Dictionary(Of String, String), ByVal dynamicItemStateType As WsDynamicItemStateType) As WsDynamicDbrdCompMemberEx Dim storedComp = api.GetStoredComponentForDynamicDashboard(si,workspace,dynamicDashboardEx.DynamicDashboard, storedComponentName) If storedComp IsNot Nothing Then Dim wsDynamicCompEx = api.GetDynamicComponentForDynamicDashboard(si, workspace, dynamicDashboardEx, storedComp.Component, nextLevelNameSuffixToAdd, nextLevelTemplateSubstVarsToAdd, TriStateBool.TrueValue, dynamicItemStateType) If wsDynamicCompEx IsNot Nothing Then Dim wsDynCompMember As New WsDynamicDbrdCompMember() Return New WsDynamicDbrdCompMemberEx(wsDynCompMember, wsDynamicCompEx) End If End If Return Nothing End FunctionThanks again,
Ben
- sameburn
OneStream Employee
Also, FYI you don't necessarily need your private function BuildDynamicComponentFromStoredComponent; we can use the GetComponentUsingBasedOnName method from the ComponentCollection itself e.g.
WsDynamicDbrdCompMemberEx dynButton = componentCollection.GetComponentUsingBasedOnName("btn_Stored");This is the same for any dynamic collection e.g. you are already using this approach with your WsDynamicParameterCollection.
Hope this helps
Related Content
- 5 months ago