Avatar billede virtualdurran Nybegynder
12. december 2005 - 14:26 Der er 20 kommentarer og
1 løsning

Søg i database med VBA

Jeg har lavet en database i access og skal nu bruge et filter, som kun viser indhold med en bestemt dato. Jeg har lavet funktionen med varenr, men datoen står i en box med både dato og klokkeslet (08-12-2005 14:30:26), men jeg vil gerne have at jeg KUN søger på datoen. min kode til at sortere efter varenr ser således ud:

Søg = InputBox("Søg på varenr.:", "Søg")

Set db = OpenDatabase("D:\Texit\Texit.mdb")
Set rsOrdre = db.OpenRecordset("SELECT * FROM Ordre WHERE Ordrenr = '" & Søg & "'", dbOpenSnapshot)

Jeg bruger samme variabel til datosøgning, men ændre selvfølgelig ordrenr til Dato.
Avatar billede hnteknik Novice
12. december 2005 - 14:32 #1
Glem klokkesletttet

dato = #24-12-2005#
Avatar billede hnteknik Novice
12. december 2005 - 14:36 #2
Her er der noget VBA   

Select Case LkUpDatoType
    Case 1
        StrDatType = "tblaktiv.Vdato"
    Case 2
        StrDatType = "Tilgang"
    Case 3
        StrDatType = "Afgang"
    Case 4
        StrDatType = "Tilstede"
    End Select
   
    strDeltaDato = TidsQuery(Nz(Me.LkUpFra), Nz(Me.LkUpTil), StrDatType)

Function TidsQuery(ByVal FieldValFra As Date, ByVal FieldValTil As Date, ByVal StrDatType As String) As String
Dim Str1 As String, Str2 As String, Str3 As String, Str4 As String

If FieldValFra = 0 And FieldValTil = 0 Then
    'der er intet søgekriterie - case 1
    TidsQuery = ""
Else
    If StrDatType = "Tilstede" Then ' vi skal lige kigge købt og solgt
        If FieldValTil = 0 Then
            'der må være en startdato -  case 2
            Str1 = "[Afgang]" & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "#"
            Str2 = "[Afgang]" & " is Null"
            TidsQuery = "(" & Str1 & " OR " & Str2 & ")"
        ElseIf FieldValFra = 0 Then
            ' der må være en slutdato - case 4
            Str1 = "[Tilgang]" & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
            Str2 = "[Tilgang]" & " is Null"
            TidsQuery = "(" & Str1 & " OR " & Str2 & ")"
   
        ElseIf FieldValTil >= FieldValFra Then
            ' der er både slut og start dato
            Str1 = "[Afgang]" & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "#"
            Str2 = "[Afgang]" & " is Null"
            Str3 = "[Tilgang]" & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
            Str4 = "[Tilgang]" & " is Null"
            '& "# AND " & StrDatType & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
            TidsQuery = "((" & Str1 & " OR " & Str2 & ") AND (" & Str3 & " OR" & Str4 & "))"
        Else
            ' du må have byttet om på datoerne
            MsgBox "De har byttet om på start/slut datoer - ingen datovirkning"
            TidsQuery = ""
        End If
    Else
        If FieldValTil = 0 Then
            'der må være en startdato -  case 2
            Str1 = StrDatType & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "#"
            Str2 = StrDatType & " is Null"
            TidsQuery = "(" & Str1 & " OR " & Str2 & ")"
        ElseIf FieldValFra = 0 Then
            ' der må være en slutdato - case 4
            Str1 = StrDatType & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
            Str2 = StrDatType & " is Null"
            TidsQuery = "(" & Str1 & " OR " & Str2 & ")"
   
        ElseIf FieldValTil >= FieldValFra Then
            ' der er både slut og start dato
            Str1 = StrDatType & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "# AND " & StrDatType & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
            TidsQuery = "(" & Str1 & ") "
        Else
            ' du må have byttet om på datoerne
            MsgBox "De har byttet om på start/slut datoer - ingen datovirkning"
            TidsQuery = ""
        End If
    End If
End If

End Function
Avatar billede terry Ekspert
12. december 2005 - 14:41 #3
SELECT * FROM Ordre WHERE Dato = #" & Cdate(DatoFelt) & "#", dbOpenSnapshot
Avatar billede terry Ekspert
12. december 2005 - 14:41 #4
eller måske
SELECT * FROM Ordre WHERE Dato = #" & date(DatoFelt) & "#", dbOpenSnapshot
Avatar billede virtualdurran Nybegynder
12. december 2005 - 15:04 #5
Datoen i min database er gemt som en tekst og ikke i et datoformat. og jeg kan ikke ændre på måden den er skrevet på, for teksten hentes fra en maskine.
Avatar billede terry Ekspert
12. december 2005 - 15:07 #6
SELECT * FROM Ordre WHERE Dato = '" & Left(DatoFelt, 10) & "'", dbOpenSnapshot
Avatar billede virtualdurran Nybegynder
12. december 2005 - 15:27 #7
Terry den kode du har givet mig, burde sammenlinge de 10 karakter jeg skriver og gemmer i søg variablen med de første 10 karaktere i min datocelle i databasen ikke?

jeg har ændre den, så den ser sådan her ud og det virker ik:
Søg = InputBox("Søg på Dato:", "Søg")

Set db = OpenDatabase("D:\Texit\Texit.mdb")
Set rsOrdre = db.OpenRecordset("SELECT * FROM Ordre WHERE Starttid = '" & Left(Søg, 10) & "'", dbOpenSnapshot)
Avatar billede terry Ekspert
12. december 2005 - 15:48 #8
Can you send me your database(s) and I will take a look, not easy to see where the problem is from here.

