Charlotte Foust
cfoust at infostatsystems.com
Tue Aug 8 19:06:07 CDT 2006
Same thing. Charlotte -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Rocky Smolin - Beach Access Software Sent: Tuesday, August 08, 2006 4:00 PM To: Access Developers discussion and problem solving Subject: Re: [AccessD] Removing a missing reference] Charlotte: Thanks for all the code. Unfortunately I'm getting the same problem when looking at this missing reference on your line of code strRefPath = objRef.FullPath. Error reads: Method 'FullPath' of object 'Reference' failed (A2K). I think it's because there is no reference there. The app being referred to isn't on the machine. So I think it's more a question of getting that box unchecked than deleting a reference which doesn't really exist (or are those the same things?). Thanks and regards, Rocky Charlotte Foust wrote: > Rocky, > > I won't guarantee this will work, but here's the code I finally came > down to several years ago. When you're checking references, you > cannot use any built-in constants, and everything has to be fully > disambiguated. > > Charlotte > > '******** Begin Module ********* > Attribute VB_Name = "basReferences" > Option Compare Database > Option Explicit > > Public Function TestReference() > ' loops through references collection and attempts to repair broken > references ' by removing and adding back the reference. For the > Redemption code library, ' attempts to set the reference to the folder > where this is placed by default. > ' Disambiguation is used to prevent this code from breaking when there > are broken ' references in the project. > > Dim objRef As Access.Reference > Dim strRefPath As String > Dim strFile As String > Dim strAccessPath As String > Dim strMsg As String > Dim strLogTxt As String > Dim intCount As Integer > > On Error GoTo TestReference_err > > ' *** this for testing only > strLogTxt = "Broken References = " & > Access.Application.BrokenReference > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) & "Runtime = " & > Access.Application.SysCmd(6) > RefAddEvent "REF", "TestReference", strLogTxt > ' *** > strLogTxt = "" > > ' check for broken references > For intCount = Access.Application.References.Count To 1 Step -1 > Set objRef = Access.Application.References(intCount) > > ' store the full path of the reference and the filename itself > strRefPath = objRef.FullPath > strFile = VBA.Mid(strRefPath, VBA.InStrRev(strRefPath, "\") + 1) > strRefPath = VBA.Left(strRefPath, VBA.InStr(strRefPath, > strFile) > - 1) > > ' if we're dealing with Redemption, try to set it to the > ' Access runtime path > If VBA.InStr(objRef.Name, "RIMCDORedemption") > 0 Then > strLogTxt = "Reference Path: " & objRef.Name & VBA.Chr(13) > & > VBA.Chr(10) _ > & objRef.FullPath > > ' store the runtime path > strAccessPath = Access.Application.SysCmd(9) > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) & > "Runtime > Engine: " & strAccessPath & VBA.Chr(13) & VBA.Chr(10) > > ' we need only the folder portion of the runtime path > strAccessPath = VBA.Mid(strAccessPath, 1, > VBA.InStrRev(strAccessPath, "\")) > > If VBA.Len(VBA.Dir(strRefPath & "RIMCDORedemptionXP.*", > 0)) = 0 Or _ > (objRef.Name <> "RIMCDORedemption" And > VBA.Len(VBA.Dir(objRef.Name, 0)) = 0) Then > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) & > "Broken reference: " & objRef.Name > > If VBA.Len(VBA.Dir(strAccessPath & > "RIMCDORedemptionXP.*")) = 0 Then > VBA.MsgBox "You must repair a broken reference > which will otherwise " _ > & "prevent the application from > functioning normally.", _ > 64, "Warning - Runtime Session Required" > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) > & "Not a runtime session." > Exit For > > Else > ' remove the broken and add it back > Access.Application.References.Remove objRef > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) > & "Broken Reference removed" > Access.Application.References.AddFromFile > strAccessPath & strFile > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) > & "Reference added: " _ > & VBA.Chr(13) & VBA.Chr(10) & > strAccessPath & strFile > > ' if any broken references were handled, recompile > the project > ' See MSKB 194374 for info on SysCmd hidden > arguments > ' Note that if we do NOT run the compile, the > repaired reference > ' does not seem to "stick" and this will run each > time the app opens > Access.Application.SysCmd 504, 16483 > strLogTxt = strLogTxt & VBA.Chr(13) & VBA.Chr(10) > & "Recompiled Application" > End If > End If > Exit For > End If > > Next intCount > > TestReference_exit: > On Error Resume Next > RefAddEvent "REF", "TestReference", strLogTxt > Set objRef = Nothing > Exit Function > TestReference_err: > RefAddEvent "ERROR", "TestReference: ", strLogTxt & VBA.Chr(13) & > VBA.Chr(10) & VBA.Err.Description > VBA.MsgBox VBA.Err.Description, 48, "Error " & VBA.Err.Number > Resume TestReference_exit > > End Function > > Private Sub RefAddEvent(strType As String, strDescription As String, > Optional strDetails As String, Optional fPrint As Boolean) > ' Purpose: create an event record of the required type > ' Arguments: strType - type of event - ERROR, STARTSTOP, BACKUP, > CODE, > ' COMMSIN, COMMSOUT, DELETE, ERROR, EXPORT, IMPORT, REPAIR > ' strDescription - simple description > ' strDetails - optional details > ' fPrint - automatically generates a printed report of the > event > ' strTitle - title for report if printed > ' Created: 26-Aug-97 By: SJW > ' Updated: 07-Oct-98 By: SJW - add A4 paper size options > ' Updated: 16-Mar-99 By: SJW - modify A4 paper size options > with SetpaperSize > > Dim rstEvent As DAO.Recordset > Dim lngTmp As Long > > On Error GoTo AddEvent_Err > > Set rstEvent = Access.CurrentDb.OpenRecordset("Select * from EventLog > where 1 = 2", 2) rstEvent.AddNew rstEvent!datTimeStamp = VBA.Now() > rstEvent!strType = strType rstEvent!strSystemID = "NONE" > > ' truncate the description to 255 chars just in case we have exceeded > it If VBA.Len(strDescription) > 255 Then > rstEvent!strDescription = VBA.Mid$(strDescription, 1, 255) > ' if we do not pass details then place the complete description in > details > If Len(strDetails) = 0 Then > rstEvent!memDetails = strDescription > End If > Else > rstEvent!strDescription = strDescription > If Len(strDetails) > 0 Then > rstEvent!memDetails = strDetails > End If > End If > lngTmp = rstEvent!lngID > rstEvent.Update > > AddEvent_Exit: > On Error Resume Next > rstEvent.Close > Set rstEvent = Nothing > Exit Sub > > AddEvent_Err: > VBA.MsgBox "Error: " & VBA.Err.Description, 48, "RefAddEvent" > Resume AddEvent_Exit > > End Sub > '******** End Module ********* > -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com