Announcement
ABCFeatured Content
Recent Activity
Modifying SQL Editor component in Dynamic Dashboards not working
Hi there, I'm working on a client using the version 8.5.2 and I'm trying to use the Dynamic Dashboards functionallity to modify a property from a SQL Editor Component. The purpose of this logic is to set a dashboard in "ReadOnly" mode when the parameter is set, and in this case, the read only mode I want to achieve is by setting "ShowDataManipulationButtons = False". The BR logic used is the following: If Component.DashboardComponentType = DashboardComponentType.SqlTableEditor Then Dim sqlDefinition = XFSqlTableEditorDefinition.ReadXmlString(si,Component.XmlData) sqlDefinition.ShowDataManipulationButtons = False Component.XmlData = sqlDefinition.WriteXmlString(si) End If I have checked that after this point the component XmlData has changed, however, despite returning the modified component, the changes as not being displayed in the dashboard. If instead of modifying an SqlEditor component, I change any property on a Button component, the changes are being displayed correctly. Is this a known issue for the version 8.5.2 or is there any specific thing I might be missing for the SqlEditor component? PD: I know I can achieve creating a copy of the component, but it doesn't makes sense to do something twice (or ten times) when there is a way to solve it dynamically once for all. Thank you in advance!ogonzalez16 minutes agoNew Contributor II3Views0likes0CommentsIssue in Web Content and File Viewer component to directly open a HTML file in a browser
Dear community, I currently have an html document which is located in the file Explorer under "Documents/Public" folder. I am trying to get this HTML document to be presented into the components, embedded in a dashboard. However, with either a Web Content component or a File Viewer component (which will pinpoint to this specific file in Application Database File, as soon as I open the dashboard, it will load the html page into my default browser... I am using OS v8.1 ... is it a known bug or the expected behaviour ? What is even more strange, directing the Full File Name to a URL will correctly open a document in a dashboard ... Regards,Sergey21 minutes agoOneStream Employee3.3KViews0likes13CommentsHow to treat blank values for Source field and wanted to assign it to 'None' Target member
Hi Team, My validation step failed because the source mapping is missing for blank records. I attempted to add a mapping with (blank) for the source value and None for the target value, but it didn’t work. How should blank source values be handled in the mapping? Can you please help me with this if anyone face similar issue ? Thank youSolvedKK20121 hour agoNew Contributor III707Views0likes4CommentsBi Blend issue
I have a bi blend based on cube view md. One of the cells I have to put on the Y axis is obtained like this in the cv member filter: A#NA_00005:U4#PR_CORE:U5#TT How do I translate this in to BI Blend language and where? Thanks.giutor731 hour agoNew Contributor III9Views0likes0CommentsExcel Addin - Calculate
Hi, I am using OneStream version 8.2 and the Excel Add-In with a workbook that contains XFGetCell formulas. The workbook retrieves data successfully, and Refresh Workbook works as expected. However, the Calculate, Translate, and Consolidate buttons in the OneStream ribbon are disabled (grayed out). I am logged in successfully and can retrieve data through XFGetCell formulas, but I cannot perform any processing actions from Excel. Could anyone help me understand: What conditions must be met in OneStream 8.2 for the Calculate, Translate, and Consolidate buttons to become enabled? Is there any way to trigger Calculate, Translate, or Consolidate from Excel when working with XFGetCell-based templates? Thank you!Manju2 hours agoNew Contributor II7Views0likes0CommentsAccounting for Fiscal Year Calendars in LIM other than January to December.
DISCLAIMER: It should be noted that the focus of this technical guide is to provide general information, considerations, and guidelines for an identified topic. It is NOT to be interpreted as the ONLY approach nor a guarantee that there will not be any issues encountered by using this approach as a customer’s requirements or application configuration may render this guidance as not applicable.In addition, statements that “we believe” and similar statements reflect our beliefs and opinions on the relevant subject. These statements are based upon information available to us as of the date of this article, and while we believe such information forms a reasonable basis for such statements, such information may be limited or incomplete, and our statements should not be read to indicate that we have conducted an exhaustive inquiry into, or review of, all potentially available relevant information. OneStream does not warrant as to the accuracy of this guidance, which is provided on an as-is basis. Any forward-looking statements contained herein are based on information available at the time those statements are made and/or good faith beliefs and assumptions as of that time with respect to future events and are subject to risks and uncertainties that could cause actual performance or results to differ materially from those expressed in or suggested by the forward-looking statements. Considering these risks and uncertainties, the forward-looking events and circumstances discussed in this guide may not occur and actual results could differ materially from those anticipated or implied in the forward-looking statements. VERSION: PV900 SV200 PLATFORM: 9.X PURPOSE: to provide an example that you can leverage as part of your LIM build. RESOLUTION: First, create the following set of 4 date fields in your register: StartDate = required field and will be the start date that comes in from your source data and visible to users EndDate = required field and will be the start date that comes in from your source data and visible to users StartDateOffset = Used by LIM as the “Start Date” field for calculations but will be hidden from users and populated through custom date offset code. EndDateOffset = Used by LIM as the “End Date” field for calculations but will be hidden from users and populated through custom date offset code There are 3 places in which register data can be added: WsComponentService = File import or Direct Connect WsDynamicGridService = Add rows directly in dynamic grid WsTableViewService = Adding rows in Spreadsheet So, you will need to add custom code to all 3 places to handle populating the date offset fields. Below walks through the code to be added to all 3 places. In the custom workspace you set up for your custom code (e.g. Workforce Planning Custom 1) go into the custom event handler you created (see other OC post for how to set this up: LIM: Example of Setting up my Customizations Outside of LIM’s Workspace(s) for Future Upgrades | One...), e.g. your Workforce Planning Custom 1 > Code Only (LIM) > CustomEventHandler_LIM > WsComponentService.cs file, add the following code: In your Workforce Planning Custom 1 > Code Only (LIM) > CustomEventHandler_LIM > WsDynamicGridService.cs file, add the following code: In your Workforce Planning Custom 1 > Code Only (LIM) > CustomEventHandler_LIM > WsTableViewService.cs file, add the following code: In your Settings > Security > Register Columns page be sure to restrict the date offset column visibility to just administrators. This is because these fields are used to drive calculations but will confuse users if they are visible. Ensure that any formulas that refer to the Start or End Date fields, do so to the StartDateOffset and EndDateOffset fields since those fields are the ones that drive the calculations behind the scenes. By setting StartDateOffset and EndDateOffset in the register as the true start and end date fields, calculations will already take this into account but if you have used any of those register fields further in formulas, you will need to revisit those to ensure they are referring to the correct date field to account for calendar differences. When you import register data, the following should happen by example: Focusing on employee ID #1, we can see the following: Start Date = 7/1/2025 in MM/dd/yyyy format End Date = 6/1/2026 in MM/dd/yyyy format If your company is a July to June Fiscal calendar then those should appear as follows: Start Date = 7/1/2025 = 2025M1 in LIM End Date = 6/1/2026 = 2025M12 in LIM Without the date offset logic, they will appear incorrectly as follows: Start Date = 7/1/2025 = 2025M7 in LIM End Date = 6/1/2026 = 2026M6 in LIM To correct these dates in calculations, the following will correctly happen: Start Date Offset = 1/1/2025 in MM/dd/yyyy format so this will appear as 2025M1 in LIM calculated data End Date Offset = 12/1/2026 in MM/dd/yyyy format so this will appear as 2025M12 in LIM calculated data When mapping data to the cube the data source should appear as follows: This ensures that the data appears in the correct periods within LIM (2026M1 = July 2026….2026M12 = June 2026) and when loaded to the cube.T_Kress3 hours agoOneStream Employee13Views0likes0CommentsExcel Add-in - Quick view - Style for dates
Hi everyone ! We'd like to recover data in a date format using Quick Views. First step is to setup a CubeView that can recover this data. To do so, the CubeView setup is done in "Cell Type = Date " in the Data tab of the given line on the CubeView definition. Then data can be correctly input in the CubeView: . This particular date is saved as 639,160,344,000,000,000 (numeric value) in the data base. Next step it to recover this data using the quickview, but I can't get the correct style. It seems that the data in Onestream is different to that of the Excel date style (Excel starts from 1/1/1900 as day 1). Does anyone know how to properly set up the style to recover dates using a QuickView? Thank you Carlos7Views0likes0CommentsHow to report on Entity Security changes
Hi all! Anyone know of the best way to report on security changes made to an entity? I can't seem to figure out the right table or the right member property that shows the security updates made to a member so any direction would be greatly appreciated! Full disclosure - also have a OS support ticket out there and patiently waiting :)SolvedNicoleBruno23 hours agoValued Contributor34Views1like3CommentsDatabuffer not working in an WS Assembly rule but is working in a Business Rule
Hi, I ran into an issue that a data buffer rule does not work in a workspace assembly but does work in the Business Rules area. The data buffer rule is the one found in this forum topic and is relatively simple. See link. Question: Is there an option to clear non-calculated data in a “bulk” (as known from hs.clear) other than looping through the data buffer and use “SetDataCell” (which has a higher performance impact)? The “ClearCalculatedData“ is not impacting input/imported data – right? | OneStream Community I have this rule in an existing custom calculate rule in the assembly and the rule fails to get the source data buffer. I take this same rule and include it in a new Business Rule and it runs fine. Rules that work in the business rules should work in assemblies also.SolvedLIM: Example of Register Field Population from a Workspace File 3
DISCLAIMER: It should be noted that the focus of this technical guide is to provide general information, considerations, and guidelines for an identified topic. It is NOT to be interpreted as the ONLY approach nor a guarantee that there will not be any issues encountered by using this approach as a customer’s requirements or application configuration may render this guidance as not applicable. In addition, statements that “we believe” and similar statements reflect our beliefs and opinions on the relevant subject. These statements are based upon information available to us as of the date of this article, and while we believe such information forms a reasonable basis for such statements, such information may be limited or incomplete, and our statements should not be read to indicate that we have conducted an exhaustive inquiry into, or review of, all potentially available relevant information. OneStream does not warrant as to the accuracy of this guidance, which is provided on an as-is basis. Any forward-looking statements contained herein are based on information available at the time those statements are made and/or good faith beliefs and assumptions as of that time with respect to future events and are subject to risks and uncertainties that could cause actual performance or results to differ materially from those expressed in or suggested by the forward-looking statements. Considering these risks and uncertainties, the forward-looking events and circumstances discussed in this guide may not occur and actual results could differ materially from those anticipated or implied in the forward-looking statements. VERSION: PV900 SV200 PLATFORM: 9.2.0 USE CASE: your customer wants a standard repository to store supplementary information to be used to populate certain Register Fields. In this example, a list of job codes and its descriptions is handled as a Spreadsheet component within an OneStream dashboard. Every time a user selects a job code or inputs a job code in the Register, the expectation is that the Job Code Description register field is populated with the description that is from this workbook. PURPOSE: to provide you with an example that you can leverage as part of your build, whether you decide to incorporate this to existing input options (Register, Spreadsheet, Import File, Connector). NOTE(S): my example assumes that this file is a .csv, not .xlsx and it is placed in the target Workspace as part of the Files section. ASSUMPTIONS: The relevant Register Fields have already been created. In my example, I have JobCode and JobCodeDescription register fields. The .csv is uploaded to the workspace as a Workspace file. A simple dashboard that allows the Administrator or select users to update the file. I will be splitting this approach into three articles - 1 which will cover WsComponentService, 2 which will cover WorkforcePlanningImportRegisterConnector, and 3 which will cover WsDynamicGridService and WsTableViewService. WsDynamicGridService: Register Below is an example of how I arranged my logic within my BeforeEvent. The below is an example of the logic associated with populateJobCodeDesc1. The screenshots as code below. private static void populateJobCodeDesc1(SessionInfo si, DashboardDynamicGridArgs args) { List<string> invalidJobCodes = new List<string>(); // Load the dashboard file into memory bool isSystemLevel = false; string sourceWorkspaceName = "Workforce Planning Custom"; Guid workspaceIDIfNotInName = BRApi.Dashboards.Workspaces.GetWorkspaceIDFromName(si, isSystemLevel, sourceWorkspaceName); string fileName = "spd_JobCodes.csv"; DashboardFileResource sourceFile = BRApi.Dashboards.FileResources.GetFileResource(si, isSystemLevel, workspaceIDIfNotInName, fileName); string textContent = System.Text.Encoding.UTF8.GetString(sourceFile.FileBytes); // Split into lines string[] lines = textContent.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); // Detect delimiter from the first line char delimiter = ','; if (lines.Length > 0) { string firstLine = lines[0]; if (firstLine.Contains("\t")) delimiter = '\t'; else if (firstLine.Contains(";")) delimiter = ';'; else if (firstLine.Contains("|")) delimiter = '|'; // Default stays as comma } // Parse file into dictionary: JobCode -> JobCodeDesc Dictionary<string, string=""> jobCodeLookup = new Dictionary<string, string="">(StringComparer.OrdinalIgnoreCase); foreach (string line in lines) { string[] parts = line.Split(delimiter); if (parts.Length >= 2) { string code = parts[0].Trim(); string desc = parts[1].Trim(); if (!jobCodeLookup.ContainsKey(code)) { jobCodeLookup[code] = desc; } } } // now process the edited rows if (args.SaveDataArgs != null) { foreach (XFEditedDataRow row in args.SaveDataArgs.EditedDataRows) { if (row.InsertUpdateOrDelete != DbInsUpdateDelType.Update) continue; string jcName = row.ModifiedDataRow.Items["JobCode"].ToString(); string empId = row.ModifiedDataRow.Items["EmployeeID"].ToString(); string jcDescription = null; try { if (jobCodeLookup.TryGetValue(jcName, out jcDescription)) { row.ModifiedDataRow.Items["JobCodeDescription"] = jcDescription; } else { // Not found in file = invalid job code invalidJobCodes.Add($"EmployeeID {empId}, JobCode {jcName}"); row.ModifiedDataRow.Items["JobCodeDescription"] = null; } } catch { // Any exception = treat as invalid invalidJobCodes.Add($"EmployeeID {empId}, JobCode {jcName}"); row.ModifiedDataRow.Items["JobCodeDescription"] = null; } } } if (invalidJobCodes.Count > 0) { string errorMessage = "Invalid job codes detected:" + Environment.NewLine + string.Join(Environment.NewLine, invalidJobCodes); throw new XFException(si, new Exception(errorMessage)); } }</string,></string,></string></string> WsTableViewService: Spreadsheet Below is an example of how I arranged my logic within my BeforeEvent. The below is an example of the populateJobCodeDesc1 logic. Because I am pulling from a SQL and then processing each table view-related row one by one, it is more performant to have the XFC table cached once in memory. It is also important to only process rows with the valid information so I have a section to identify which rows to skip. The screenshots as code below. private static void populateJobCodeDesc1(SessionInfo si, BRGlobals brGlobals, DashboardWorkspace workspace, TableView tableView) { // Load the workspace file into memory bool isSystemLevel = false; string sourceWorkspaceName = "Workforce Planning Custom"; Guid workspaceIDIfNotInName = BRApi.Dashboards.Workspaces.GetWorkspaceIDFromName(si, isSystemLevel, sourceWorkspaceName); string fileName = "spd_JobCodes.csv"; DashboardFileResource sourceFile = BRApi.Dashboards.FileResources.GetFileResource(si, isSystemLevel, workspaceIDIfNotInName, fileName); string textContent = System.Text.Encoding.UTF8.GetString(sourceFile.FileBytes); // Split into lines string[] lines = textContent.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); // Detect delimiter from the first line char delimiter = ','; if (lines.Length > 0) { string firstLine = lines[0]; if (firstLine.Contains("\t")) delimiter = '\t'; else if (firstLine.Contains(";")) delimiter = ';'; else if (firstLine.Contains("|")) delimiter = '|'; // Default stays as comma } // Parse file into dictionary: JobCode -> JobCodeDesc Dictionary<string, string=""> jobCodeLookup = new Dictionary<string, string="">(StringComparer.OrdinalIgnoreCase); foreach (string line in lines) { string[] parts = line.Split(delimiter); if (parts.Length >= 2) { string code = parts[0].Trim(); string desc = parts[1].Trim(); if (!jobCodeLookup.ContainsKey(code)) { jobCodeLookup[code] = desc; } } } var invalidJobCodes = new List<string>(); foreach (var row in tableView.Rows) { //identify rows to skip if (row.IsHeader) continue; var originalStatus = row.Items["Status"].Value?.ToString(); if (string.IsNullOrWhiteSpace(originalStatus)) continue; if (!row.Items["JobCode"].IsDirty()) continue; string jcName = row.Items["JobCode"].Value?.ToString(); string empId = row.Items["EmployeeID"].Value?.ToString(); if (jobCodeLookup.TryGetValue(jcName, out var jcDescription)) { row.Items["JobCodeDescription"].Value = jcDescription; } else { invalidJobCodes.Add($"EmployeeID {empId}, JobCode {jcName}"); row.Items["JobCodeDescription"].Value = null; } } if (invalidJobCodes.Count > 0) { string errorMessage = "Invalid job codes detected:" + Environment.NewLine + string.Join(Environment.NewLine, invalidJobCodes); throw new XFException(si, new Exception(errorMessage)); } }</string></string,></string,> Read Part One Read Part Two24Views0likes0Comments
Getting Started
Learn more about the OneStream Community with the links below.