Recent Blogs
Community Highlights: February
1 MIN READ February 2025: Finally it's about to be spring! For those that participate in daylight savings... did you spring forward yesterday? It's an exciting month with St. Patrick's day right around the corner for all you sassy lassies and lads. All of our metrics have been on the rise! We're seeing more visits and views across the board as well as more new discussions. Here's what we saw in February 2025: The Community had 28,559 visits in February 2025 and 91, 072 page views We had 119 new discussions begin Reporting was our most active forum (again), with 39 new discussions Top Engaged Threads: Most Replies: Transformation Rules for Time dimension Most Views: Primary and secondary axis align 0 point (Again!) Most Active Members: We have a triple crown this month and a new face to grace the highlights! Congrats victortei and welcome to the Community Highlights 😀 Most Forum Replies: victortei Most Likes Received: victortei Most Authored Solutions: victortei7Views0likes0CommentsMenu Component in Practice
4 MIN READ If you create the new Menu Component in your Maintenance Unit, you will quickly notice that it has very few properties. That's because its configuration will actually come from an attached Data Adapter, which must produce a set of tables containing all menu items and their configuration. The format of such tables has to be somewhat precise, matching what the component expects. For this reason, the best way to produce them (at least while you familiarize yourself with this mechanism) is to create a Dashboard DataSet using a couple of utility classes built for this specific task. The first thing we will do, in our rule, is to create an XFMenuItemCollection object. This represents our menu, which we will populate with items and eventually return (as a DataSet) at the end of the function. Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardDataSetArgs) As Object Try Select Case args.FunctionType Case Is = DashboardDataSetFunctionType.GetDataSet If args.DataSetName.XFEqualsIgnoreCase("MainMenu") Then ' create the menu object Dim menu As New XFMenuItemCollection() Menu items will be created by instantiating objects of type XFMenuItem. These objects will hold all the configuration properties for the item, including the font and colors that it will use. There are a few different constructors you can use, to specify all sorts of properties; the one used here is the shortest one! ' create top-level item ' XFMenuItem(string uniqueName, string headerText, string foreground, string background, bool isBold, bool isItalic, bool isEnabled, bool isSeparator, string parameterValue) Dim parentMenuItemOne As New XFMenuItem("1", "Parent", _ "White", "SlateGray", False, False, True, False, Nothing) ' create items for the second level Dim childMenuItemOne As New XFMenuItem("1.1", "Child 1", _ "Black", "White", True, True, True, False, Nothing) Dim childMenuItemTwo As New XFMenuItem("1.2", "Child 2", _ "Black", "White", True, True, True, False, Nothing) ' create item for the third level Dim grandChildMenuItemOne As New XFMenuItem("1.1.1", "Grandchild 1", _ "White", "SlateGray", True, True, True, False, Nothing) Most of the properties are self-explanatory, but you might wonder what "parameterValue" is. That's the value that will be pushed into the Bound Parameter specified on the actual component later on, so that Actions or other components can pick it up. We will come back to this later. Now we need to define the relationships between items. We do that by manipulating the .Children property of each parent item, which must be a list containing the children (duh!) items. ' create the hierarchy by adding children to direct parents as a List ' attach 1.1.1 as a child of 1.1 childMenuItemOne.Children = New List(Of XFMenuItem) From {grandChildMenuItemOne} ' attach 1.1 as a child of 1 parentMenuItemOne.Children = New List(Of XFMenuItem) From {childMenuItemOne} ' you can also manipulate the list once created. ' attach 1.2 as a child of 1 parentMenuItemOne.Children.Add(childMenuItemTwo) In a similar way, top-level items are added to the list contained in the .MenuItems property of our XFMenuItemCollection instance. ' add item 1 as a top-level members of the menu menu.MenuItems.Add(parentMenuItemOne) Before we return the resulting menu, if you are dealing with dynamically-generated structures with a lot of members, you might want to perform a safety check and purge extra members: While menu.IsAboveMaxMenuItemLimit(si) menu.MenuItems.RemoveAt(menu.MenuItems.Count - 1) End While Last, we use the .CreateDataSet method of our menu object to return the DataSet. ' generate the dataset and return it Return menu.CreateDataSet(si) Now that we have the rule, we can create a DataAdapter to execute it. Notice how, when testing it, it produces two tables: one with item properties, and one with their relationships. Now that we have an Adapter, we can create the Menu Component and attach the Adapter to it. You can then assign it to a Dashboard and preview it, after you save it. This is fun but a bit pointless! We want menus so that the user will actually choose something and we'll get the result of that choice. In order to do that, we need to specify the Bound Parameter. Whenever the user selects an item, the "parameterValue" associated with that item will be pushed into the specified Parameter; we can then reference that Parameter in an Action or extender rule, to trigger something like navigating to a website. Note that the Parameter doesn't need to exist! OneStream will just create one for you in the background. Then we place an Action on our Component, referring to the Parameter. The last step is to go back to our rule and specify a different parameterValue for "leaf" items, so that the Parameter will contain something. Dim childMenuItemTwo As New XFMenuItem("1.2", "Main Page", _ "Black", "White", True, True, True, False, "https://www.onestream.com") ' create item for the third level Dim grandChildMenuItemOne As New XFMenuItem("1.1.1", "OneCommunity", _ "White", "SlateGray", True, True, True, False, "https://community.onestreamsoftware.com") Et voilà! You can now execute the Dashboard and verify that it works!73Views1like1CommentMap Component Tutorial
5 MIN READ So you’ve bought the OneStream Advanced Reporting and Dashboards book - congratulations on being on your way to mastering these tools! The book is chocked full of examples and guidance on how to tailor your user experience, but here’s something extra – a tutorial on how to use Map Components in your application. We’ll walk through setting up a Dashboard with an interactive map to provide users with a visual display of locations, from collecting coordinates to displaying locations that are click-enabled to display relevant data.2.8KViews8likes3CommentsCommunity Highlights: January 2025
1 MIN READ Happy February! Time flies! Just like that it's mid-February and that darn groundhog saw his shadow. While we may want to count the days until Springtime, we can't forget that January saw a lot of new faces and new discussions in our Community. It was also our first full month with the new design of the Community. We'd love to hear from you -- have you been enjoying the facelift Community received? Are there any features you love or hate? Comment below! Here's what we saw in January 2025: The Community had 28,099 visits in January 2025 and 90,609 page views We had 106 new discussions begin Reporting was our most active forum, with 33 new discussions Top Engaged Threads: Most Replies: BR Rule - BR api Error log Most Views: Primary and secondary axis align 0 point Most Active Members: Most Forum Replies: T_Kress Most Likes Received: sameburn Most Authored Solutions: MarcusH39Views1like0CommentsMeeting Notes: EMEA Technical User Group
2 MIN READ This past week we held our first Virtual EMEA Technical User Group with some great attendees from across our customer-base in EMEA. We had a few speakers from OneStream who spoke on performance- and security-related topics, which I have summarized below, and attached their presentations to this post. You can also watch the replay recording here. Thanks again to all those in attendance, and we look forward to holding these regularly. Stay tuned for more information to come! Performance session Aymar gave a presentation on performance, focusing on tips and tricks to avoid common pitfalls in application design and performance optimization. They discussed the importance of data units, how to keep them small, and the impact of consolidation on data unit size. They also shared best practices for data quality, importing, and calculation optimization. Albert provided insights on building efficient dashboards and running cube views, including filtering data at the source and using session data tables. Security session Terry covered security approaches for entities, workflows, and user dimensions, emphasizing the importance of naming conventions, child groups, and balancing maintenance, user experience, and data governance. Follow-up and Important Info Make sure to visit the OneStream Community and IdeaStream for interacting with OneStream and the broader developer community, and to submit ideas and feedback. We are planning an in-person developer activity/happy hour in London the week of March 24. Stay tuned for more info. Splash North America is happening in Nashville on May 13-15, 2025, and registration is open now! Splash EMEA is happening in London on October 13-15, 2025, and registration will open up in March!46Views2likes0Comments