Avatar billede webhelpers Praktikant
22. oktober 2001 - 00:00 Der er 22 kommentarer og
1 løsning

Optimering af søgning

Hej igen.
Jeg har følgende søgning:

Private Sub Vis_Click()
On Error GoTo Err_Vis_Click

    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim sOrder As String
    Dim sWhere As String
    Dim vArgs As Variant
   
    stDocName = \"Kunder\"
   
    If Not fldIsEmpty(Me.Søgefelt) Then
        sWhere = \"\'*\" & Me.Søgefelt & \"*\'\"
        sOrder = \"Nummer\"
    End If
   
    If Not fldIsEmpty(Me.Søgefelt11) Then
        sWhere = \"\'*\" & Me.Søgefelt11 & \"*\'\"
        sOrder = \"Oprettet\"
    End If
   
    DoCmd.OpenForm stDocName, , , stLinkCriteria
   
    If Not fldIsEmpty(sOrder) Then
   
        Forms!Kunder.RecordSource = \"SELECT * FROM Final ORDER BY \" & sOrder
               
        Forms!Kunder.RecordsetClone.FindFirst sOrder & \" Like \" & sWhere
        Forms!Kunder.Bookmark = Forms!

End Sub

Den søger blandt alle ca. 6000 kunder - sorterer i alle kunder eftersom hvad man har søgt på, og peger på den kunde som matcher søgningen.

Problemet er, at hvis man søger på et kundenavn fx \'cure\', og ordet/del-ordet \'cure\' ikke findes, så sorterer den ikke efter c, men efter ingenting, for det fandt jo ingenting. Det er IKKE smart, istedet kunne det være smart, at den så fandt noget der lignede \'cure\' og fx istedet sorterede efter \'cur\', og hvis det ikke fandtes, ja så efter \'cu\'. Kan dette lade sig gøre - det er jeg jo selvfølgelig sikker på det kan!
Avatar billede terry Ekspert
22. oktober 2001 - 08:22 #1
Hi numsi!
What your asking as possible, but it has to be programmed. Lets say the user enters \'cure\' and none are found. You could then remove the last character and do the search again. This could be continued until some records are found or there are no more characters in your string.
Not sure how difficult it is to implement in your appplication but it can be done.
22. oktober 2001 - 09:46 #2
Hej Numsi,

Nedenstående skulle gøre det (jeg har ikke taget hele din kode med!). Jeg har lavet det lidt om, så du definere et recordset i en variabel istedet for at referere til den RecordsetClone hver gang (det er mere optimalt).
\'****
Dim rs
Forms!Kunder.RecordSource = \"SELECT * FROM Final ORDER BY \" & sOrder
Set rs = Forms!Kunder.RecordsetClone               
do
  rs.FindFirst sOrder & \" Like \" & sWhere
  if rs.nomatch then sWhere = left(sWhere, Len(sWhere)-1
loop until rs.nomatch = false
Forms!Kunder.Bookmark = rs.Bookmark
\'****

NB: Jeg har ikke erklæret den som et recordset, for hvis du benytter Access 2000 vil det ikke virke hvis jeg skrev Dim rs as Recordset - nærmere forklaring gives gerne...

/Thomas

PS: Ovenstående er ikke afprøvet, men det burde virke.
Avatar billede webhelpers Praktikant
22. oktober 2001 - 18:15 #3
tak thomas, jeg kigger på det i nat.

Nu da jeg har eksperternes opmærksomhed (terry & thomasjepsen), hvordan skal ovenstående søgning ændres, for at søgningen foregår i starten af feltet og ikke på hele feltet???
22. oktober 2001 - 18:23 #4
Det styres jo af hvor du anbringer *.

Hvis sWhere = \"Cure*\" så søges på starten af feltet.
Hvis sWhere = \"*cure*\" så søges på hele feltet.
Avatar billede webhelpers Praktikant
22. oktober 2001 - 18:32 #5
dammit, jeg fik sgu\' rodet i pointene. Nu fik du alle point thomas - du skulle kun have haft 15 for det lille. Nå, men så håber jeg du gider hjælpe mig senere, når jeg går igang med det overordnede problem.
22. oktober 2001 - 19:06 #6
Undskyld, Numsi! Men hvis jeg ikke skulle have dem alle, hvem skulle så??? Så vidt jeg kan se, så er jeg den eneste som har svaret (ud over terry, som blot omtaler mit løsningsforslag i løse vendinger).
22. oktober 2001 - 19:08 #7
...eller ville du bare give de 15 point først og derefter de resterende 50, når du havde set om det virkede??
Det sidste tror jeg ikke er muligt at gøre!
Avatar billede webhelpers Praktikant
22. oktober 2001 - 20:28 #8
jeps, jeg ville lige vente til jeg havde prøvet dit forslag til løsningen på det første problem. Bare så du ikke \'stak af\' imens..8o)

Jeg har først mulighed for at \'afprøve\' det senere.

22. oktober 2001 - 21:04 #9
I will always be here :o)
Avatar billede terry Ekspert
22. oktober 2001 - 21:05 #10
great to hear Thomas :o)
Avatar billede webhelpers Praktikant
22. oktober 2001 - 22:56 #11
Hej thomas
nu har jeg prøvet, men får gentagende gange denne fejl: \"Der er en syntaksfejl i strengen i et udtryk\"

Min kode ser nu sådan ud:

Private Sub Vis_Click()
On Error GoTo Err_Vis_Click

    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim sOrder As String
    Dim sWhere As String
    Dim vArgs As Variant
   
    stDocName = \"Kunder\"
   
    If Not fldIsEmpty(Me.Søgefelt) Then
        sWhere = \"\'\" & Me.Søgefelt & \"*\'\"
        sOrder = \"Nummer\"
    End If

    If Not fldIsEmpty(Me.Søgefelt1) Then
        sWhere = \"\'\" & Me.Søgefelt1 & \"*\'\"
        sOrder = \"Navnet\"
    End If
   
    DoCmd.OpenForm stDocName, , , stLinkCriteria
   
    If Not fldIsEmpty(sOrder) Then
   
    Dim rs
    Forms!Kunder.RecordSource = \"SELECT * FROM Final ORDER BY \" & sOrder
    Set rs = Forms!Kunder.RecordsetClone
   
    Do
    rs.FindFirst sOrder & \" Like \" & sWhere
   
    If rs.NoMatch Then sWhere = Left(sWhere, Len(sWhere) - 1)
    Loop Until rs.NoMatch = False
    Forms!Kunder.Bookmark = rs.Bookmark

    DoCmd.Maximize
    DoCmd.GoToControl \"Telefon\"
               
    End If

Exit_Vis_Click:
    Exit Sub

Err_Vis_Click:
    MsgBox Err.Description
    Resume Exit_Vis_Click
   
End Sub

Hvad gik der galt....?
Avatar billede webhelpers Praktikant
22. oktober 2001 - 22:59 #12
Jeg kom til at tænke på, om denne fremgangsmåde hvor man trækker en fra længden af feltet og prøver igen, vil virke hvis man søger på et datofelt??
22. oktober 2001 - 23:01 #13
Hmm, én ting, som du mangler at fortælle: hvilken version benytter du?
(Husk det altid ;o)

Ang. datofelt, så vil den nok ikke virke med mindre at du konvertere den til tekst inden søgningen.
22. oktober 2001 - 23:06 #14
Kan du sige hvilken linie, den fejler i? (Prøv evt Debug->compile)
Avatar billede webhelpers Praktikant
22. oktober 2001 - 23:18 #15
hello
Jeg bruger access2000.
Jeg har debugget/kompilet og fundet ud af, at den kommer med fejlen efter den har kaldt Loop og går tilbage til rs.FindFirst sOrder & \" Like \" & sWhere - herefter går den ned i fejlmeddelelsen
Avatar billede webhelpers Praktikant
22. oktober 2001 - 23:19 #16
Hvad kan det skyldes?
22. oktober 2001 - 23:24 #17
Arh, det er jo selvfølgelig fordi at du sætter * og \' ind i sWhere, hvilket ikke er almindeligt.

Brug i stedet
sWhere = Me.Søgefelt
\'---og længere nede:

rs.FindFirst sOrder & \" Like \'\" & sWhere & \"*\'\"

Problemet er at hvis du bare fjerner det sidste tegn, så er det jo \' der forsvinder og ikke \"e\" i \"Cure\"! Kan du følge mig?
Avatar billede webhelpers Praktikant
22. oktober 2001 - 23:35 #18
Thomas du er genial!

Nu virker det perfekt, bortset fra lige fra søgning på datofelter......Hvordan konverterer jeg datofelterne til tekstfelter inden søgningen?? he he, jeg er ikke lige sådan til at slippe af med
22. oktober 2001 - 23:39 #19
CStr(Dato)

og den anden vej: CVDate(Streng)

Det kan godt være, at du ikke er til at slippe af med, men det er jeg - jeg er sgu på vej i seng. Jeg tænker ikke helt klart lige nu ;o)

\'nat

PS: Men lad mig alligevel hører om du får det til at virke!
Avatar billede webhelpers Praktikant
22. oktober 2001 - 23:43 #20
yep, tak for kampen, og nat nat

PS: lidt klart kan du da tænke! 8o)
Avatar billede webhelpers Praktikant
23. oktober 2001 - 00:38 #21
Forresten, så er sWhere jo sat til String-værdi fra starten af. Så dato er allerede en string i søgningen. Problemet kommer istedet når man søger på starten af feltet i en datosøgning, for søger man på 01-03-97 og sådan en ikke findes, så finder den istedet fx 01-03-92, fordi den stadig søger på starten af feltet. Men hvad nu, hvis man hellere ville have at den søgte på hele feltet i forbindelse med datosøgning, for på den måde ville den finde det nærmeste årstal, istedet for den nærmeste måned, hvilket er mere hensigtsmæssigt. Det kræver vel, at man ændrer koden, således at den søger på starten af feltet som \'default\', men hvis kunden har indtastet i en af datofelterne eg. søgefelt 5 el. 6, så skal den søge på hele feltet.....Er det noget lort at kode??
23. oktober 2001 - 10:41 #22
ja :o)
Avatar billede webhelpers Praktikant
23. oktober 2001 - 17:29 #23
Kunne man så ikke opdele søgningen i 2 dele - 1. del til alm. søgning på starten af feltet og 2. del specielt egnet til datofelter, hvor den skal søge på hele feltet?
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