Avatar billede jjensen Juniormester
13. august 2001 - 14:22 Der er 35 kommentarer og
2 løsninger

Søg i kombo felt

Jeg har 4-5 felter i en formular hvor jeg benytter kombo-felter. I alle andre typer felter kan jeg fint søge med en søg-post-kommandoknap, jeg har lavet...

Men hvordan gør jeg hvis det drejer sig om at finde en bestemt værdi i en kombo box, uden at skulle lave en hel forespørgsel hver gang - kan jeg det?

Avatar billede moses Praktikant
13. august 2001 - 14:32 #1
Indholdet i en kombobox er det, der står i selve feltet over listen. Det har samme muligheder med det felt, som med almindelige text felter.

Men det er noget andet, hvis det er de data, der står i selve pull-down delen af feltet. De er ikke umiddelbart tilgængelige, som data, men kun som parametre til selve kombobox feltet.
Avatar billede jjensen Juniormester
13. august 2001 - 14:36 #2
Hmm - så kan jeg altså ikke søge efter en bestemt værdi som er en af mulighederne i kombox feltet?

Hvad gør man så?
Avatar billede hugopedersen Nybegynder
13. august 2001 - 14:36 #3
Prøv at kigge forbi www.access.hugopedersen.dk og se om ikke der skulle være et af mine moduler der indeholder en søgefunktion til en combobox - jeg mener jeg har lavet en.

Avatar billede jjensen Juniormester
13. august 2001 - 14:41 #4
Hugopedersen -> modcboxutilities.bas ligner det rigtige, men jeg er desværre nybegynder med Access - så jeg har lidt svært ved at gennemskue hvordan jeg indbygger det i min base....
Avatar billede hugopedersen Nybegynder
13. august 2001 - 14:45 #5
OK - jeg skal lige rode lidt i mine sourcefiler for at finde et sted hvor jeg bruger det. Jeg kan ikke huske i hvilken forbindelse det var jeg lavede det, så jeg skal lige kigge lidt.
Måske er det noget jeg har der hjemme og så kan jeg ikke svare før i aften.

Send lige din mailadresse til mail@hugopedersen.dk for en sikkerheds skyld.

Avatar billede moses Praktikant
13. august 2001 - 14:50 #6
Du kan få fat i den streng, som definerer mulighederne:

Me.Controls(\"Combo1\").RowSource

Avatar billede moses Praktikant
13. august 2001 - 14:52 #7
Det er kun, hvis der er tale om en Value list.

Hvis der er tale om en Table/Query, så vil denne paramter angive den tabel eller query, som indeholder mulighederne. Dem får du så fat i, som almindelige records.
Avatar billede hugopedersen Nybegynder
13. august 2001 - 14:59 #8
Hvis min funktion bruges så er syntaxen
intX = fhpSearchComboBox(cboName, \"Search for\")
Me.cboName = Me.cboName.ItemData(intX)

Det der sker er at man kalder funktionen fhpSearchComboBox med navnet på comboboxen og den streng man vil søge efter. Man før så et tal tilbage der er det item der indeholder den første forekomst af teksten. Den skiftes der så til i næste kodelinie.
Hvis strengen ikke findes, returneres 0 og der vælges bare det første element på listen.

Avatar billede jjensen Juniormester
13. august 2001 - 15:03 #9
Her er koden jeg fandt på din side - efter beskrivelsen at dømme: \"Purpose: Search for a value in a combobox\" - Er det præcist dét, jeg leder efter...

Men hvordan gør jeg rent praktisk? - det er måske det du vil kigge på senere?

---
On Error GoTo Error_fhpSearchComboBox
  Dim intLineNum As Integer                                      \'Counter
  Dim intNumRecs As Integer                                      \'Counter
  Dim bolFound As Boolean                                        \'Test variable
  Dim intLowNum As Integer                                        \'Counter
  Dim intHighNum As Integer                                      \'Counter
  Dim intMidNum As Integer                                        \'Counter

  intLineNum = -1                                                \'Negative number indicates string not found
  intNumRecs = cboIn.ListCount                                    \'Number of items
  bolFound = False                                                \'Initialize to not found
  intLowNum = 0                                                  \'Lowest number
  intHighNum = intNumRecs - 1                                    \'Highest number
 
  Do
    intMidNum = (intLowNum + intHighNum) \\ 2
    If UCase(strSearch) < UCase(cboIn.ItemData(intMidNum)) Then
      intHighNum = intMidNum - 1
    ElseIf UCase(strSearch) > UCase(cboIn.ItemData(intMidNum)) Then
      intLowNum = intMidNum + 1
    Else
      bolFound = True                                            \'Value found
      intLineNum = intMidNum
    End If
  Loop Until bolFound Or (intHighNum < intLowNum)
 
  fhpSearchComboBox = intLineNum                                  \'Return line found, or -1 if not found

Exit_fhpSearchComboBox:
  Exit Function

Error_fhpSearchComboBox:
  MsgBox \"Error: \" & Err.Number & \". \" & Err.Description, , _
    \"BinarySearchComboBox\"
  Resume Exit_fhpSearchComboBox

End Function
Avatar billede jjensen Juniormester
13. august 2001 - 15:04 #10
Uha - jeres svar er lidt langhårede får lille mig :-)
Avatar billede hugopedersen Nybegynder
13. august 2001 - 15:05 #11
Du sætter funktionen ind i et kodemodul og så kalder du den lig det jeg skrev i tidligere kommentar.
Avatar billede jjensen Juniormester
13. august 2001 - 15:19 #12
hugopedersen ->

Mener du, jeg skal give kodemodulet, med koden nævnt her ovenfor, navnet fhpSearchComboBox ?
Avatar billede hugopedersen Nybegynder
13. august 2001 - 15:22 #13
Du bestemmer helt selv hvad dit modul skal hedde!

Avatar billede jjensen Juniormester
13. august 2001 - 15:27 #14
Jeg er ny med Access dette vil være første gang jeg laver et modul - har du en lille hurtig
1)
2)
3) - procedure?
Avatar billede jens-peter Nybegynder
13. august 2001 - 22:59 #15
Så vidt jeg kan se, er den angivne funktion fra hugopedersen bygget på en binær søgning, og virker derfor kun, hvis listen af linier i comboboxen er sorteret alfabetisk - hvilket de næppe kan forudsættes at være.

Princippet i funktionen er OK, men man bør bare løbe listen igennem fra en ende af, og som regel er der heller ikke så mange linier i en combobox, at det kan svare sig at lave en binær søgning.

Teksten  i do-loopen kan f.eks. udskiftes med:

For intLowNum = 0 to intNumRecs - 1
  If cboIn.ItemData(intLowNum) = strSearch then
    IntLineNum = intLowNum
    Exit for
  end if
Next

mvh/Jens-Peter
Avatar billede jjensen Juniormester
14. august 2001 - 09:49 #16
Ved ikke helt om jeg har udtrykt det helt rigtigt, så for en ekstra sikkerheds skyld kommer lige en nærmere forklaring:

Jeg har X antal posteringer(kunder) som jeg bladrer imellem i en formular, ved f.eks. at lave en alm. tekstsøgning i nøgle felter for at finde en kunde (flere kunder) med netop dét kriterie.

Men hvis jeg f.eks. vil finde en kunde med en vis værdi i et felt der er lavet som komboboks i formularen, kan jeg ikke søge med alm. søgefunkt.

Det er altså ikke fordi der findes et hav af forskellige værdier i comco-box jeg har svært ved at finde, der er problemet.

Dét er blot at hvis jeg vil vælger en bestemt værdi (måske er der kun 5-10 stk) i en box og få vist resten af dataerne tilhørende denne værdi.

Mvh
John


Avatar billede jjensen Juniormester
14. august 2001 - 13:31 #17
Er der ingen der kan/vil hjælpe mere? *snøft*
Avatar billede hugopedersen Nybegynder
14. august 2001 - 13:36 #18
Jeg forstår ikke at den almindelige standard Access søgerutine ikke virker !
Det gør den da for mig.
Avatar billede moses Praktikant
14. august 2001 - 13:55 #19
Se lige denne tekst længere oppe !!!!
Det er ikke umiddelbart muligt, men via VBA er det selvfølgelig muligt.

Indholdet i en kombobox er det, der står i selve feltet over listen. Det har samme muligheder med det felt, som med almindelige text felter.

Men det er noget andet, hvis det er de data, der står i selve pull-down delen af feltet. De er ikke umiddelbart tilgængelige, som data, men kun som parametre til selve kombobox feltet.   

  Kommentar fra jjensen 
-------------------------------
Hmm - så kan jeg altså ikke søge efter en bestemt værdi som er en af mulighederne i kombox feltet?


Avatar billede moses Praktikant
14. august 2001 - 13:56 #20
Du siger ikke det samme nu, som i denne tekst - eller gør du ?!?!?!
Avatar billede moses Praktikant
14. august 2001 - 13:58 #21
Du skal jo lige sikre dig, at combobox\'en er Bound (tildelt en kolonne fra recordSource\'en) ligesom de andre felter !!!
Avatar billede moses Praktikant
14. august 2001 - 13:59 #22
Ellers har hugopedersen ret i, at det bare er at søge med standard søgning.
Avatar billede jjensen Juniormester
14. august 2001 - 14:07 #23
Er helt ny med Access :-) prøver igen: hvis f.eks. en bruger heder Anders And og har tlf. 11223344 og har en mobil mærket Nokia 3310

I Mobil-comboboxen kan man vælge imellem Nokia 3310, Nokia 6210, Nokia 8550 som er data i en tabel der hedder mobil type f.eks.

Nu vil jeg så gerne se alle brugere (via min formular) med en Nokia 3310 (uden nødvendigvis at skulle oprette en forespørgsel)

Mvh
John
Avatar billede moses Praktikant
14. august 2001 - 14:13 #24
Jamen det kan udelukkende lade sig gøre på to måder:

Du begrænser Formens RecordSource til kun at omfatte brugere med disse kriterier.

Eller

Du udfører en query på den bagved liggende tabel/Query med disse kriterier og viser dette.

Du har ud over dette også mulighed for at vælge, om du vil vise resultatet, som enkelte records eller, som en liste.
Avatar billede hugopedersen Nybegynder
14. august 2001 - 14:13 #25
Så burde du kunne gøre det med knapperne der hedder noget i retning af \'filter by form\' ( på den engelske - jeg husker ikke hvad det hedder på dansk )
Avatar billede moses Praktikant
14. august 2001 - 14:23 #26
Det er lige netop, men det er ikke nok.

Hvis du blot vil begrænse din form til kun at vise de records, hvor der er valgt Nokia 3310, så skal du lave en OnOpenForm event:

Private Sub Form_Open(Cancel As Integer)
    Me.filter = \"[TlfType] = \'Nokia 3310\'\"
    Me.FilterOn = True
End Sub
Avatar billede jjensen Juniormester
14. august 2001 - 14:26 #27
->hugopedersen - Har prøvet din metode; dejlig nem :-)

Men problemet er blot at jeg ændrer entry\'en på den post når jeg vælger at filtere på den måde...?

Man kan selvfølgelig bladre til man finder en med den værdi man øsnker at filterer efter...
Avatar billede hugopedersen Nybegynder
14. august 2001 - 14:30 #28
Det forstår jeg ikke rigtig !

Kan du ikke prøve at maile mig din db så skal jeg lige prøve at kaste et blik.
Avatar billede jjensen Juniormester
14. august 2001 - 14:31 #29
Meget gerne hvad er din email?
Avatar billede hugopedersen Nybegynder
14. august 2001 - 14:32 #30
hugo.work@bigfoot.com
Avatar billede moses Praktikant
14. august 2001 - 14:38 #31
Hvis du istedet skriver:

Private Sub Form_Open(Cancel As Integer)
    Me.filter = \"\"
    Me.FilterOn = True
End Sub

og har et tekst-/komboboksfelt på headeren af din form, som hedder valg og har følgende kode:

Private Sub PersonID_AfterUpdate()
    Me.Filter = \"[TlfType] = \'\" & Me![valg] & \"\'\"
End Sub


Du får alle records vist igen ved blot at trykke højre musetaste over feltet valg og vælge \"remove filter\"
Avatar billede moses Praktikant
14. august 2001 - 14:40 #32
Teksten \"PersonID\" skal lige skiftes ud, med navnet \"valg\" !!

Det virker - hver gang.
Avatar billede jjensen Juniormester
14. august 2001 - 14:46 #33
Har sendt DB til hugopedersen...

Men moses din idé lyder også god - desværre skal jeg lige først lære hvor jeg skriver den kode du nævner.

Vil jeg da kunne søge på alle de kombo-boxe der måtte være?
Avatar billede jjensen Juniormester
14. august 2001 - 15:03 #34
Opdagede lige jeg kunne højre klikke i comboboxen, og filterer efter den teskt jeg skrev - ulempen er lidt at man vel skal skrive det nøjagtigt som angive - og ikke kan vælge værdien i boxen...
Avatar billede moses Praktikant
14. august 2001 - 15:22 #35
Når du har en form freme i Design visning, så har du også Vindiet \"Egenskaber\" / \"Properties\" fremme.

Hvis ikke, så højreklik med musen på øverste venstre hjørne af formen og vælg Egenskaber/Properties. Så komer det i hvert tilfælde frem.

Herefter klikker du en enkelt gang på f.eks. Øverste venstre hjørne af formen, hvorefter du i egeneskabs-vinduet ser alle egenskaber for selve formen.
Vælger du dér fanebladet hændelser/events, kan du bl.a se en linie, der hedder OnOpen.
Hvis du klikker en gang der og derefter på den lille knap med prikkerne, der så kommer frem til højre for feltet, så kan du der vælge Kode.
Nu får du søreme det hele serveret på et sølvfad:

Du skal kun klippe-klistre de to linier:

Me.filter = \"\"
Me.FilterOn = True

ind der og så klikke oppe på Access knappen næsten øverst i venstre hjørne af vinduet. Så er du tilbage i Access igen.

Derefter klikker du en enkelt gang på det tekstfelt \"valg\", som du først har placeret i headeren af formen (læg mærke til, at formen faktisk er opdelt i header mellemled og footer). Headeren kan udviddes nedadtil, ved blot at klikke og holde på stregen imellem de fede grå vandrette stolper imens du trækker lidt nedad og så slipper musekanppen igen.
Grunde til, at tekstfeltet skal ligge der er, hvis du skulle komme til at definere et kriterie, som ingen records kan opfylde, så vil alt inklusiv dit tekstfelt forsvinde fra mellemleddet af formen !
Når du har klikket den ene gang på tekstfeltet, vælger du \"After Update\" linien ovre i \"Egenskab\"/\"Properties\" under fanebladet \"Hændelser\"/\"Events\".
Her klikker du så igen på den lille knap med prikkerne, som komer frem ude til højre for feltet. Og derefter vælger du Kode igen.
Vupti - så er det meste arbejde allerede lavet. Du indsætter blot linien:

Me.Filter = \"[TlfType] = \'\" & Me![valg] & \"\'\"

Du kan selvfølgelig vælge at søge på et andet felt end TlfType!
Avatar billede jjensen Juniormester
15. august 2001 - 09:42 #36
Tusind tak indtil videre - til jer begge. Problemet er nu løst - vil benytte moses \"brugervenlige\" udgave på et lidt senere tidspunkt!
Avatar billede jjensen Juniormester
15. august 2001 - 09:42 #37
Tusind tak indtil videre - til jer begge. Problemet er nu løst - vil benytte moses \"brugervenlige\" udgave på et lidt senere tidspunkt!
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