aanpassen module

Status
Niet open voor verdere reacties.

VB noob

Gebruiker
Lid geworden
11 feb 2009
Berichten
78
Ik heb in een access-database de volgende module:

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 IsNull(AnimalID) Then
        strSQL = "SELECT Min([tblSightings].[SightingDate]) AS FirstDate " & _
           "FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID " & _
            "WHERE tblAnimalsatSighting.AnimalID= " & AnimalID & ";"
        Set rst1 = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot, dbSeeChanges)
        rst1.MoveFirst
        DateFirstSeen = rst1!FirstDate
        rst1.Close
        Set rst1 = Nothing
    End If
    
    End Function

Deze werkt goed als de AnimalID in tblAnimalsatSighting voorkomt. Maar dit is niet altijd het geval.
Als het niet het geval is komt er een foutmelding. Foutmeldingen uitschakelen leidt tot het vastlopen van access.
Graag zou ik de module zo aan willen passen dat wanneer de AnimalID niet voorkomt in tblAnimalsatSighting dat hij als datum (het veld heeft als eigenschap "short date") geeft 01-01-1900.

Ik heb zitten nadenken hoe dit het beste aan te pakken, maar ik heb eerlijk gezegd geen idee.
Uitbreiden van de query in de module? Ik hoop dat iemand mij hier kan helpen.
 
Zoiets?

Code:
    If Not Nz(AnimalID, "") = "" Then
        strSQL = "SELECT Min([tblSightings].[SightingDate]) AS FirstDate " & _
           "FROM tblSightings INNER JOIN tblAnimalsatSighting ON tblSightings.SightingID = tblAnimalsatSighting.SightingID " & _
            "WHERE tblAnimalsatSighting.AnimalID= " & AnimalID & ";"
        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
 
Zelfde fout helaas, werkt dus wel als AnimalID voorkomt in tblAnimalsatSighting, maar een #error als hij er niet in voorkomt.
Ik zie waar je naartoe wilt, maar weet zelf niet hoe daar te komen.
Ik vermoed dat het mis gaat met:

If rst1.RecordCount > 0

Die is in dit geval volgens mij wel altijd groter dan 0 aangezien AnimalID wel altijd voorkomt in het formulier waar de module aangeroepen wordt. Of zit ik ernaast?
 
Hij is alleen groter als er een match is in de records. De bedoeling is eigenlijk dat de datum gestandaardiseerd wordt als de recordset leeg is. En daarom zit de rst1.Recordcount er in. Pas bij een gevonden record wil je dat de datum wordt opgezocht, anders is er geen record. De fout zou dan ook niet moeten zitten in de recordsetaanroep. Misschien dat je in de aanroep moet controleren of er een waarde is, bijvoorbeeld met Nz.
Voorkomen dus dat je een Null-waarde in de functie doet. Of eventueel AnimalID met Optional definieren. En dan de check of er een waarde is of niet.
 
Sorry, ik volg het niet helemaal.
Dit gaat me een beetje boven mijn pet:
Misschien dat je in de aanroep moet controleren of er een waarde is, bijvoorbeeld met Nz.
Voorkomen dus dat je een Null-waarde in de functie doet. Of eventueel AnimalID met Optional definieren. En dan de check of er een waarde is of niet.

Heb net wat of Nz zitten lezen en als ik het goed begrijp verandert dan Null's in 0-en.

Heb de query gewoon als query gerund en als de AnimalID niet voorkomt komt er dus niks terug. Nz zou dat omzetten in '0' of niet?
Heb het idee dat de oplossing nabij is, maar ik zie hem nog niet. Heb een beetje lopen klooien, maar dat was meer lukraak proberen dan dat er een idee achter zat :S
 
Juist in een query zou je in dit geval Nz kunnen gebruiken. Waarschijnlijk gebruik je in je query nu zo'n soort aanroep:
Expr1:DateFirstSeen([AnimalID])
Dat wordt dan:
Expr1:DateFirstSeen(Nz([AnimalID];0))
En daarmee vervang je een leeg veld (Null) door het getal 0. En daarmee geef je dus altijd een waarde door aan de functie, die niet meer op Null-waarden zal vastlopen.
 
Aha....maar...
De module wordt aangeroepen door een veld op het formulier. Dit was inderdaad met als control source: = DateFirstSeen ([AnimalID]), heb het veranderd naar: = DateFirstSeen (Nz([AnimalID];0)).
Nog steeds dezelfde foutmelding helaas.
Of moet de Nz ergens in de query zelf staan? De query zoals die in de module staat?
 
Heb je al getest of er überhaupt wel een record wordt opgehaald met de sql?
Zo niet, zet de sql dan in een inputbox, en plak de string in een nieuwe query, en kijk dan wat er uit rolt. Misschien zie je dan wat er aan de hand is.
 
De query werkt. Als de AnimalID voorkomt krijg ik gewoon een datum terug. Komt de AnimalID niet voor dan krijg ik een leeg veld.
Maar misschien zie ik iets over het hoofd. Heb een download-link naar het relevante deel van de database geupload: Hier (pfff. 1,7 MB uploaden naar rapidshare duurde meer dan 10 min vanaf hier :S ).
 
Ik zal er naar kijken.
Voor de overigen die ook een blik willen werpen: ik heb de db verkleind met <Extra>, <Database hulpprogramma's>, <Comprimeren en herstellen> en toen werd-ie klein genoeg voor een klein zipje... Dus die staat hier bij.
 

Bijlagen

Zoals ik al vermoedde, werkt de query niet.... Dat wil zeggen, hij doet het prima met records waar een datum gevonden wordt. Maar het probleem met jouw query is, dat hij ook een record teruggeeft als er géén AnimalID is. Weliswaar een leeg record, maar wel een record. En dan doet de rest van de functie het uiteraard niet, want de grap is nu juist dat je controleert of er minstens één record is.
In deze db is het probleem opgelost, met een iets andere basisquery.
Nog wel zelf even aanpassen voor de LastSighting...
 

Bijlagen

Onwijs bedankt! Het werkt, eerst werkte het nog ff niet, maar dat kwam omdat er een record was in tblAnimalsatSightings met een SightingID, maar in tblSightings had de SightingID geen Date...iets wat eigenlijk helemaal niet moet mogen. Er moet altijd een Date ingevoerd zijn. Heb dat nu ook ff aangepast.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan