Avatar billede webhelpers Praktikant
03. august 2001 - 17:25 Der er 22 kommentarer og
1 løsning

universal søgning

Hello
Er der nogle der ved hvordan man programmerer en universal søgning i VBA til en accessdatabase?

Indtil videre har jeg en søgning der ser således ud:

If Not fldIsEmpty(Me.Søgefelt9) Then
        stLinkCriteria = stLinkCriteria & \" AND [Sidste telefon]  Like \'*\" & Me.Søgefelt9 & \"*\'\"
       
    End If

-som søger på indholdet i søgefelt9 sammenlignet med feltet [Sidste telefon] i Kunder-databasen. Men kan man ikke kode en form for universal søgning, hvor man har et felt der fx hedder \'universal\', hvori man så kan indtaste hvad som helst, og som ved udførsel søger på alle felterne i Kundedatabasen? Det går jeg udfra man godt kan - og i så fald er der nogle der har en løsning?
Avatar billede terry Ekspert
03. august 2001 - 19:46 #1
hi numsi> I am just interested in seeing what comes along!

terry
Avatar billede nih Novice
03. august 2001 - 20:07 #2
Hej - et forslag

opbygge en sql sætning:

strSQL = \"\" & _
  \"SELECT fld1, fld2, fld3 \" & _
  \"FROM tbl \" & _
  \"WHERE fld1 LIKE \" & søgefelt & _
    \"OR fld2 LIKE \" & søgefelt & _
    \"OR fld3 LIKE \" & søgefelt

Den er dog meget ufleksibel, hvis nu fld1 er date og fld2 er string eller hvis du senere tilføjer ny felter til tabellen skal strSQL skrives om.

Niels

Avatar billede webhelpers Praktikant
03. august 2001 - 20:35 #3
Den er jeg med på. Jeg havde også en ide om at skrive som det ex. jeg ligger ud med øverst, hvor jeg kunne tilføje alle felterne én efter én, men det bliver bare langhåret, da man skal kunne søge på ca. 50 felter.....Jeg er interesseret i, hvis det kan laves på en smartere måde.
Avatar billede webhelpers Praktikant
03. august 2001 - 20:36 #4
Men det kan da godt være, at der ikke er en anden vej uden om, end at lave en sygelig lang kode..
Avatar billede nih Novice
03. august 2001 - 20:46 #5
Man kan vel lave et loop i DAO eller ADO der gennemløber alle felter og poster i tabellen, men den bliver vist langsom i store tabeller.

Niels
Avatar billede terry Ekspert
03. august 2001 - 21:43 #6
OK this example is done in DAO, so you need to have a reference to MS DAO 3.6. You can do that in the tools+references menu.

