Access 2003 naar Access 2010 conversie probleem DAO 3.6

Status
Niet open voor verdere reacties.

VB noob

Gebruiker
Lid geworden
11 feb 2009
Berichten
78
Ik loop tegen een probleem aan met een database gebouwd in Access 2003 die nu geconverteerd is naar Access 2010.
In de 2003 versie een volgende module was toegevoegd:
Code:
Public Function DateFirstSeen(AnimalID As Integer) As Date

    Dim strSQL As String
    Dim rst1 As DAO.Recordset ' do not forget to add a reference to DAO
   
        If Not Nz(AnimalID, "") = "" Then
        
        strSQL = "SELECT Min(tblSightings.SightingDate) AS FirstDate " _
            & "FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID " _
            & "GROUP BY tblAnimalsatSighting.AnimalID " _
            & "HAVING (tblAnimalsatSighting.AnimalID= " & AnimalID & ");"

''        strSQL = "SELECT Min([tblSightings].[SightingDate]) AS FirstDate " & _
           "FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID " & _
            "WHERE tblAnimalsatSighting.AnimalID= " & AnimalID & ";"
            Dim tmp
''            tmp = InputBox("", "", strSQL)
        Set rst1 = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot, dbSeeChanges)
        If rst1.RecordCount > 0 Then
            rst1.MoveFirst
            DateFirstSeen = rst1!FirstDate
        Else
            DateFirstSeen = DateSerial(1900, 1, 1)
        End If
        rst1.Close
        Set rst1 = Nothing
    End If
    
    End Function

In access 2010 krijg ik dit niet werkend. De DAO 3.6 recordset krijg ik niet toegevoegd ("Name conflicts with existing module, project or object library").
En ik begrijp dat ik eigenlijk de Microsoft Office 14.0 object library moet gebruiken (die is dan ook al toegevoegd).
Maar hoe krijg ik bovenstaande code werkend met de MO 14.0 library?

Kan iemand me daarmee helpen?

Gr,

VB Noob
 
Je hebt in Access 2010 vermoedelijk de DAO 6.0 bibliotheek actief staan. Die moet je eerst uitzettten, en daarna de database opslaan. Vervolgens kun je de DAO 3.6 weer activeren.
Daarna de database compileren en herstellen.
 
Volgens mij heb ik de DAO 6.0 bibliotheek niet actief staan. Zie de printscreen voor wat ik actief heb staan:

attachment.php
 

Bijlagen

  • object libraries.jpg
    object libraries.jpg
    94,8 KB · Weergaven: 607
Laatst bewerkt:
Zet zoveel mogelijk bibliotheken uit, en probeer de db dan nog eens te compileren. Probeer de DAO 6.0 ook nog eens te activeren. Anternatief: haal de DAO verwijzing weg uit je declaratie. Dus zo:
Code:
Dim rst1 As Recordset
Op deze pagina staat hoe je de bibliotheken kunt herstellen. Misschien is dat de oplossing.
 
DAO 6.0 of ADO 6.0? Ik kan geen DAO 6.0 in de lijst vinden, wel ActiveX Data Objects 6.0 en 'ADO Ext. 6.0 for DDL and Security'.

De DAO verwijzing weghalen helpt niet.
Ook 'ADODB.recordset' ipv 'DAO.recordset' helpt niet.

Eigenlijk zou de 14.0 object library het werk toch moeten kunnen doen?

Het resultaat van de module op dit moment is: '#type!'

Wat ik will doen is de eerste datum weergeven waarop het betreffende dier is gezien.

Ik kan hier een simpele query voor schrijven, maar die wordt in een aantal verschillende formulieren gebruikt, vandaar dat ik er een module van had gemaakt.

Hier is de code van de query:
Code:
SELECT TOP 1 tblAnimalsatSighting.AnimalID, tblSightings.SightingDate, tblSightings.SightingID
FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID
WHERE (((tblAnimalsatSighting.AnimalID)=[Give Animal-ID]))
ORDER BY tblSightings.SightingDate;
 
