Charlotte Foust
cfoust at infostatsystems.com
Tue Jan 20 10:05:20 CST 2009
Que? Access 95 was the first version to use VBA.
Charlotte Foust
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
Sent: Tuesday, January 20, 2009 6:36 AM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] Application Error logging
Sorry for the delay getting back to you.
NOTE: This stuff will not work in Access 97 due to the fact that 97 did
not have the VBA Editor.
To use my error logging system you need to download and install MZ-Tools
3.0.
http://www.mztools.com/v3/mztools3.aspx
MZ-Tools provides a method of inserting an error handler into code.
Unfortunately there is no method of just blasting it into a bunch of
functions, or a bunch of different modules so you are faced with a
function by function retrofit. However for new code this is not an
issue of course.
Once you have MZ-Tools 3.0 installed, open Access and open any code
module. The MZ-Tools tool bar should now appear in the code editor
window.
At the extreme right of that toolbar there is an icon containing a
crossed hammer and wrench. Click that icon and an Options dialog should
open. This is where you set up MZ-Tools to your liking.
Click on the Error Handler tab and insert the following code (watch for
line wraps):
On Error GoTo Err_{PROCEDURE_NAME}
{PROCEDURE_BODY}
Exit_{PROCEDURE_NAME}:
On Error resume next
Exit {PROCEDURE_TYPE}
Err_{PROCEDURE_NAME}:
Select Case Err
Case 0 '.insert Errors you wish to ignore here
Resume Next
Case Else '.All other errors will trap
Beep
LogErr Err.Number, Err.Description, Erl, cstrModule,
"{PROCEDURE_NAME}"
Resume Exit_{PROCEDURE_NAME}
End Select
Resume 0 '.FOR TROUBLESHOOTING
Click on the Module Header tab and insert the following code:
'-----------------------------------------------------------------------
----------------
' Module : {MODULE_NAME}
' Author : {AUTHOR}
' Date : {DATE}
' Purpose :
'-----------------------------------------------------------------------
----------------
Const cstrModule As String = "{MODULE_NAME}"
Click the OK button to close the Options Dialog and save the changes.
In the VBA editor create a new module. Save the module and name it
basErrLog or something similar. Watch for line wraps.
Private Declare Function GetComputerName _
Lib "kernel32" Alias "GetComputerNameA" ( _
ByVal lpBuffer As String, nSize As Long) As Long
Private Const MAX_COMPUTERNAME_LENGTH As Long = 15&
'Type the following procedure:
Public Function CurrentMachineName() As String
On Error GoTo Err_CurrentMachineName
Dim lSize As Long
Dim sBuffer As String
sBuffer = Space$(MAX_COMPUTERNAME_LENGTH + 1)
lSize = Len(sBuffer)
If GetComputerName(sBuffer, lSize) Then
CurrentMachineName = Left$(sBuffer, lSize)
End If
Exit_CurrentMachineName:
Exit Function
Err_CurrentMachineName:
Select Case err
Case 0 '.insert Errors you wish to ignore here
Resume Next
Case Else '.All other errors will trap
Beep
MsgBox err.Description, , "Error in Function
basWorkStationName.CurrentMachineName"
Resume Exit_CurrentMachineName
End Select
Resume 0 '.FOR TROUBLESHOOTING
End Function
'To test this function, type the following line in the Debug
window, and then press ENTER:
'Print CurrentMachineName()
In this new module insert the following code:
'-----------------------------------------------------------------------
----------------
' Procedure : LogErr2
' Author : jwcolby
' Date : 8/4/2008
' Purpose :
'-----------------------------------------------------------------------
----------------
'
Function LogErr(intErrNo As Integer, strErr As String,
Optional lngLineNo As Long = 0, Optional strModule As String
= "", Optional strFunction As String = "", Optional
strExtraExplanation As String = "", Optional blnSilentLog As
Boolean = False, Optional strSilentLogMsg As String = "") As
Integer
Dim rs As ADODB.Recordset
On Error GoTo Err_LogErr
Dim lstrErr As String
Dim lstrErrMsg As String
LogErr = intErrNo
lstrErrMsg = strErr
lstrErrMsg = Replace(lstrErrMsg, "'", "")
lstrErr = lstrErrMsg
If Len(strExtraExplanation) > 0 Then
lstrErr = lstrErr & vbCrLf & vbCrLf &
strExtraExplanation
End If
Set rs = New ADODB.Recordset
With rs
On Error Resume Next
.Open "usystblErrLog", gcnn, adOpenKeyset,
adLockPessimistic
If err = 0 Then
.AddNew
!ErrLog_No = intErrNo
!ErrLog_Msg = lstrErr
!ErrLog_Module = strModule
!ErrLog_Function = strFunction
!ErrLog_LineNo = lngLineNo
!ErrLog_WSName = CurrentMachineName()
!ErrLog_IDUser = gclsFW.LWSCls.UserCls.UserPEID()
!ErrLog_FEVersion = gclsFW.pFEVersion
.Update
.Close
Else
MsgBox "No error log table available to log
errors in"
End If
End With
Set rs = Nothing
Exit_LogErr:
On Error Resume Next
rs.Close
Set rs = Nothing
Exit Function
Err_LogErr:
Select Case err
Case 0 '.insert Errors you wish to ignore here
Resume Next
Case Else '.All other errors will trap
Beep
LogErr err.Number, err.Description, Erl,
cstrModule, "LogErr"
Resume Exit_LogErr
End Select
Resume 0 '.FOR TROUBLESHOOTING
End Function
Notice that my framework provides a currently logged in user
ID as well as a FE version number. You need to replace
those function calls with similar code from your own system
or just replace them with a hard coded number (0 for the ID)
and string ("") for the FE version number.
//**********************************************************************
**
Next you need to create a table in your BE, and link it into
your FE. The table needs to have the following fields:
ErrLog_ID Autonumber
ErrLog_No Long Holds the Err.No
ErrLog_Msg Memo Holds the error message
ErrLog_Module Text Holds the name of the module
ErrLog_Function Text Name of the function
ErrLog_LineNo long Error line number
ErrLog_WSName text Workstation name
ErrLog_IDUser long Logged in user ID
ErrLog_Dte dateTime Date of error
ErrLog_Time datetime Time of error
ErrLog_ExtraInfo Memo Other info about error
ErrLog_FEVersion text FE version creating error
To use, in the code editor, place your cursor into any
function with no error handler. In the MZ-Tools toolbar
click the Add Error Handler button. An error handler will
be inserted into that function. Also click the Add Module
Header button (once per module) to insert a constant at the
top of the module which is the name of the module.
Repeat for any function that needs an error handler.
The one thing I miss about my old error handler insertion
wizard was the ability to do this to an entire project but
alas, it does nto exist and the author is not doing any
enhancements to MZ-Tools. However it works and with an hour
or two of work you can retrofit an entire application.
Let me know if I missed anything, or there is anything you
can't figure out.
John W. Colby
www.ColbyConsulting.com
Rocky Smolin at Beach Access Software wrote:
> John:
>
> I'd be interested. I have a client who was looking for something like
this
> for an app one function of which runs unattended from Windows
scheduler at
> night. Supposed to email reports to his clients. Any glitch and the
thing
> stops and he comes in in the morning to find an error message on the
screen.
>
> TIA
>
>
> Rocky Smolin
> Beach Access Software
> 858-259-4334
> www.e-z-mrp.com
> www.bchacc.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com