Just nu i M3-nätverket
Gå till innehåll

Sökruta i Access


Martassen

Rekommendera Poster

Jag har gjort en sökruta i ett formulär som jag har lite funderingar på:

Jag började med att göra en fråga utifrån en tabell och tog med följande fält i från frågan: Efternamn,Förnamn,Adress,Tel.
Därefter spara jag frågan med med namnet qrysök.

 

Därefter skapade jag ett formulär utifrån qrysök. Tog med alla fält. Jag skapade ett delat formulär som man hittar under knapp "Fler formulär".

I formulärhuvudet ritar jag upp en textruta längst upp som ska vara sökrutan.
Bredvid ritar jag upp en knapp som ska vara "Sök".

I knappens "Vid klickning" skapar jag ett makro med instruktionen "Använd filter" och vid Where villkor skriver jag in följande:

[Efternamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Förnamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Adress] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Tel] SOM "*" & [Formulär]![frmsök]![text16] & "*"

 

Sparar och stänger makrot och provar att fylla i rutan och trycker Sök och det fungerar.

 

Min fundering är:

1. Hur gör man om man även vill att sökning ska fungera när man trycker Enter i sökrutan?
 

2. Måste jag skapa en fråga och göra formulär utifrån fråga för att få detta fungera?
Jag testade att skapa ett formulär utifrån tblKund och tog med Efternamn,Förnamn,Adress mfl som jag vill ha med och rita upp textruta,knapp  och  och la in följande villkor men det fungerar ju inte:

[Efternamn] SOM "*" & [Formulär]![frmkund]![text82] & "*" ELLER [Förnamn] SOM "*" & [Formulär]![frmkund]![text82] & "*" ELLER [Adress] SOM "*" & [Formulär]![frmkund]![text82] & "*" ELLER [Tel] SOM "*" & [Formulär]![frmkund]![text82] & "*"

 

Länk till kommentar
Dela på andra webbplatser

1. Du kan välja att simulera en klickning på sökknappen med händelsen KeyDown

Private Sub text16_KeyDown(KeyCode As Integer, Shift As Integer)
    ' Känner av tangenten ENTER
    If KeyCode = 13 And Shift = 0 Then
        ' Flytta fokus till sökknappen
        btnSok.SetFocus
        ' Simulera ett klick
        btnSok_Click
    End If
End Sub

2. Det ska inte spela någon roll om formuläret baseras på en fråga eller en tabell. Det borde fungera så det är nog någon annan liten detalj som blivit fel.
Länk till kommentar
Dela på andra webbplatser

Jag testade igår innan jag läste ditt svar att lägga in följande vid "Efter uppdatering" på textrutan:

[Efternamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Förnamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Adress] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER [Tel] SOM "*" & [Formulär]![frmsök]![text16] & "*"

 

Jag tycker mig se att det fungerar med det där!?

 

Hur gör man en rutin som visar alla poster i ett filter? Nån form av Show all när man trycker på en knapp funderar jag på. Kan visserligen radera texten i rutan och trycka Enter men tänkte om det går via en knapp och show all?

 

Edit:
Jag skapade en knapp bredvid sökknappen med kod:
Private Sub Kommandoknapp20_Click()
DoCmd.ShowAllRecords
End Sub

 

Kom gärna med synpunkter kring syntax om det ej ser rätt ut.

Länk till kommentar
Dela på andra webbplatser

Det ser bra ut.

Det enda som kan bli lite konstigt är om du använder AfterUpdate på textrutan tillsammans med OnClick på knappen. Då kommer filtrering ske två gånger direkt efter varann när man klickar på sökknappen. Inget stort problem men onödigt att filtrera dubbelt.

 

Om det bara är du och ev nära medarbetare som ska använda programmet rekommenderar jag att du tar bort sök-knappen och bara använder AfterUpdate.

Länk till kommentar
Dela på andra webbplatser

Skulle prova villkoret i ett annat formulär men funkar ju ej.

Ser inge fel i detta?:

[Namn] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Ordernr] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Datum] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Produkt] SOM "*"

 

 

En annan fundering:
Den verkar söka efter allt jag skriver. Hur gör jag så jag måste skriva hela ordet jag söker efter?

Som det är nu räcker det jag skriver Ande och då får jag fram förnamnet Anders och även efternamnet Andersson!? Hur styr jag sådant?

Länk till kommentar
Dela på andra webbplatser

Ok, du tänker på om jag skriver i rutan slår Enter och därefter trycker på Sök?

Nej men när du skriver in något och sedan trycker på Sök.

 

AfterUpdate körs direkt när textrutan lämnas och fältet ändrats, oavsett om du trycker på Enter eller inte.

Länk till kommentar
Dela på andra webbplatser

Det är rätt störigt att Wherevillkoret max får innehålla 255 tecken.

Använd DoCmd.ApplyFilter i programkod så kan du änvända fler tecken.

 

Exempel:

Docmd.ApplyFilter , "NAMN = ""Ande*"""
Länk till kommentar
Dela på andra webbplatser

Skulle prova villkoret i ett annat formulär men funkar ju ej.

 

Ser inge fel i detta?:

 

[Namn] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Ordernr] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Datum] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Produkt] SOM "*"

Datum i villkor omsluts med #, Exempel:

[Datum] = "#" & [Formulär]![frmorderuppgifter]![text17] & "#"

 

Läs dock på mer om hur datum ska skrivas i villkor för det kan lätt bli fel. Bäst är att göra en villkorad datumfiltering när söktexten verkligen är ett giltigt datum.

Länk till kommentar
Dela på andra webbplatser

En annan fundering:

Den verkar söka efter allt jag skriver. Hur gör jag så jag måste skriva hela ordet jag söker efter?

Som det är nu räcker det jag skriver Ande och då får jag fram förnamnet Anders och även efternamnet Andersson!? Hur styr jag sådant?

Det är "*" före och efter söktexten i villkoret söker efter allt.

 

[Namn] SOM "*ande*" söker efter del av namn

[Namn] SOM "ande*" söker efter ande i början av namnet

[Namn] SOM "anders" söker efter exakt matchning, dvs bara Anders

Länk till kommentar
Dela på andra webbplatser

Ser inge fel i detta?:

 

[Ordernr] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*"

Ordernr är förmodligen ett tal och då bör inte SOM användas utan = istället

[Ordernr] = [Formulär]![frmorderuppgifter]![text17]

Länk till kommentar
Dela på andra webbplatser

Datum i villkor omsluts med #, Exempel:

[Datum] = "#" & [Formulär]![frmorderuppgifter]![text17] & "#"

 

Läs dock på mer om hur datum ska skrivas i villkor för det kan lätt bli fel. Bäst är att göra en villkorad datumfiltering när söktexten verkligen är ett giltigt datum.

Jag har gjort en fråga utifrån fler tabeller med namnet "qryOrderuppgifter".

Därefter ett formulär utifrån qryOrderuppgifter. Alla fält är ej med i formuläret men ska ej spela roll.

 

Koden funkar ändå inte trots att jag kollat namn och titlar på sökrutan. Titel på sökrutan är text17 och formuläret heter frmorderuppgifter. Den säger ange parametervärde och [name]

 

 

[Namn] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Ordernr]=[Formulär]![frmorderuppgifter]![text17] & "*" ELLER [Datum]="#" & [Formulär]![frmorderuppgifter]![text17] & "#" ELLER [Produkt] SOM "*"

Länk till kommentar
Dela på andra webbplatser

Nej men när du skriver in något och sedan trycker på Sök.

 

AfterUpdate körs direkt när textrutan lämnas och fältet ändrats, oavsett om du trycker på Enter eller inte.

Detta är jag inte riktigt med på vad du menar. När jag skriver in något och trycker Enter så söker den fram som den ska. Skriver jag in något och lämnar fältet så söker den fram som den ska.

 

Om jag skriver in något och lämnar fältet söker den fram som den ska och trycker jag därefter sök när jag lämnar fältet visas alla poster. Isåfall visar andra filtreringen alla poster.

 

Tanken är väl att man ska kunna välja att antingen söka genom att skriva in och lämna fältet med Enter vilket är vanligt eller att trycka Sök när man skrivit in.

 

Ungefär som Google. Man söker via skriva och sök eller så skriver man in och trycker Enter och den söker.

Länk till kommentar
Dela på andra webbplatser

Koden funkar ändå inte trots att jag kollat namn och titlar på sökrutan. Titel på sökrutan är text17 och formuläret heter frmorderuppgifter. Den säger ange parametervärde och [name]

 

[Namn] SOM "*" & [Formulär]![frmorderuppgifter]![text17] & "*" ...

ORSAK: Felet beror på att du använder fältnamnet 'Namn' i tabellen. 'Namn' är det svenska benämningen på egenskapen 'Name' i Access. Tyvärr översätter Access dom svenska egenskapsnamnen till deras engelska motsvarighet innan filtret aktiveras. Sedan känner den inte igen fältnamet [name] i filtret.

 

LÖSNING 1: Ändra fältnamnet i tabellen från Namn till exempelvis FtgNamn.

 

LÖSNING 2: Skapa ett nytt namn i frågan qryOrderuppgifter så här:

SELECT frmorderuppgifter.Namn AS FtgNamn FROM frmorderuppgifter;

 

LÖSNING 1 & 2:

Ändra sedan källa och namn på kontollen i formuläret samt filtrera sedan på FtgNamn i makrot.

 

LÖSNING 3:

Använd VBA-kod för att filtrera. Då översötter inte Access egenskapsnamnen men i vba skrivs alla filter direkt på 'engelska'.

DoCmd.ApplyFilter , "[Namn] Like ""*" & [Forms]![frmorderuppgifter]![text17] & "*"""

Länk till kommentar
Dela på andra webbplatser

Namn kommer genom att jag i qryOrderuppgifter slog ihop Efternamn och förnamn.

Efternam&" "&Förnamn

 

Så det är alltså Namn som ställer till det.

 

Ska testa

Länk till kommentar
Dela på andra webbplatser

Kanon. Om man tittar på filtret så skrivs det exempelvis  och detta är ju dynamiskt:
[Förnamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER

"*" gör att Access söker efter allt jag skriver och känner om finns något som innehåller på något sätt.

 

Jag antar att det går reglera det så att den söker efter allt som börjar med exempelvis.
Jag är med på and*, *and osv. (börjar med , slutar med ) men jag kan ju inte skriva så i filtret då jag vill ha filtret dynamiskt!? Jag har inte tänkt använda sökrutan och söka efter sådant som söker efter b enbart.

Hur kan man alltså reglera i detta uttryck så den enbart söker efter sådant som börjar med?:

[Förnamn] SOM "*" & [Formulär]![frmsök]![text16] & "*" ELLER

Länk till kommentar
Dela på andra webbplatser

Private Sub filtrera()
    Dim sok As Variant
    sok = [Forms]![frmorderuppgifter]![Text17]
    If IsNull(sok) Then
        ' Ingen söktext - visa alla
        DoCmd.ShowAllRecords
    ElseIf InStr(sok, "*") > 0 Then
        ' Wildcard (*) anges - egen filtrering
        DoCmd.ApplyFilter , "[Namn] Like """ & sok & """"
    Else
        ' Standard - söker bara poster som börjar med söktexten
        DoCmd.ApplyFilter , "[Namn] Like """ & sok & "*"""
    End If
    Text17.SetFocus
End Sub

Med ovanstående kod så görs sökning bara i görjan om när man skriver in enbart text.

För att söka som 'del av' lägger man till * i början av söktexten: tex: *ande

Blank söktext visar alla poster.

Länk till kommentar
Dela på andra webbplatser

Detta är jag inte riktigt med på vad du menar. När jag skriver in något och trycker Enter så söker den fram som den ska. Skriver jag in något och lämnar fältet så söker den fram som den ska.

 

Om jag skriver in något och lämnar fältet söker den fram som den ska och trycker jag därefter sök när jag lämnar fältet visas alla poster. Isåfall visar andra filtreringen alla poster.

 

Tanken är väl att man ska kunna välja att antingen söka genom att skriva in och lämna fältet med Enter vilket är vanligt eller att trycka Sök när man skrivit in.

 

Ungefär som Google. Man söker via skriva och sök eller så skriver man in och trycker Enter och den söker.

 

Hade missat denna kommentar :)

 

Det jag menar är att koden som är kopplad till Sök-knappen inte behövs för filtreringen görs av koden i AfterUpdate.

När man skrivit in något i sökrutan och sedan klickar på knappen så kommer AfterUpdate köras innan fokus flyttas till knappen. Så filtreringen är redan gjord.

 

Prova ta bort koden som är knuten till knappens händelse OnClick så kommer du se att programmet fungerar ändå.

 

Men det är som sagt petitesser, utan stora datamängder så går det snabbt att filtrera två gånger.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...