Avatar billede snowball Novice
15. februar 2005 - 13:47 Der er 16 kommentarer og
2 løsninger

Invalid use of Null efter brug af ApplyFilter funktion

Hej.

Jeg har overtaget en gammel Access97 frontend hvor der er følgende funktion:

Sub Command122_Click()
On Error GoTo Err_Command122_Click

    Dim FilterInput As String
    Dim QuNo As String
    Dim QuNoNull As String
    Dim myMsg As String
    Dim NewLine As String
   
    NewLine = Chr(10) & Chr(10)
   
        Refresh
1      FilterInput = InputBox("Write ONLY Quotation No. Example 126000")
        If FilterInput = "" Then
        Exit Sub
        End If
        Me![Test] = FilterInput
        DoCmd.ApplyFilter "ProspectsListFilterNo", ""
        DoCmd.GoToControl "QuotationNo"
        DoCmd.GoToRecord , "", acLast
        QuNo = Me![QuotationNo]
        QuNoNull = Format(QuNo, "###0")
        If FilterInput <> QuNoNull Then GoTo 1
        DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
        DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
        DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append
        QuNo = Format(QuNo, "###0.00")
        QuNo = QuNo + 0.0101
        Me![QuotationNo] = QuNo
        Me![22] = Me![QuotationNo]
        DoCmd.ShowAllRecords
        DoCmd.OpenForm "Prospects list rev", acNormal, "", "", acEdit, acNormal

Exit_Command122_Click:
    Exit Sub

Err_Command122_Click:
    myMsg = "Der er opstået en fejl" & NewLine & _
            "Fejlbeskrivelse: " & Err.Description & NewLine & _
            "Fejl nr.: " & Str(Err.Number) & NewLine & _
            "Genereret af: " & Err.Source
         
    MsgBox myMsg, , "Fejl", Err.HelpFile, Err.HelpContext
   
    Resume Exit_Command122_Click
   
End Sub

Problemet er at ApplyFilter funktionen ikke altid virker. Query'en "ProspectsListFilterNo" henter nogle data fra en tabel ud fra det man angiver i InputBox'en. Nogle gange returnerer den bare et tomt recordset selvom der findes gyldige data ud fra det kriterie man har angivet. Hvis jeg kører query'en manuelt, så finder den fint de data som den af en eller anden årsag ikke kan finde når man bruger ApplyFilter funktionen.

Eftersom den ikke altid finder nogen data, så fejler funktionen når den når til QuNo = Me![QuotationNo] da "QuotationNo" feltet jo er tomt. Fejlen den kommer med er fejl nr. 94, "Invalid use of Null".

Hvad kan årsagen være til at query'en ikke altid returnerer data når man bruger ApplyFilter funktionen?

På forhånd tak.
15. februar 2005 - 14:54 #1
Prøv med disse smændringer:

Sub Command122_Click()
On Error GoTo Err_Command122_Click

    Dim FilterInput As String
    Dim QuNo As variant
    Dim QuNoNull As variant
    Dim myMsg As String
    Dim NewLine As String
   
    NewLine = Chr(10) & Chr(10)
   
        Refresh
1      FilterInput = InputBox("Write ONLY Quotation No. Example 126000")
        If FilterInput = "" Then
        Exit Sub
        End If
        Me![Test] = FilterInput
        DoCmd.ApplyFilter "ProspectsListFilterNo"
        DoCmd.GoToControl "QuotationNo"
        DoCmd.GoToRecord , , acLast
        QuNo = Me![QuotationNo]
        QuNoNull = Format(QuNo, "###0")
        If FilterInput <> QuNoNull Then GoTo 1
        DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
        DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
        DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append
        QuNo = Format(QuNo, "###0.00")
        QuNo = QuNo + 0.0101
        Me![QuotationNo] = QuNo
        Me![22] = Me![QuotationNo]
        DoCmd.ShowAllRecords
        DoCmd.OpenForm "Prospects list rev", acNormal, , , acEdit, acNormal

Exit_Command122_Click:
    Exit Sub

Err_Command122_Click:
    myMsg = "Der er opstået en fejl" & NewLine & _
            "Fejlbeskrivelse: " & Err.Description & NewLine & _
            "Fejl nr.: " & Str(Err.Number) & NewLine & _
            "Genereret af: " & Err.Source
         
    MsgBox myMsg, , "Fejl", Err.HelpFile, Err.HelpContext
   
    Resume Exit_Command122_Click
   