Je hebt gelijk; dat krijg je er van als je alles uit het hoofd wil doen :) DAO is nog steeds 3.6; ADO zit ondertussen op 6.0.
In oudere Access versies (voor 2000) werd gebruik gemaakt van de Jet 3.5.1 Engine. Die kon je aanspreken met DAO 3.5. Vanaf Access 2000 maakte Microsoft gebruik van Jet 4.0, en daarvoor had je DAO 3.6 nodig. In 2010 is de Jet engine vervangen door ACE. Deze kun je ook aanspreken vanaf de DAO API, dus dat zal op zich geen probleem zijn. Maar in 2010 wordt de acedao.dll (ACECORE.DLL) bibliotheek geladen, en niet meer MSJET40.DLL. Dus daar kun je ook nog problemen mee krijgen.

Met een macro die je bij VBAxpress kunt downloaden (weliswaar in Excel, maar simpel om te bouwen naar een Msgbox in Access) kun je checken of hij geladen is. En met deze routine kun je ontbrekende vewijzingen verwijderen.
 
Laatst bewerkt:
Dit gaat een beetje boven mijn pet. De macro's in beide routines krijg ik niet omgebouwd. En als ik ze omgebouwd heb, hoe voeg ik ze dan toe? Moet ik ze toevoegen aan een bestaande module? Of aan een bestaande macro? En waar moet dan dan precies?

Als ik het resultaat probeer te laten zien met een DLookup dan krijg ik als resultaat '#error' die continue blijft flikkeren...

Code:
=DLookUp("[SightingsDate]";"DateFirstSeenAnimal";"[AnimalID]=Form.AnimalID")

En DateFirstSeenAnimal:
Code:
SELECT TOP 1 tblAnimalsatSighting.AnimalID, tblSightings.SightingDate, tblSightings.SightingID
FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID
WHERE (((tblAnimalsatSighting.AnimalID)=[Give Animal ID]))
ORDER BY tblSightings.SightingDate;
 
Laatst bewerkt:
MIsschien ... , heb je de database eerst gedecompileerd?
Soms wil dat wel eens helpen

Gr.. Jan
 
Ik heb een functie gemaakt die in Access de geladen bibliotheken checkt. Die kun je in een willekeurige (nieuwe of bestaande) module zetten, en draaien.

Code:
Function ListAllCheckedRefs()
Dim oLibRef As Reference

    On Error GoTo NoAccess
    For Each oLibRef In References
        MsgBox oLibRef.Name & vbLf & oLibRef.Guid & vbLf & oLibRef.Major & "." & oLibRef.Minor
    Next oLibRef
    Exit Function

NoAccess:
    Select Case Err.Number
        Case 1004
            MsgBox "You will need to set the {TRUST ACCESS TO VISUAL BASIC PROJECT} setting" & vbNewLine & _
            "When the dialog appears, go to the Trusted Sources tab, " & _
            "check the setting, click OK, and rerun this code again", 64
        Case Else
            MsgBox Err.Description
    End Select
End Function
 
En, een beetje vergelijkbaar met bovenstaande code, een functie die (als het goed is) kapotte referenties repareert.

Code:
Function FixUpRefs()
Dim loRef As Access.Reference
Dim intCount As Integer
Dim intX As Integer
Dim blnBroke As Boolean
Dim strPath As String

    On Error Resume Next

    'Count the number of references in the database
    intCount = Access.References.Count

    'Loop through each reference in the database and determine if the reference is broken.
    'If it is broken, remove the Reference and add it back.
   
    For intX = intCount To 1 Step -1
        Set loRef = Access.References(intX)
        With loRef
            blnBroke = .IsBroken
            strPath = .FullPath
            If blnBroke = True Or Err <> 0 Then
                strPath = .FullPath
                With Access.References
                    .Remove loRef
                    .AddFromFile strPath
                End With
            End If
        End With
    Next

    Set loRef = Nothing

    ' Call a hidden SysCmd to automatically compile/save all modules.
    Call SysCmd(504, 16483)
End Function
 
Geladen zijn:
VBA 4.1 = Visual Basic For Applications (standaard)
Access 9.0 = Microsoft Access 14.0 Object library (standaard)
stdole 2.0 = OLE Automation (om plaatjes zichtbaar te maken via een module die ze ook resized in een OLE veld)
DAO 12.0 = Microsoft Office 14.0 Access database engine Object library
Shell32 1.0 = Microsoft Shell controls and automation (voor een file picker window)
Office 2.5 = Microsoft Office 14.0 Object library

