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.​​

Hold on a second! How would you like to view this content?
Just the title! A brief blurb! Gimme everything!
  1. Charts - Do you make graphs easy to digest?

    Graphs are a great way to display data in an easy to follow visual format. Some graphs, however, are easier to read than others. We recommend staying away from 3-D Graphs and keeping it simple! If you have complex data, it's also a good idea to display 2 or 3 simpler graphs rather than one complex one - the aim of the game is to make digesting the information as simple as possible for your audience.

    Understandable Graphs
    Figure: Good Example - Are your graphs simple to understand?
    Understandable Graphs
    Figure: Bad Example - When there's more than four preceptual units, a graph becomes hard to digest
    Understandable Graphs
    Figure: Good Example - You can split your graphs to make them easer to understand
  2. Charts - Do you use bar graph rather than pie graph?

    Line graph
    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 Chart
    Pie charts are best to use when you are trying to compare parts of a whole. They do not show changes over time.

    Bar Graph
    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 larger.

    https://nces.ed.gov/nceskids/help/user_guide/graph/whentouse.asp 

    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.

    Pie graphs are used to show the general composition of an element. It's good for seeing at a glance what section is dominating, but it doesn't handle details very well.

    Bad Label
    Figure: Bad Example - This Pie Graph is too complicated and difficult to understand.
    Good Label
    Figure: Good Example - This Pie Graph has been simplified and it is easy to see at a glance that Nike sold the most sneakers this month compared to others.
    Good Label
    Figure: Good Example - This Bar Graph data hasn't even been processed but it's still readable.
  3. Dates - Do you keep Date formats consistent across your application?

    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.

    OS Regional Settings
    Figure: Operating System's Regional Settings
    Bad Example
    Figure: Bad Example - Two screens with inconsistent date formats
    Good Example
    Figure: Good Example - Two screens with consistent date formats

    The best way to do this in your code is to grab the culture information from the application thread and use it to automatically format your Datetime data type. Do not use hard coded datetime formatting strings unless it's absolutely necessary.

    startTimeTextBox.Text = resultResults.StartTime.ToString("dd/MM/yyyy hh:mm:ss");
                        
    Figure: Bad Example - using hard coded formatting string
    'VB.NET
    'Initial CultureInfo settings for the application
    Public initialCulture As CultureInfo
    ...
    ...
    txtDateCreate.Text = CType(txtDateCreate.Tag, System.DateTime).ToString(initialCulture.DateTimeFormat)
                        
    Figure: Good Example - Using culture info to format datetime
  4. Dates - Do you keep Time formats consistent across your application?

    Time formats should be consistent across your application, to give the application a very professional and consistent look.

    Bad Example
    Figure: Bad Example - Three screens with inconsistent time formats
    Good Example
    Figure: Good Example - Three screens with consistent formats
  5. Dates - Do you use Calendar controls effectively?

    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 control.

    Calendar Control
    Figure: Bad Example - Calendar Control - Sunday is at the front, today's date is not highlighted, and items with data are not bolded
    Calendar Control
    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 to check for this rule.
  6. Reports - Do you always make sure the dimensions All Captions = All?

    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.

    Read more

  7. Reports - Do you have a standard Report footer?

    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.

    Include:
    1. ​​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)
    2. Execution Time (e.g. Execution time: 1 minute, 10 seconds)
    3. Page x of y (e.g. Page 3 of 10)
    4. Link to company website + slogan  (e.g. www.ssw.com.au - Writing software people understand)
    RSRulesBadFooter.gif
     
    Bad Example - This footer doesn't provide any useful information


     

    RSRulesGoodFooter.gif 

    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 ItemExpressionSample 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 ="Execution Time: " +
    IIf((Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds",
    (
    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 " + Globals!TotalPages.ToString() Page 3 of 10
    ​​​

    footerInDesigner.gif
     

    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()
    Try
    Return Report.User!UserID
    Catch
    Return "System"
    End Try
    End Function   


    Use above function to replace your reference to Report.User!UserID will allow the subscription to work correctly.

  8. Reports - Do you keep Reporting criteria simple?

    1. Have Selection for filters e.g. Date Ranges
    2. Have Selection for chart options e.g. Show Legend
    3. 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