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