Announcement
ABCFeatured Content
Recent Activity
AUDIT log not appearing for BRAPI access provision
Hi all, I am using the Business Rule to perform the user access provisioning using BRApi for security management. And used this BR in DAM job, added the DM to a task scheduler job to run it. All are working fine, but in the DASHBOARD -->NAVIGATION CENTER--> SECURITY AUDIT REPORTS --> USER CHANGE AUDIT. I cannot see the change line appearing in this report, executed by task scheduled for the DM (run by Business Rule.). Is there a way to enable the time in this report. apart from this i see the audit data and time in TOTAL USERS, USER LIST reports. -------------------------------------------------------- another important point i noted was ,those new user whoever i provisioned through the BR are uanable to authenticate. but when i make a small change like space or some modification in the user parameter save it. then undo the change and save it. they are able to authenticate the applciation.DK_OS14 hours agoNew Contributor6Views0likes0CommentsWhat IMPORT should i use for the SECURITY updates for BRApi
Hi All, i am new to OneStream, i tried creating BR for Security automation. below is my entire code in OS-BR. Imports System Imports System.Collections.Generic Imports System.Data Imports System.Data.Common Imports System.Globalization Imports System.IO Imports System.Linq Imports Microsoft.VisualBasic Imports OneStream.Finance.Database Imports OneStream.Finance.Engine Imports OneStream.Shared.Common Imports OneStream.Shared.Database Imports OneStream.Shared.Engine Imports OneStream.Shared.Wcf Imports OneStream.Stage.Database Imports OneStream.Stage.Engine Namespace OneStream.BusinessRule.Finance.BR_UserManagement Public Class SecurityGroupHelper Public Sub ShowQAGroups(ByVal si As SessionInfo, ByVal api As FinanceRulesApi) Try ' Get all security groups using the API passed to the function Dim allGroups As GroupInfo = BRApi.Security.Admin.GetGroup(si, "QA_Admin") ' Loop through all groups and display a MessageBox for each that starts with "QA_" For Each grp As MemberInfo In allGroups If grp.Member.Name.StartsWith("QA_") Then MessageBox.Show(grp.Member.Name, "QA Group Found") End If Next Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End Sub End Class End Namespace --------------------------------------------------------------------------------------- I am getting error as below. i am not sure what mistake in the code. one i am sure about messagebox.show. Error compiling Business Rule 'BR_UserManagement'. 1) Error at line 27: Expression is of type 'GroupInfo', which is not a collection type. 2) Error at line 29: 'MessageBox' is not declared. It may be inaccessible due to its protection level.SolvedDK_OS14 hours agoNew Contributor110Views0likes6CommentsProvision Request Manager - Access Issue
Hi All, PRM is used to assign access to the users (adding, removing, adding to groups etc) However, we need a different team to handle the security provision without having access to any other components in OneStream. It seems challenging to provide such group/user who can assign access without having Admin role. Does 6.6 version fix this with the Security updates available in 6.6 or the Provision manager again needs to have the Admin role? Or are there any APIs we can use to modify the users based on requests.RamuV15 hours agoNew Contributor III1.9KViews0likes3CommentsTop N in Cubeview using BR
I am trying to get top N (top 10) customers by revenue account in my cubeview. For this i re-purposed the snippet finance code for List Ranked to this: Namespace OneStream.BusinessRule.Finance.Ranked_list Public Class MainClass Public Function Main( ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As FinanceRulesApi, ByVal args As FinanceRulesArgs ) As Object Try Select Case api.FunctionType Case FinanceFunctionType.MemberListHeaders Return New List(Of MemberListHeader) From { New MemberListHeader("Ranked") } Case FinanceFunctionType.MemberList If args.MemberListArgs.MemberListName.Equals("Ranked", StringComparison.InvariantCultureIgnoreCase) Then Dim header As New MemberListHeader("Ranked") Dim members As List(Of Member) = GetRankedMembers(si, api, args) Return New MemberList(header, members) End If End Select Return Nothing Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End Function #Region "Ranking Logic" Private Function GetRankedMembers( ByVal si As SessionInfo, ByVal api As FinanceRulesApi, ByVal args As FinanceRulesArgs ) As List(Of Member) Try '------------------------------- ' Required parameters '------------------------------- Dim rankType As String = args.MemberListArgs.NameValuePairs("RankType") Dim rankCount As Integer = Convert.ToInt32(args.MemberListArgs.NameValuePairs("RankCount")) Dim loopMemberFilter As String = args.MemberListArgs.NameValuePairs("LoopMemberFilter") If Not args.MemberListArgs.NameValuePairs.ContainsKey("DataCellToRankMemberFilter") Then Throw New Exception("Missing required parameter: DataCellToRankMemberFilter") End If Dim dataCellFilter As String = args.MemberListArgs.NameValuePairs("DataCellToRankMemberFilter") Dim cubeName As String = New MemberScriptBuilder(dataCellFilter).Cube '------------------------------- ' Determine looping dimension '------------------------------- Dim loopDimPk As DimPk = GetDimPkForLoopMemberFilter(si, api, cubeName, loopMemberFilter, dataCellFilter) Dim membersToLoop As List(Of MemberInfo) = api.Members.GetMembersUsingFilter(loopDimPk, loopMemberFilter, Nothing) Dim rankedCells As New List(Of MemberAndCellValue) '------------------------------- ' Loop members and evaluate cell '------------------------------- For Each mi As MemberInfo In membersToLoop Dim mfb As MemberScriptBuilder = SubstituteLoopMember(loopMemberFilter, dataCellFilter, mi.Member.Name) Dim cell As DataCellInfoUsingMemberScript = BRApi.Finance.Data.GetDataCellUsingMemberScript( si, cubeName, mfb.GetMemberScript ) If cell IsNot Nothing AndAlso Not cell.DataCellEx.DataCell.CellStatus.Invalid AndAlso Not cell.DataCellEx.DataCell.CellStatus.IsNoData Then rankedCells.Add( New MemberAndCellValue( mi.Member, cell.DataCellEx.DataCell.CellAmount ) ) End If Next '------------------------------- ' Rank results '------------------------------- Dim result As New List(Of Member) Select Case rankType.ToUpperInvariant() Case "TOP" result = rankedCells. OrderByDescending(Function(x) x.CellValue). Take(rankCount). Select(Function(x) x.Member). ToList() Case "BOTTOM" result = rankedCells. OrderBy(Function(x) x.CellValue). Take(rankCount). Select(Function(x) x.Member). ToList() Case "MAX" Dim maxItem = rankedCells.OrderByDescending(Function(x) x.CellValue).FirstOrDefault() If maxItem IsNot Nothing Then result.Add(maxItem.Member) Case "MIN" Dim minItem = rankedCells.OrderBy(Function(x) x.CellValue).FirstOrDefault() If minItem IsNot Nothing Then result.Add(minItem.Member) End Select Return result Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End Function #End Region #Region "Helpers" Private Function GetDimPkForLoopMemberFilter( si As SessionInfo, api As FinanceRulesApi, cubeName As String, loopFilter As String, dataCellFilter As String ) As DimPk Dim cube As CubeInfo = api.Cubes.GetCubeInfo(cubeName) If cube Is Nothing Then Throw New Exception("Invalid cube: " & cubeName) Dim dimType As DimType = DimType.GetItem(loopFilter.Split("#"c)(0)) Dim mfb As New MemberScriptBuilder(dataCellFilter) Dim scenario As Member = api.Members.GetMember(DimTypeId.Scenario, mfb.Scenario) Dim scenarioType As ScenarioType = api.Scenario.GetScenarioType(scenario.MemberId) Dim dimId As Integer = cube.Cube.CubeDims.GetDimId(dimType.Id, scenarioType.Id) Return New DimPk(dimType.Id, dimId) End Function Private Function SubstituteLoopMember( loopFilter As String, dataCellFilter As String, memberName As String ) As MemberScriptBuilder Dim mfb As New MemberScriptBuilder(dataCellFilter) Dim dimType As DimType = DimType.GetItem(loopFilter.Split("#"c)(0)) Select Case dimType.Id Case DimType.Entity.Id : mfb.Entity = memberName Case DimType.Account.Id : mfb.Account = memberName Case DimType.UD1.Id : mfb.UD1 = memberName Case DimType.UD2.Id : mfb.UD2 = memberName Case DimType.UD3.Id : mfb.UD3 = memberName Case DimType.UD4.Id : mfb.UD4 = memberName Case DimType.UD5.Id : mfb.UD5 = memberName Case DimType.UD6.Id : mfb.UD6 = memberName Case DimType.UD7.Id : mfb.UD7 = memberName Case DimType.UD8.Id : mfb.UD8 = memberName End Select Return mfb End Function #End Region #Region "Helper Class" Private Class MemberAndCellValue Public Property Member As Member Public Property CellValue As Decimal Public Sub New(m As Member, v As Decimal) Member = m CellValue = v End Sub End Class #End Region End Class End Namespace After this changed My cubeview row member filter to this, however when cubeview runs , it runs for a bit and then page comes back completely blank : U5#Root.CustomMemberList( BRName = Ranked_list, MemberListName = Ranked, RankType = Top, RankCount = 10, LoopMemberFilter = U5#Total_Customer.Children, DataCellToRankMemberFilter = Cb#Financials :E#TotalEntity :C#USD :S#Actual :T#2026M1 :V#YTD :A#A5 :F#EndBal :O#Top :I#Top :U1#Organization :U2#Project :U3#None :U4#None :U6#None :U7#None :U8#None ) Does anyone know what i could be missing?usmali21 hours agoNew Contributor III19Views0likes1CommentHow to update Global Time dynamically via BR
I am trying to write a BR to update the Global Time within the OS application. I see API function to get globaltime (BRApi.Workflow.General.GetGlobalTime). However, I don't see one for setting/updating global time. Is there a API to update the Global Time? I even searched the tables in the Database to see if I can manually update the record within a table, but didn't come across the table that contains the Global Time. Is there a way to update the Global time based on the system time? Thanks,Genesis - Drill down > Open in New Tab
I am testing out drill functionalities in Genesis and found this "Open in New Tab" being grey out. I checked the cv in the page and am unable to find any config in this cv that relates to this. How do I make this option active for use? it will be really useful to see the drill results in another tab so that it can be view side by side with the original dashboard.JennyTan2 days agoNew Contributor III19Views0likes1CommentIncluding Journal Entries from Different Origin Member in Account Reconciliation Discovery
Hi Community, I’m working on an Account Reconciliation solution where I need to ensure posted journal entries balances are also included in the Account Reconciliation discovery process. Currently, by design the Discovery process only pulls trial balance information already imported and validated in the Stage. Therefore, I wanted to check if there’s a recommended, or best practice approach, to accomplish this requirement. Any guidance or examples would be greatly appreciated, thanks in advance for your help!shivani3802 days agoNew Contributor II84Views1like3CommentsSurface Workflow through Genesis
Would be great to surface workflow pages through Genesis so the end users don't have to toggle back and forth between OnePlace workflow pages for Actuals processes and a Genesis interface that incorporates all of their Planning forms. If we could surface workflow pages through Genesis, the user would never have to leave it.saugsburger2 days agoNew Contributor II17Views3likes1CommentDynamicCalc - Return FX of Current Parent
Good morning OneStream folks. I was looking for an example of how to dynamically pull the FX rate for an entity based on its current parent. We currently have a DynamicCalc account that assumes that all parents are USD and therefore the rate returned by the account is the USD translation rate. For example, the child is GBP and has a CAD parent, but the formula returns GBP-->USD. I was able to get a DynamicCalc formula that works, but I have to make some additions in my QuickView or CubeView to get it work completely. The account I created in this case is called ParentFX and the logic is below: In order to get the ParentFX account to return the correct value, I have to write my quickview logic as: A#ParentFX:C#Translated:Name(Parent FX). Which is fine, but I would also like to use that combo in a getdatacell calculation, and OneStream doesn't seem to like that. I'd like to be able to pull the A#ParentFX account with it using the Entity hierarchy as its guide for the parent FX instead of having to use the Cons hierarchy. Any ideas are appreciated.RossLikesOS2 days agoNew Contributor II13Views0likes0Comments
Getting Started
Learn more about the OneStream Community with the links below.