Provided by Allen Browne, January 2008.
Avoid #Error in form/report with no records
Calculated expressions show #Error when a form or report has no records. This sort-of makes sense: if the controls don't exist, you cannot sum them.
In forms
The problem does not arise in forms that display the new record. It does occur if the form's Allow Additions property is Yes, or if the form is bound to a non-updatable query.
To avoid the problem, test the RecordCount of the form's Recordset. In older versions of Access, that meant changing:
=Sum([Amount])
to:
=IIf([Form].[Recordset].[RecordCount] > 0, Sum([Amount]), 0)
Access 2007 has a bug, so that expression fails, even with SP1 applied. You need a function.
Copy this function into a standard module, and save the module with a name such as Module1:
Public Function FormHasData(frm As Form) As Boolean
On Error Resume Next
FormHasData = (frm.Recordset.RecordCount <> 0&)
End Function
Now use this expression in the Control Source of the text box:
=IIf(FormHasData([Form]), Sum([Amount]), 0)
Notes
- Leave the [Form] part of the expression as it is (i.e. do not substitute the name of your form.)
- For Access 97 or earlier, use RecordsetClone instead of Recordset in the function.
- A form with no records still has display problems. The workaround may not display the zero, but it should suppress the #Error.
In reports
Use the HasData property property, specifically for this purpose.
So, instead of:
=Sum([Amount])
use:
=IIf([Report].[HasData], Sum([Amount]), 0)
If you have many calculated controls, you need to do this on each one. When Access discovers one calculated control that it cannot resolve, it gives up on calculating the others. Therefore one bad expression can cause other calculated controls to display #Error, even if those controls are bound to valid expressions.
For details of how to do this with subreports, see Bring the total from a subreport onto a main report.