It loops through all fields in the tabel \"Final\" and IF its a text type, appends this to the SQL.

    Dim db As Database
    Dim tdf As tabledef
    Dim fld As Field
     
   
    stLinkCriteria = \"1\"
   
    If Not fldIsEmpty(Me.Søgefelt9) Then

        Set db = CurrentDb
        Set tdf = db.TableDefs(\"Final\")
   
        For Each fld In tdf.Fields
         
        If fld.Type = dbText Then
            stLinkCriteria = stLinkCriteria & \" OR \" & fld.name & \" Like \'*\" & Me.Søgefelt9 & \"*\'\"       
        end if
       
    Next fld
       
    End If
Avatar billede nih Novice
03. august 2001 - 23:35 #7
Numsi

Jeg har her på min nattevagt også lavet en kode i DAO.

Function Search(strSearch As String)

    Dim db As DAO.Database
    Dim fld As Field
    Dim strTarget As String
    Dim rst As Recordset
   
    Set db = CurrentDb
    Set rst = db.OpenRecordset(\"Ruter\")
   
    With rst
        .MoveFirst
        Do While Not rst.EOF
            For Each fld In .Fields
                strTarget = CStr(fld)
                If InStr(strTarget, strSearch) > 0 Then
                    MsgBox .Fields(\"ruteId\").Value
                End If
            Next fld
            .MoveNext
        Loop
    End With
   
   
End Function

Avatar billede nih Novice
03. august 2001 - 23:39 #8
den kaldes med: Search (\"hej\")

for hver post i tabellen omformes værdien i hvert felt til tekst og undersøger om søgestrengen er indeholdt heri.
Har ikke afprøvet på store tabeller.

Niels
Avatar billede nih Novice
03. august 2001 - 23:45 #9
brug evt parameteren 1 i inStr for at der IKKE skelnes mellem store og små bogstaver.

InStr(strTarget, strSearch, 1)

Niels
Avatar billede webhelpers Praktikant
04. august 2001 - 11:53 #10
terry,
Jeg har oprettet et søgefelt \"Søgefelt11\", hvor jeg også har oprettet en knap, som hedder søg universalt som knytter sig til feltet. Jeg har prøvet og implementere dit forslag, så det ser således ud:

Private Sub Universalt_Click()

    Dim db As Database
    Dim tdf As TableDef
    Dim fld As Field
         
    stLinkCriteria = \"1\"
   
    If Not fldIsEmpty(Me.Søgefelt11) Then

        Set db = CurrentDb
        Set tdf = db.TableDefs(\"Final\")
   
        For Each fld In tdf.Fields
         
        If fld.Type = dbText Then
            stLinkCriteria = stLinkCriteria & \" OR \" & fld.Name & \" Like \'*\" & Me.Søgefelt11 & \"*\'\"
        End If
       
    Next fld
       
    End If
   
    DoCmd.OpenForm \"Kunder\", , , stLinkCriteria
   
Exit_Universalt_Click:
    Exit Sub

Err_Universalt_Click:
    MsgBox Err.Description
    Resume Exit_Universalt_Click

End Sub

Men kan du se hvad der er galt, siden der ingen ting sker, når man skal udføre søgningen??
Avatar billede webhelpers Praktikant
04. august 2001 - 11:56 #11
hej nih,
er \"Ruter\" det der svarer til tabelnavnet? Og svarer \"Ruter\" til søgefeltet, eller hvad? Hvad mener du med, at \"den kaldes med: Search (\"hej\")\" ?

Puha, det er godt jeg er anonym, man skulle jo nødig tro jeg var dum....
Avatar billede nih Novice
04. august 2001 - 16:27 #12
Numsi

\"Ruter\" er tabelnavnet, \"ruteID\" er feltnavnet på det felt som din søgning skal retunere.

Prøv at oprette en ny form med et tekstfelt eks: txtSøg.
I txtSøg\'s afterUpdate event skal du skrive:
  search (txtSøg.value)
Min function: Search kan du ligge enten i et modul for sig eller i formens modul - Husk at rette tabel- og felt navn.
Dette er kun en test der retunere feltet ruteID i en msgBox. Vi kan godt arbejde videre med at indsætte søgeresultattet i en liste ????

Koden er dog ikke så langhåret - prøv at sætte markøren på de forskellige udtryk og tryk F1.

Niels
Avatar billede terry Ekspert
04. august 2001 - 16:49 #13
numsi> I\'ll take a look and get back!
Avatar billede terry Ekspert
05. august 2001 - 11:16 #14
Hej numsi>
change your code to this: I have tested it in your dB and it works!

    Dim db As Database
    Dim tdf As tabledef
    Dim fld As Field
    Dim fld1 as Boolean
     
    Set db = CurrentDb   
    Set tdf = db.TableDefs(\"Final\")
   
    stLinkCriteria = \"\"
    fld1 = True
   
    If Not fldIsEmpty(Me.Søgefelt11) Then

        Set tdf = db.TableDefs(\"Final\")
           
        For Each fld In tdf.Fields
         
        If fld.Type = dbText Then
            If fld1 Then
                stLinkCriteria = stLinkCriteria & \" [\" & fld.Name & \"] Like \'*\" & Me.Søgefelt11 & \"*\'\"
                fld1 = False
            Else
                stLinkCriteria = stLinkCriteria & \" OR [\" & fld.Name & \"] Like \'*\" & Me.Søgefelt11 & \"*\'\"
            End If
           
        End If
       
        Next fld
  end if
Avatar billede terry Ekspert
05. august 2001 - 11:19 #15
One of the  problems is because some field names contain spaces so they have to be in []. Also, because we now are using OR and not AND then we cant start with stLinkCriteria = \"1\" which results in all records being in the result.

Anyway try it!
   
Avatar billede webhelpers Praktikant
05. august 2001 - 16:11 #16
thanks. Can you see why this code will not open any form result??

Private Sub Universal_Click()
On Error GoTo Err_Universal_Click

    Dim db As Database
    Dim tdf As tabledef
    Dim fld As Field
    Dim fld1 As Boolean
    Dim stDocName As String
    Dim stLinkCriteria As String
       
    Set db = CurrentDb
    Set tdf = db.TableDefs(\"Final\")
   
    stDocName = \"Kunder\"
    stLinkCriteria = \"\"
    fld1 = True

    If Not fldIsEmpty(Me.Søgefelt11) Then
    Set tdf = db.TableDefs(\"Final\")
           
        For Each fld In tdf.Fields
         
        If fld.Type = dbText Then
            If fld1 Then
                stLinkCriteria = stLinkCriteria & \" [\" & fld.Name & \"] Like \'*\" & Me.Søgefelt11 & \"*\'\"
                fld1 = False
            Else
                stLinkCriteria = stLinkCriteria & \" OR [\" & fld.Name & \"] Like \'*\" & Me.Søgefelt11 & \"*\'\"
            End If
           
        End If
       
        Next fld
  End If
     
    DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_Universal_Click:
    Exit Sub

Err_Universal_Click:
    MsgBox Err.Description
    Resume Exit_Universal_Click
   
End Sub
Avatar billede terry Ekspert
05. august 2001 - 17:17 #17
numsi> Do you mean that it isnt working?
As I said it is working here. Have you made a reference to DAO 3.6 in the Tools+References menu when in code view?
Avatar billede webhelpers Praktikant
05. august 2001 - 23:51 #18
Hi, terry
when I write the code as above I get the error : type mismatch!.

How can I fix that?
Avatar billede terry Ekspert
06. august 2001 - 08:49 #19
hi numsi> In Tools+References remove the reference to MS ActiveX Data Object 2.1
This is only necessary when using ADO. Your now using DAO and therefore you need the refrence to DAO 3.6 which you have.

mvh
Terry
Avatar billede webhelpers Praktikant
06. august 2001 - 10:19 #20
Thanks again!. I would never have found out of that myself.
It\'s working now, but only on Textfields. I can not search for date-values. In the new database I have changed the datatype from text to date values in the date fields. I did that so that i can use the between date feature. The LinkCriteria is a String know, but is it complicated to change the code, so that it can search on both text and date fields?
I know that you have helped me enough, but I\'m just asking.
If it is possible, what\'s the code for universal search on datefields instead of textfields?
Avatar billede terry Ekspert
06. august 2001 - 10:38 #21
numsi> to me it doesnt seem logical to search through all of the text fields if all you have entered is a date. You have the other fields on the form and if the user eneters a data then wouldnt it be logical to only use that?

Anyway, to you rquestion:
alter the line
If fld.Type = dbText Then

to
If fld.Type = dbText or fld.Type = dbDate Then
           

         

Avatar billede webhelpers Praktikant
06. august 2001 - 10:54 #22
Yes, I know it sounds unlogical, but the company wishes a feature to search all the fields, if it happens that they can not specify the search criteria - maybe if they just want to see what happened a specific date, despite of it is the [FOllowup]-date, [Sidste køb]-date etc.

It\'s working perfect know, thanks to you again. I\'m just wondering, how long have you been working with access and vba ?
Avatar billede terry Ekspert
06. august 2001 - 10:58 #23
well I have been programming for thelast 15 years or so, have tried my hands on a it of everything. Access and VB the last 4-5 years or so.

Anyway glad to hear its working now
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