[AccessD] Removing a missing reference]

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



More information about the AccessD mailing list