End Sub
Avatar billede snowball Novice
15. februar 2005 - 15:15 #2
Eftersom en Variant godt kan være Null så kommer fejlen ikke længere, men den finder stadig ikke data ved ApplyFilter. Dermed er FilterInput <> QuNoNull eftersom QuNo = Null og så bliver InputBox'en blot vist igen.
15. februar 2005 - 17:21 #3
hmm, jeg kan ikke helt gennemskue, hvad det hele gør. Og da størstedelen af filteret ligger i ProspectsListFilterNo, så er det svært for mig at se hvad der går galt.

Jeg kan heller ikke lige huske, hvad de 3 DoMenuItem-linier gør.
Avatar billede snowball Novice
16. februar 2005 - 08:18 #4
Simpel udgave - alt det andet er ikke nødvendigt i denne sammenhæng:

Sub Command122_Click()
On Error GoTo Err_Command122_Click

    Dim FilterInput As String
    Dim QuNo As Variant
    Dim QuNoNull As Variant
    Dim myMsg As String
    Dim NewLine As String
   
    NewLine = Chr(10) & Chr(10)
   
        Refresh
1      FilterInput = InputBox("Write ONLY Quotation No. Example 126000")
        If FilterInput = "" Then
        Exit Sub
        End If
        Me![Test] = FilterInput
        DoCmd.ApplyFilter "ProspectsListFilterNo"
        DoCmd.GoToControl "QuotationNo"
        DoCmd.GoToRecord , , acLast

        QuNo = Me![QuotationNo]
        QuNoNull = Format(QuNo, "###0")
        If FilterInput <> QuNoNull Then GoTo 1

Err_Command122_Click:
    myMsg = "Der er opstået en fejl" & NewLine & _
            "Fejlbeskrivelse: " & Err.Description & NewLine & _
            "Fejl nr.: " & Str(Err.Number) & NewLine & _
            "Genereret af: " & Err.Source
         
    MsgBox myMsg, , "Fejl", Err.HelpFile, Err.HelpContext
    Exit Sub
End Sub

Query'en ProspectsListFilterNo ser sådan her ud:

SELECT DISTINCTROW [Quotation costomers].Responsible, [Quotation costomers].QuotationNo
FROM [Quotation costomers]
WHERE ((([Quotation costomers].QuotationNo) Like [Forms]![ProspectsListAll]![Test] & "*"))
ORDER BY [Quotation costomers].Responsible, [Quotation costomers].QuotationNo;

[Forms]![ProspectsListAll]![Test] er det felt som indtastningen af InputBox'en bliver gemt i.
16. februar 2005 - 08:29 #5
okay, jeg har en svag teori om, at ProspectsListFilterNo ikke kan aflæse den korrekte værdi fra tekstboksen - simpelthen fordi feltet/ændringen endnu ikke er nået at blive ordentligt 'registreret' i systemet.

Men hvorfor ikke gøre op med den lidt besværlige metode og blot gøre således:

Sub Command122_Click()
On Error GoTo Err_Command122_Click

    Dim FilterInput As String
    Dim QuNo As Variant
    Dim QuNoNull As Variant
    Dim myMsg As String
   
        Refresh
1      FilterInput = InputBox("Write ONLY Quotation No. Example 126000")
        If FilterInput = "" Then
            Exit Sub
        End If
        DoCmd.ApplyFilter ,"QuotationNo = '" & FilterInput & "'"
        DoCmd.GoToControl "QuotationNo"
        DoCmd.GoToRecord , , acLast

        QuNo = Me![QuotationNo]
        QuNoNull = Format(QuNo, "###0")
        If FilterInput <> QuNoNull Then GoTo 1

Err_Command122_Click:
    myMsg = "Der er opstået en fejl" & vbNewLine & _
            "Fejlbeskrivelse: " & Err.Description & vbNewLine & _
            "Fejl nr.: " & Str(Err.Number) & vbNewLine & _
            "Genereret af: " & Err.Source
         
    MsgBox myMsg, , "Fejl", Err.HelpFile, Err.HelpContext
    Exit Sub
End Sub

NB: Bemærk iøvrigt, at jeg helt fjernede variablen NewLine, da der allerede findes et linieskift, som hedder vbNewline
Avatar billede snowball Novice
16. februar 2005 - 09:01 #6
Nu fejler ApplyFilter funktionen med fejlen "The ApplyFilter action was canceled". Skal man ikke også stadig have "ProspectsListFilterNo" delen med? (Det hjalp dog ikke at tilføje det!)
16. februar 2005 - 09:30 #7
Nej, de 2 argumenter i Docmd.Applyfilter er begge valgfri.

I stedet for DoCmd.ApplyFilter ,"QuotationNo = '" & FilterInput & "'", så prøv denne:

Me.Filter = "QuotationNo = '" & FilterInput & "'"
Me.Filteron = true

Prøv evt også at sætte ' foran denne linie:
'On Error GoTo Err_Command122_Click

Derved får du mulighed for at trykke debug og derefter se hvilken linie, der fejler.
Avatar billede snowball Novice
16. februar 2005 - 10:08 #8
Det virker stadig ikke helt.

Me.Filter = "QuotationNo Like '" & FilterInput & "*'"

Med ovenstående så virker det som da vi startede - altså den finder ikke alle data man søger efter selvom de reelt findes. Søgningen skal være en LIKE da man skal kunne søge efter starten af tallet.

QuotationNo feltet som der søges på er som følgende:

Data type: Number
Field size: Double
Format: Fixed
Decimal places: 4
Required: Yes
Indexed: Yes (No dublicates)

Eftersom feltet er et tal, så kan jeg ikke helt forstå hvorfor der skal ' omkring værdien, men hvis jeg fjerner dem, så får jeg blot fejlen "You can't assign a value to this object" - det er Me.Filter den stopper ved.
16. februar 2005 - 10:15 #9
Jeg vidste ikke at det var nummerisk. Men FilterInput er string, derfor gik jeg bare ud fra, at feltet også var tekst.

Men prøv denne istedet:
Me.Filter = "QuotationNo = " & FilterInput
16. februar 2005 - 10:16 #10
Jeg kan godt se, at det giver lidt problemer med LIKE-operatoren.

Måske skal prøve denne:

Me.Filter = "cstr(QuotationNo) = '" & FilterInput & "*'"
Avatar billede snowball Novice
16. februar 2005 - 10:44 #11
Virker stadig ikke :(

Har prøvet at lave det om en til DoCmd.RunSQL i stedet for, men kan heller ikke helt få det til at virke.

"WHERE [Quotation costomers].QuotationNo LIKE 123456* "

Ovenstående virker fint hvis man kører det i en decideret query, men kører jeg det via en RunSQL, så får jeg en "Syntax error (missing operator) in query expression '[Quotation costomers].QuotationNo LIKE 123456*' fejl.

Utroligt det skal være så bøvlet :|
16. februar 2005 - 10:47 #12
hmm, ja det virker underligt! Jeg har da heller ikke haft problemer med det tidligere...

Hvis du kører det i en query, ser SQL'en så ud på præcis samme måde? Eller indsætter Access ' eller " eller lign.?
Avatar billede snowball Novice
16. februar 2005 - 10:55 #13
De er ens - der ændres ikke på noget.
Avatar billede snowball Novice
16. februar 2005 - 13:33 #14
Har lavet et par test, og det viser sig at søgningen returnerer ikke noget når tallet man søger efter er 300000 eller derover - 299999 eller mindre virker fint. Hvorfor det er sådan, forstår jeg så slet ikke!?
16. februar 2005 - 13:40 #15
hmm, det lyder heller ikke normalt. Du har ikke tilfældigvis prøvet at komprimere databasen, vel? Den slags unoder kan godt opstå, hvis der er fejl på databasen...
Avatar billede snowball Novice
16. februar 2005 - 13:46 #16
Har prøvet både Compact og Repair, men problemet er der stadig. Har også prøvet at importere data over i en helt ny database, men det hjalp heller ikker.
Avatar billede snowball Novice
16. februar 2005 - 14:11 #17
*suk*

Så fandt jeg endelig løsningen. Det viste sig at den tidligere programmør havde indsat en spærring i en query som køres før den dette spørgsmål omhandler. I den query havde han valgt at den kun skal hente poster der netop har nummeret under 300000 :o)

Lav et svar - så deler vi så du får nogle point som tak for forsøget :)
Avatar billede snowball Novice
16. februar 2005 - 14:12 #18
DOH! Du har jo allerede svaret ;)

Nå, men tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester