Best Of
How to create bar chart in Data View
1. Abstract
This article describes a specific use case: visualizing a bar chart in a data view object.
2. Context
In some projects, it can be asked to render a bar chart in a data view object, to provide an immediate visual representation of the numerical values directly in line with the data. This allows users to more quickly grasp patterns, trends, or outliers without having to mentally compare raw numbers, improving readability and supporting faster decision-making.
While adding a Sparkline isn’t exactly the same, it still delivers meaningful value. For simpler use cases, it provides a flexible and user-friendly solution—powered by Excel formulas, making it easy for end-users to tailor as needed. Although the solution doesn't offer a precise graphical representation, it effectively supports visual trend recognition and offers a high-level perspective of the values..
3. Content
3.1 Horizontal bar chart in a table
3.1.1 Simple case
Simple cases is to show bars based on values, with a fixed scale.
In order to show bars is using the REPT function in algorithm, repeating the character █ (“full block”):
- Name: Full Block
- Unicode: U+2588
- Symbol: █
In this example values are scaled by 10.
Figure 1:Simple Bar Chart
The algorithm is a simple text algorithm with the simple formula rept("█",a/10):
Figure 2:Algorithm definition
Given that the █ is a regular character, the color can be easily manage with the alerts:
Figure 3. Alert configuration
Based on different option, alert color can be desaturated or not having these 2 different possible effects:
Figure 4. Data View options
Figure 5. Two possible styles
3.1.2 Simple Case - Positive and Negative values
The simple case shown before can manage only positive values. In order to be able to display in the same columns both positive and negative values it is needed to adjust the formula and the formatting to correctly display values.
Using the same example, where we want to represent the values on a scale of 10, we need to manage the number of empty blocks starting from the left:
- In case of positive values: 10 empty blocks
- In case of negative values: 10 – value to represent/10
Figure 6. Schema
In order to correctly fill with space the same width of █ we used 2 spaces “ “, but it is necessary to format the block with the font Verdana, given that with this font the width are comparable.
Figure 7. Block Format
Final algorithm formula is (where “a” is the block containing the data we want to represent):
if(a=0,"",if(a>0,REPT(" ",10)&REPT("█",ROUND(ABS(a) / 10, 0)), REPT(" ",10-ROUND(ABS(a)/ 10, 0))&REPT("█",ROUND(ABS(a) / 10, 0))))
Figure 8. Schema with formulas
Explaining the formula:
- If a= 0 : mange the case where a =0 showing an empty string: “”.
- If a >0 : It starts with10 double spaces (" " repeated 10 times) to create left padding. Then it appends a number of block characters (█). The number of blocks is calculated by:ROUND(ABS(a) / 10, 0)
- If a<0: First, it creates(10 - block count) double spaces to push the blocks to the right. Then, it appends the same number of blocks as above. This creates a mirrored visual effect for negative values.
Figure 9. Bar chart for positive and negative values with Alerts
3.1.3 Scaling values
The previous examples used a fixed scale. However, it’s common to adjust the scale to better reflect the distribution of values and enhance visual clarity. As shown in the earlier example, using a fixed scale when dealing with smaller values can diminish the visual impact, making differences harder to perceive.
Figure 10. Compare bar chart with and without scaling
Values used in bar chart need to be scaled, using the simple rule (if we want to represent based on a 0 to 10 values scale):
Where Xmax = MAX( abs(x)).
The method we need to use to calculate scaled value is using Nexel, which is the only method that allow to calculate the Maximum value in a given table’s column.
So braking the calculation in different steps (assuming block “a” contains the value we need to represent):
- Calculate the absolute value, can be a normal Algorithm “abs(a)” or in Nexel ABS([@A ;*;*])
- Calculate the Max of the absolute values. Nexel formula : =MAX([@b ;*;*;Range.Vertical]) where “b” is the block containing the previously calculated absolute values.
- Calculate the scaled value, Nexel formula =[@b ;*;*]/[@c ;*;*]*10 where b is the block with absolute values while c is the MAX value block
- Use the scaled value in a text Nexel algorithm in repeat function:
=if([@a ;*;*]=0,"",
if([@a;*;*]>0,
REPT(" ",10)&REPT("█",[@d ;*;*]),
REPT(" ",10- [@d ;*;*]) &REPT("█",[@d ;*;*])
)
)
Figure 11. Calculation results using Nexel
Instead of being calculated in 4 different blocks, the formula can be combined except for ABS value that needs to be calculated in a dedicated block, since the system is not able in one combined rule to calculated the max of the absolute values in the vertical range.
So, once we have block “a” with values and “b” with ABS(a), we can implement the Nexel formula:
=if([@a;*;*]=0,"",
if([àa;*;*]>0,
REPT(" ",10)&REPT("█",ROUND(@a;*;*] / MAX([@b ;*;*;Range.Vertical])*10, 0)),
REPT(" ",10-ROUND(abs([@a;*;*]) / MAX([@b ;*;*;Range.Vertical])*10, 0)) & REPT("█",ROUND(abs([@a ;*;*]) / MAX([@b ;*;*;Range.Vertical])*10, 0))
)
)
Note that this approach only works if the block is left-aligned. If you require center alignment, you must ensure that all rows have the same total length by adding padding (spaces) accordingly. The Nexel formula remains the same, but you'll need to include the appropriate number of spaces to balance the positive (10 - a) and negative values (10 spaces) for proper alignment:
=if([@a ;*;*]=0,"|",
if([@a;*;*]>0,
REPT(" ",10)&rept("█",ROUND([@a;*;*] / MAX([@c ;*;*;Range.Vertical])*10, 0))&REPT(" ",10-ROUND(ROUND([@a;*;*] / MAX([@c ;*;*;Range.Vertical])*10, 0), 0)),
REPT(" ",10-ROUND(abs([@a;*;*]) / MAX([@c ;*;*;Range.Vertical])*10, 0))&REPT("█",ROUND(abs([@a ;*;*]) / MAX([@c ;*;*;Range.Vertical])*10, 0))&REPT(" ",10)
)
)
Figure 12. Bar with central alignment
Then, for sure, all not needed blocks can be hidden in final Data View.
Given that the graphical representation is based on 10 blocks it is not precise in representing the data. One small enhancement can be achieved using the characters:
- Left half block: “▌” (U+258C), to be used as last colored block for positive values
- Right half block: “▐” (U+2590) to be used as first colored block for negative values
With an easy rework of the formula to repeating the "█" for the integer of the scaled value ( int(<scaled value>) ), and adding the half block if the remaining decimal are close to 0.5.
Final effect will be like in following table:
Figure 13. Use of half blocks
Here below an example where the delta % is displayed in Data View, using color Alerts:
Figure 14. Bar chart for Delta %
Additional information can be added close to chart’s bar, like the value using the adding the formula at the end: &" "&ROUND([@c ;*;*],2)&"%"))
Figure 15. Bar and Values
Also in this case if we use also half blocks we’ll get more precise representation:
Figure 16. Bar and Values with half blocks
3.1.4 Normalized value
If the need is to represent a value like turnover or volume, it would be better to normalize it in a scale. We can use the same principle with the only difference that we need to use a different formula to normalize values.
In this case we want to represent values based on a scale from 0 to 20.
So the formula we need to apply is:
Again using Nexel we are calculating the Max and the Min value of our data set, and then based on this the normalized values that can be used for graphical representation:
Figure 17. Bar chart representing Normalized Actual Volume
In the image are shown two different possibilities, where we are displaying only the bar or the bar followed by the values.
The same table can be used adding the row filter to display the top or the bottom n items (It may be needed to unflag the “Keep totals” to make it working):
Figure 18. Sorting option
So we easily display, like in the example, the top 5 and the bottom 5 customers, keeping the same scale:
Figure 19. Top and bottom 5 customers
3.2 Suggestions and Technical Limitations
Since calculation are Nexel based, this solution is subject to all Nexel limitations and rules, see Board Manual.
The main recommendation is: KEEP IT SIMPLE.
The approach described in this article is intended for straightforward scenarios where you want to add a high-level, visually impactful representation of data directly within a table layout. It leverages Nexel formulas and simple text-based logic—not as a replacement for standard charting tools like bar charts or sparklines, which remain the best options for accurate data visualization.
While this method is relatively easy to implement in basic layouts, it can quickly become difficult to scale, maintain, and optimize in more complex situations—such as when dealing with large data volumes, intricate calculations, or advanced layout configurations.
Use Nexel thoughtfully, especially considering performance and maintainability. This technique is not recommended when working with "entity by column" or "blocks with Detail by" enabled, as these configurations significantly increase implementation complexity.
Additionally, note that Nexel is not supported in vertically aligned layouts.
Groups
The bar chart representation described here can be used with multiple entities displayed in rows. However, keep in mind that the Max and Min values are calculated within each group—this means the scale is consistent only within the same group, and comparisons across groups may be misleading.
Figure 20. Scaling with row groups
Drill Down
This solution also works with drill-down functionality. However, note that the scale is recalculated at each drill-down level, so the proportions may vary from one view to another. This can lead to inconsistencies when comparing values across different drill-down levels.
Figure 21. Drill down behavior
Unbalance Hierarchy
It can be used also when the entity by row is an unbalanced hierarchy, but extra care is required. In these cases, it is especially important to keep the layout as simple as possible and to thoroughly test the solution, including edge cases and deeper hierarchy levels. Always verify that the visual representation behaves as expected across all scenarios to ensure consistency and clarity.
Figure 22. Usage with Unbalanced Hierarchy
If row grouping is applied in combination with an unbalanced hierarchy, the same limitation on scale consistency between groups still applies:
Figure 23. Unbalanced Hierarchy and Groups
Looking for all Execution flow -> "Server command" steps in procedures with the Impact Analysis
Good morning,
Recently we have been trying to solve an issue related to the server commands launched with some database procedures.
We needed to find out all the procedures that have a step for launching an external process, like a python script for example. And now that the Metadata feature is not available anymore, the Impact Analysis feature is the only way to study all the database related information.
But in this case, this Impact Analysis feature is not able to solve this issue, as there is no filter for steps in a procedure.
That is the reason we have decided to open this idea, in case it can be considered for future improvements.
Thank you.
Diagnostic Log Levels Customization
Board's diagnostic logging currently follows a fixed order of detail levels, meaning you can't pick only certain message types without including previous levels. This often fills logs with unnecessary information, making troubleshooting harder.
The idea is to allow selecting individual log levels (like Fatal, Error, Information) instead of the fixed order. For example, you could choose to see Error and Information messages but exclude Warnings, which isn't possible now.
This change would improve troubleshooting by focusing logs, reduce log file sizes by excluding unwanted messages, and allow custom logging setups for monitoring specific needs. It helps save time by simplifying log analysis.
Improvement of text data entry saving in DataView when using an RTF cube
As the title implies; improved text data entry saving in DataView. Please add a “Save” option within the text editor to allow saving without closing it.
When using an RTF cube for text data entry in a DataView, users currently need to close the text editor and use the sliding toolbar to save changes. It would enhance the usability to place a "Save" option within the editor to allow saving without closing the screen. This is a highly requested enhancement.
Closer integration between Board Data Models
With the concept of applications or solutions leveraging a more "modular" data model approach, an idea I would have is closer integration of multiple Board data models. A simple example would be an FPA Planning model with an HR planning module. In this example I could see two different data models:
- Data model which contains the core planning pieces including the final P&L report.
- Data model which contains the HR planning. This would have entities that would not be incorporated into the P&L report such as "Employee" which is specific to the HR Planning module. There would also be security that is specific to this data model.
Currently if I set up multiple data models and try to sync between them I have a few options:
- In the source data model I need to export a cube or cubes into flat files and load these into the target data model via ASCII data readers.
- Leverage Board APIs to create flat files which I then have to create ASCII data readers into the target data model.
What I'm asking for is a way to bypass the step of creating flat files and having direct integration between Board data models:
- Potentially a new type of data reader (Board Data Reader) which allows me to connect to a data model on the same server instance.
- This would allow me to connect to a cube on the other data model and allow me to map appropriately to a cube on the target data model.
I could of course create procedures around this like any other data reader, but the key improvement here is skipping the flat file export and ASCII data reader step.
I think with more modular designs leveraging multiple data models, closer integration will be very beneficial moving forward.
Card object - Align text
We request the possibility to align (to the left, right, center, top, bottom, middle) and format the text inside the card object.
In our use case, we would like to use the card to display a log that track changes to the initiatives that we manage in Board. Each time a field is changed for a specific entity, a log is generated and written on a new member of our log cube.
This card object seems to fit very well our use cases as each new log could be displayed in a separate box and we could also use other text cube to display the author of the change and its timestamp.
The only limitation is that at the moment, the text inside the card object can only be displayed centered to the middle but we would like the log to be written as a regular text aligned to the left as it is quite ugly otherwise.
Nicola
Coming Soon: The Board Cloud Status Page
Board is excited to announce that the Board Cloud Status Page is coming soon!
This new platform will provide customers and partners with real-time visibility into the health of Board Cloud services — including ongoing incidents, planned maintenance, and service availability across regions and environments.
What You Can Expect
- Transparency: Instant updates about incidents or maintenance affecting your environment.
- Control: A clear view of regional and tenant health, with direct access to history and performance reports.
- Proactive Communication: Email alerts and in-page notifications to keep you informed at every stage.
Why It Matters
This initiative is part of our broader effort to strengthen trust, reliability, and operational excellence.
Launch Plans
We are finalizing the rollout and will share more details in the coming weeks, including how to access your personalized environment view and subscribe to updates.
Stay tuned to the Board Community for the official launch announcement and a detailed walkthrough of the new platform.
Together, we’re making Board Cloud more reliable, transparent, and connected than ever.
Option to replace blanks or zero's with dash "-" in data views
Hi Team,
It would be ideal if we had the option to replace blanks or zero's with a dash "-" in Data views. This would support reporting requirements for our government customers.
In the entity row formatting and data view block formatting, we need an option to replace blanks and/or zero's with a dash "-". Something similar to "Format negative numbers with parentheses" formatting functionality we currently have.
The presentation of a "-" is mandatory for all government financial publications.
Thank you!
Memorize Tab Position in Presentations
Dear Product Support,
Context:
As an Operational User I often design presentations where the screens contains Tab Objects. When I register a screen for my presentation while being positioned on the 2nd or 3rd tab (but not the 1st one) and then share this presentation with my Top Management the following issue occurs:
As a Top Manager I received the presentation, when landing on the screen, the first object in the tab will always be displayed first regardless of which tab when saving the screen to the presentation.
This behavior introduces a constraint - the recipient cannot know which tab I intended to highlight (2nd, 3rd …?).
Problem:
It creates frustration and increase the risk that important information may be missed.
Workarounds:
- Reorganizing the tab order based on importance, so the most critical tab appears first. → however, Tab priority may differ depending on the recipient (operational vs management)
- Using the comment functionalities in the presentation to provide navigation guidelines. → requires user action
- Create separate screen for each tab → maintenance effort
Suggested Improvement:
It would be very helpful if the presentation could memorize the last active tab position
Eg.
It displays the tab that was active when the screen was added to the presentation.
Thanks for your consideration,
Ibrahima,
Translations in Localization
Hello All
Doing translations in Board could be less tedious if :
*we could work by datamodel (at least have selectable information in columns)
*we could copy and paste translations from one environment to another
*Board would suggest existing translations straight away (in some cases, you'd have to do this several times) or use IA for translating
* we could sort the labels to be translated in alphabetical order
