eksperten@NOSPAMsanthell.dk
remove NOSPAM
Avatar billede virtualdurran Nybegynder
12. december 2005 - 16:11 #9
No i can't. My boss has told me that some parts of the code is secret.
Avatar billede terry Ekspert
12. december 2005 - 16:43 #10
OK then try this

Dim sSQL
sSQL = "SELECT * FROM Ordre WHERE Starttid = '" & Left(Søg, 10) & "'"


Søg = InputBox("Søg på Dato:", "Søg")

Set db = OpenDatabase("D:\Texit\Texit.mdb")
Set rsOrdre = db.OpenRecordset(sSQL, dbOpenSnapshot)

now you should be able to write the SQL to th edebug window (CTRL+G)

then enter

?sSQL

Now you can copy the SQL to a query in Access where it is easier to find the problem.

Working with text fields for your dates is going to give problems.
Avatar billede terry Ekspert
12. december 2005 - 16:44 #11
you could maybe just sedn the dB with the table contining the date values an dthe code you use to select from the table
Avatar billede virtualdurran Nybegynder
12. december 2005 - 18:07 #12
ok. i have emailed u. The code i use to search for varenr is:

Private Sub CommandButton3_Click()

'knap til at søge på varenr

Dim db As Database
Dim rsOrdre As Recordset
Dim Søg As String

1

Søg = InputBox("Søg på varenr.:", "Søg")
If Søg = "" Then GoTo 2

Set db = OpenDatabase("D:\Texit\Texit.mdb")
Set rsOrdre = db.OpenRecordset("SELECT * FROM Ordre WHERE Ordrenr = '" & Søg & "'", dbOpenSnapshot)



Ark1.ListBox1.Clear

    With rsOrdre

        Do While Not .EOF
            Ark1.ListBox1.AddItem (!Ordrenr)
            intTemp = Ark1.ListBox1.ListCount
            Ark1.ListBox1.List(intTemp - 1, 1) = !starttid
            Ark1.ListBox1.List(intTemp - 1, 2) = !Stoptid
            Ark1.ListBox1.List(intTemp - 1, 4) = !AntalKasser
            Ark1.ListBox1.List(intTemp - 1, 5) = !ID
            .MoveNext
           
        Loop
                If Ark1.ListBox1.ListCount = 0 Then

                    Response = MsgBox("Varenr findes ikke", vbOKOnly)
                    If Response = vbOK Then GoTo 1
            End If

    End With

   
rsOrdre.Close
db.Close

2

End Sub
Avatar billede terry Ekspert
12. december 2005 - 19:21 #13
The problem is because alæthough you want to search on just the date, the field StartTid also holds a time. So the SQL will look like this

"SELECT * FROM Ordre WHERE Left([starttid],10)= '" & Left(Søg, 10) & "'"
Avatar billede terry Ekspert
12. december 2005 - 19:21 #14
alæthough = although
Avatar billede virtualdurran Nybegynder
13. december 2005 - 01:02 #15
Now i have changed the code for this and it still won't work. it tells me that there is nothing to put into the listbox.

Søg = InputBox("Søg på Dato (dd/mm/yyyy):", "Søg")
If Søg = "" Then GoTo 2

Søg = Format$(Søg, "dd/mm/yyyy")

Set db = OpenDatabase("D:\Texit\Texit.mdb")
Set rsOrdre = db.OpenRecordset("Ordre", dbOpenSnapshot)

rsOrdre.MoveFirst

4
    With rsOrdre

        Do While Not .EOF
            tid = Format$(!starttid, "dd/mm/yyyy")
            If tid = Søg Then GoTo 3
            .MoveNext
       
        Ark1.Cells(17, 10) = tid
        Ark1.Cells(21, 10) = Søg
   
        Loop

3
        Ark1.Cells(23, 11) = tid
        Ark1.Cells(24, 11) = Søg
       
       
            Ark1.ListBox1.AddItem (!Ordrenr)
            intTemp = Ark1.ListBox1.ListCount
            Ark1.ListBox1.List(intTemp - 1, 1) = !starttid
            Ark1.ListBox1.List(intTemp - 1, 2) = !Stoptid
            Ark1.ListBox1.List(intTemp - 1, 4) = !AntalKasser
            Ark1.ListBox1.List(intTemp - 1, 5) = !ID
            .MoveNext
     
GoTo 4
Avatar billede terry Ekspert
13. december 2005 - 10:51 #16
Why dont you use the SQL I gave in  my last comment? If you put the SQL in a string first then you can copy it to a query in Access to see the result. Are you workingin Access?


Dim sSQL as string


sSQL = "SELECT * FROM Ordre WHERE Left([starttid],10)= '" & Left(Søg, 10) & "'"
Avatar billede virtualdurran Nybegynder
13. december 2005 - 14:30 #17
i have tried your sql and it doesn't work. but i have made it work now, without using sql. But thx for the help any way. Maybe u can help me with another thing? i would like to clear an area in an excell document. I know you can use the code ark2.cells.clear, but i don't want to clear all the cells. and i also need a code for checking if a cell is empty.

can i help me with that?
Avatar billede virtualdurran Nybegynder
13. december 2005 - 14:31 #18
i'll give u extra points if u want me to.
Avatar billede terry Ekspert
13. december 2005 - 15:01 #19
Sorry, I dont know much about Excel so I cant help you there.
Avatar billede virtualdurran Nybegynder
13. december 2005 - 15:40 #20
okay then. well.. u'll get 200 points for your help anyway.
Avatar billede terry Ekspert
13. december 2005 - 15:50 #21
Thanks
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