Als ik de code run om kapotte referenties te repareren zie ik niks gebeuren, en het resultaat van de eerste code is daarna ook hetzelfde.
De functie werkt nog steeds niet, zelfde resultaat.

Zou ik een van de Office 14.0 libraries moeten verwijderen? Maar die heb ik wel nodig eigenlijk.
 
Je kunt proberen een nieuwe db te maken, en daar alle tabellen, queries, formulieren, rapporten en modules in te importeren. Dan zou hij in beginsel moeten werken. Overigens heb je voor de functie hierboven geen Office referentie nodig, daarvoor heb je aan DAO al genoeg.
Dus als je alles importeert in een 'schone' database, en daarna de db compileert in het VBA venster, dan zie je middels de foutmeldingen die je krijgt vanzelf welke bibliotheken je aan moet zetten.
 
Zal ik proberen en laten weten hoe het gaat. Maar dat gaat waarschijnlijk een paar dagen duren, komende dagen druk met reizen.
 
Als ik alles importeer dan is het resultaat precies hetzelfde. Ik heb het nog even opgezocht, maar eerder werkte het wel (in een versie van de database van vorige maand).
Hoe 'compileer' ik de database precies in het VBA venster? Ik heb nu alles geimporteerd (tabellen, formulieren, queries, rapporten, macro's en modules). Alles werkt, behalve dus dat veld.
Morgen ben ik de hele dag in het veld, moeten een val zetten om een luipaard te vangen om te verlossen van zijn veels te strakken halsband van een onderzoeker die hier een paar jaar geleden vertrokken is. Maar als ik het goed ik ben 's avonds weer terug.
 
Heb je alles tegelijk geïmporteerd, of in delen? Dat laatste heeft op zich de voorkeur, want dan kun je ongeveer bepalen in welke formulieren of rapporten (daar gaat het meestal fout) het probleem zit.
een db compileren doe je in het VBA venster met het menu <Foutopsporing>, <Database compileren>.
Eventueel mag je de db ook wel naar me opsturen, dan kijk ik wel of ik 'm aan de praat krijg in 2010.
 
Had eerst alles tegelijk geimporteerd, en dat werkte dus niet.
Daarna in delen, met hetzelfde resultaat.
Toen de database gecompileerd, boel overbodige dingen eruit gehaald, maar nog steeds werkt het niet.
Is het het beste om de hele database op te sturen (~40MB) of een uitgeklede versie waarin het nog steeds niet werkt (~6MB).
 
Je kunt beginnen met de uitgeklede versie; als die werkend is te krijgen, dan kun je daarna kijken of de aanpassingen ook in de productie versie werken.
 
Ik kon het probleem inderdaad reproduceren, maar door een instelling in <Opties> aan te passen, bleek het toch mogelijk om de DAO bibliotheek goed te laden. Zet in de groep <Algemeen> de <Sorteervolgorde voor nieuwe databases> op <Algemeen> en comprimeer de db nog een keer. Daarna kun je de bibliotheken die je nodig hebt (DAO, Office etc) selecteren. Overigens moet je de db daarna nog Compileren, want er zitten nog wel wat foutjes in. Ik vermoed dat de problemen veroorzaakt worden door de procedure <IsCalcTableField> die alleen schijnt te werken in Access 2010. De standaard sorteervolgorde (Algemeen - Verouderd) is gebaseerd op Access 2007.
 
Heb de bibliotheken uitgeschakeld, sorteervolgorde aangepast, db gecomprimeerd, vervolgens de bibliotheken weer geselecteerd (overigens vreemd, als ik 'Microsoft Office 12.0 Access Database Engine Objects' selecteer komt hij als 'Microsoft Office 14.0 Access Database Engine Objects' in de lijst van geselecteerde bibliotheken te staan!).
Compileer de database, krijg daarbij geen foutmeldingen (heeft misschien ermee te maken dat ik je maar een deel heb opgestuurd?), maar als ik het formulier open werkt het nog steeds niet bij mij.
Werk overigens wel met Access 2010...
 
Ik gebruik ook Access 2010, dus dat zal het probleem niet zijn. Heb je de DAO bibliotheek nog geselecteerd? Want daar zat dacht ik in eerste instantie het probleem.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan