Rules to Better Interfaces (Reports, Charts and Dates)
Since 1990, SSW has supported the developer community by publishing all our best practices and rules for everyone to see.
If you still need help, visit Website Design and User Experience and book in a consultant.
Line graphs are used to track changes over short
and long periods of time. When smaller changes exist, line graphs are
better to use than bar graphs. Line graphs can also be used to compare
changes over the same period of time for more than one group.
Pie charts are best to use when you are trying to compare parts of a whole. They do not show changes over time.
Bar graphs are used to compare things between
different groups or to track changes over time. However, when trying to
measure change over time, bar graphs are best when the changes are
This is a fancy way of saying use the right graph for
the right purpose. Pie graphs fulfill a specific requirement, unlike a
bar graph which is more multi-purpose.
Date formats should always be kept consistent across your application, more importantly,
it should be kept consistent with the operating system's regional settings otherwise
this will cause significant confusion for your users.
Time formats should be consistent across your application, to give the
application a very professional and consistent look.
- Figure: Bad Example - Three screens with inconsistent time formats
- Figure: Good Example - Three screens with consistent formats
In Outlook, the Calendar control has a number of important features:
- Saturday and Sunday are displayed at the end.
- Days that have data associated with them are bold
- The current day is highlighted with a box
Users are familiar with the Outlook calendar control. When the calendar control
is used it should incorporate all of these features of the Outlook calendar
Figure: Bad Example - Calendar Control - Sunday is at the front, today's date is
not highlighted, and items with data are not bolded
Figure: Good Example - Calendar Control - Monday is at the front, today's date
is highlighted, and items with data are bolded
We have a program called SSW Code Auditor
check for this rule.
When you are carrying out reporting (using Reporting
Services) based on some OLAP cube you should change the "All Caption"
property of each dimension to be have the value "All". By default the
caption for the dimension will be "All " (e.g. All
Products). This default is distracting when used in reporting solutions
and doesn't particularly clarify anything anyway.
When designing custom applications you want to include branding on reports.
You should always include a useful and informative footer at the bottom of your reports.
- Date and Time Printed and User who printed it - see warning below (e.g. Printed by SSW2000\JatinValabjee on 3/1/2006 3:16:30 PM)
- Execution Time (e.g. Execution time: 1 minute, 10 seconds)
- Page x of y (e.g. Page 3 of 10)
- Link to company website + slogan (e.g. www.ssw.com.au - Writing software people understand)
- Bad Example - This footer doesn't provide any useful information
- Good Example - Useful and informative information should be displayed in your report footer
Use these handy report expressions to show the above information.
NOTE: Do not use System.DateTime.Now for your Execution Time because if you do it will return the result at time of printing the document/PDF. Instead store the value in a variable (for example GroupExecutionTime) and then call that.
|Footer Item||Expression||Sample Output|
|Date and Time Printed / User ID||="Printed by " + User!UserID + " on " +
Globals!ExecutionTime.ToString()||Printed by SSW2000\JatinValabjee on 3/1/2006 3:16:30 PM|
="Execution Time: " +|
IIf((Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0
IIf((Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours > 0, (Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
IIf((Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes > 0, (Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ",
IIf((Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds > 0, (Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
|Execution time: 1 minute, 10 seconds|
Page x of y
="Page " + Globals!PageNumber.ToString() + " of " +
Page 3 of 10|
- Good Example - Footer in visual studio designer
Warning: Adding the User who printed it stops all data-driven subscriptions
When you try to add the User your data-driven subscriptions will fail with the following error:
'The '/GroupHealth' report has user profile dependencies and cannot be run unattended. (rsHasUserProfileDependencies)'.
A quick workaround is to add a user function to fallback the error to a nice message, like: "SYSTEM",
Public Function UserName()
Use above function to replace your reference to Report.User!UserID will allow the subscription to work correctly.
- Have Selection for filters e.g. Date Ranges
- Have Selection for chart options e.g. Show Legend
- Don't have selection for chart groupings e.g. By Month or By Product
- Crystal and Access these are built into the report and it is very complex to
have a generic solution.
- Also it is disorientating for the user to have this as a selection