[ACCESS] Zoekscherm maken

Pagina: 1
Acties:
  • 1.089 views sinds 30-01-2008
  • Reageer

  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Ik zit met het volgende:

Ik heb een tabel met een aantal velden waaronder Achternaam, tussenvoegsel, voornaam, geslacht, geboortedatum etc.
Nu heb ik een formulier gemaakt met allemaal tekstvakken met de beschrijving Achternaam, tussenvoegsel, etc...
Hier staat ook een zoekknop op.

De bedoeling is dat als je een gedeelte van de achternaam in voert en dan op de knop drukt dat je in een listbox de gegevens welke voldoen aan de zoekcriteria.
Ik ben een heel eind en heb echt me de t*ring gezocht om maar even direct te blijven. Heb een query gemaakt welke de gegevens uit de hoofdtabel haalt.
Echter nu het volgende:
In deze query heb ik het volgende onder Achternaam staan:
Like "*" & [Forms]![frm_terugkoppeling]![Achternaam] & "*" Or Is Null.

Dit werkt op zich perfect maar alleen op achternaam.
Als ik dit nu onder elk veld zet met vervanging van Achternaam naar tussenvoegsel etc dan wordt het een ander verhaal.

Dus ongeveer het volgende:

Achternaam
Like "*" & [Forms]![frm_terugkoppeling]![Achternaam] & "*" Or Is Null.

Tussenvoegsel
Like "*" & [Forms]![frm_terugkoppeling]![Tussenvoegsel] & "*" Or Is Null.

Voornaam
Like "*" & [Forms]![frm_terugkoppeling]![Voornaam] & "*" Or Is Null.

Als je nu zoekt op alleen achternaam dan laat hij in de listbox wel deze waarden zien maar alleen waar tussenvoegsel niet leeg is en voornaam ook niet.
Dat moet dus wel kunnen want de meeste achternamen hebben geen tussenvoegsel.
Ik heb hier mee gestoeid en kom er gewoon niet meer uit. Het zal misschien heel makkelijk zijn maar ik zie het echt niet meer.
Ik weet een beetje van Access en heb het mijzelf allemaal aangeleerd laatste tijd en heel veel gevonden door te zoeken.

Even ter verduidelijking: kom aub niet met antwoorden van F1 of weet ik veel want daar ben ik niet mee geholpen namelijk, dat heb ik namelijk allang gedaan 8)

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Vreemd, zo op het eerste gezicht zou het moeten werken. Weet je zeker dat de lege velden in je tabel null waarden zijn en geen lege strings? Post eens de sql string zoals de querybuilder die opbouwt?

in het ontwerpraster op menu beeld-->sql

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Niesje schreef op donderdag 26 januari 2006 @ 10:56:
Vreemd, zo op het eerste gezicht zou het moeten werken. Weet je zeker dat de lege velden in je tabel null waarden zijn en geen lege strings? Post eens de sql string zoals de querybuilder die opbouwt?

in het ontwerpraster op menu beeld-->sql
Als het wel lege strings zijn wat zou ik dan aan de code moeten veranderen?

Ik ben weer van voren af aan begonnen dus heb alleen nog maar achternaam en tussenvoegsel, maar ja als die beiden werken dan krijg ik automatisch ook de rest wel aan de gang.

Gedeelte uit de query:
code:
1
2
FROM tbl_cr
WHERE (((tbl_cr.Achternaam) Like "*" & [Forms]![frm_terugkoppeling]![Achternaam] & "*" Or (tbl_cr.Achternaam) Is Null) AND ((tbl_cr.Tussenvoegsel) Like "*" & [Forms]![frm_terugkoppeling]![Tussenvoegsel] & "*" Or (tbl_cr.Tussenvoegsel) Is Null));


Oh ja nu doet achternaam het wel, maar tussenvoegsel dus niet meer.

edit:
Ik ben ietsje verder, nou ja het werkt nog niet maar het volgende.
Hij neemt bij het zoeken dus ook de lege records mee, ik weet echter niet of deze null of lege strings zijn.

[ Voor 33% gewijzigd door MaxEagle op 26-01-2006 16:11 ]


  • Boss
  • Registratie: September 1999
  • Laatst online: 28-07 14:18

Boss

+1 Overgewaardeerd

Ik doe dit soort dingen meestal door niet de query te maken met verwijzingen naar textvelden op mijn form, dat vind ik onduidelijk. In plaats daarvan laat ik de SQL steeds samenstellen als je op een knop drukt of als er een veld een nieuwe waarde krijgt.
Bijvoorbeeld:
Visual Basic:
1
2
3
4
5
6
Dim strWhere as String
  if nz(txtAchternaam) <> "" then strWhere = strWhere & " AND Achternaam Like *" & txtAchternaam & "*"
  if nz(txtVoornaam) <> "" then strWhere = strWhere & etc etc

cboResult.Rowsource = "SELECT bla FROM bla WHERE (1=1) " & strWhere
cboResult.Requery

Dan hoef je in ieder geval ook niet zo in die query-editor te rommelen.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Boss schreef op vrijdag 27 januari 2006 @ 13:13:
Ik doe dit soort dingen meestal door niet de query te maken met verwijzingen naar textvelden op mijn form, dat vind ik onduidelijk. In plaats daarvan laat ik de SQL steeds samenstellen als je op een knop drukt of als er een veld een nieuwe waarde krijgt.
Bijvoorbeeld:
Visual Basic:
1
2
3
4
5
6
Dim strWhere as String
  if nz(txtAchternaam) <> "" then strWhere = strWhere & " AND Achternaam Like *" & txtAchternaam & "*"
  if nz(txtVoornaam) <> "" then strWhere = strWhere & etc etc

cboResult.Rowsource = "SELECT bla FROM bla WHERE (1=1) " & strWhere
cboResult.Requery

Dan hoef je in ieder geval ook niet zo in die query-editor te rommelen.
ok dat snap ik echter je kan hier nog niet op 2 dingen tegelijk zoeken of wel?
Op voornaam en achternaam bijvoorbeeld?
Dat krijg ik echter niet voor elkaar. Vind het wel handig om de code weg te schrijven alleen onder 1 knop maar dan zit ik nog met het probleem dat ik maar op 1 veld kan zoeken.

  • Boss
  • Registratie: September 1999
  • Laatst online: 28-07 14:18

Boss

+1 Overgewaardeerd

Met de code hierboven kan je op alletwee de velden zoeken, de string strwhere wordt immers gewoon per filter aangepast en uitgebreid.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Boss schreef op maandag 30 januari 2006 @ 15:27:
Met de code hierboven kan je op alletwee de velden zoeken, de string strwhere wordt immers gewoon per filter aangepast en uitgebreid.
Ja je hebt gelijk echter het probleem blijft hetzelfde in principe. De oplossing vind ik wel netter maar het probleem blijft dat het SQL gedeelte natuurlijk hetzelfde blijft. En ik kom er dus niet uit wat dat moet zijn voor 2 tekstvakken.

  • Boss
  • Registratie: September 1999
  • Laatst online: 28-07 14:18

Boss

+1 Overgewaardeerd

Volgens mij is de SQL al vanaf het begin goed geweest, maar ging het eerst fout op het moment dat er in een veld geen waarde stond. Met de manier die ik beschrijf kan je dat iets makkelijker debuggen door even een MsgBox strWhere ergens te zetten en kijken of de syntax van de SQL die eruit komt klopt.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Boss schreef op dinsdag 31 januari 2006 @ 08:51:
Volgens mij is de SQL al vanaf het begin goed geweest, maar ging het eerst fout op het moment dat er in een veld geen waarde stond. Met de manier die ik beschrijf kan je dat iets makkelijker debuggen door even een MsgBox strWhere ergens te zetten en kijken of de syntax van de SQL die eruit komt klopt.
Ja het kon verdorie wel eens werken ook, man je bent mijn held :).
Even een paar dingen aanpassen maar het lijkt nu te werken, zal hier even mee aan de slag.

Nog een paar dingen, ben niet heel erg thuis in VB, pas enkele weken mee bezig.
waar gebruik je nz voor en (1=1)?

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 22-07 13:36
Die (1=1) staat er om dat je dan kan vervolgen met een AND

vergelijk:

1. SELECT * FROM tabel WHERE (1=1) AND achternaam LIKE...
en
2. SELECT * FROM tabel WHERE AND achternaam LIKE

1 Gaat werken, 2 niet.

Houdoe


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Witte schreef op dinsdag 31 januari 2006 @ 13:52:
Die (1=1) staat er om dat je dan kan vervolgen met een AND

vergelijk:

1. SELECT * FROM tabel WHERE (1=1) AND achternaam LIKE...
en
2. SELECT * FROM tabel WHERE AND achternaam LIKE

1 Gaat werken, 2 niet.
hehe ok zoiets dacht ik inderdaad al ja. Ik wou eigenlijk gewoon de strWhere trimmen om de eerste AND weg te halen, maar goed dit is ook een manier dus.
Het werkt in ieder geval perfect tot nu toe, zal het even uitbouwen, het gaat om een 20 tal invoervelden dus ff wat c&pen :)
Heren mag ik jullie hartelijk danken want ik zat hier al een flinke tijd mee te stoeien!!

[ Voor 19% gewijzigd door MaxEagle op 31-01-2006 14:11 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

MaxEagle schreef op dinsdag 31 januari 2006 @ 14:10:
[...]
Het werkt in ieder geval perfect tot nu toe, zal het even uitbouwen, het gaat om een 20 tal invoervelden dus ff wat c&pen :)
Lusje? Even ervan uitgaande dat het allemaal tekstvelden zijn en je de tag (extra info) nergens anders voor gebruikt kun je zoiets dergelijks doen:
Zet in de tag van de controls de bijbehorende veldnaam en dit stukje code bouwt de querystring op.

Visual Basic:
1
2
3
4
5
6
7
8
dim c as control
For each c in me.controls
      If c.ControlType = acTextBox Then
            If c.Tag > "" And c.Value > "" Then
                     strWhere=strWhere & " AND " & c.tag & " Like '*" & c.value & "*'"
            end if
      end if
next c

[ Voor 8% gewijzigd door Lustucru op 31-01-2006 14:39 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Niesje schreef op dinsdag 31 januari 2006 @ 14:38:
[...]


Lusje? Even ervan uitgaande dat het allemaal tekstvelden zijn en je de tag (extra info) nergens anders voor gebruikt kun je zoiets dergelijks doen:
Zet in de tag van de controls de bijbehorende veldnaam en dit stukje code bouwt de querystring op.

Visual Basic:
1
2
3
4
5
6
7
8
dim c as control
For each c in me.controls
      If c.ControlType = acTextBox Then
            If c.Tag > "" And c.Value > "" Then
                     strWhere=strWhere & " AND " & c.tag & " Like '*" & c.value & "*'"
            end if
      end if
next c
Er zitten ook wat listboxen en wat selectievakjes en dergelijke....
maar goed ik zal je code ff bekijken, scheelt een eind als ik dat zo zie en leer ik weer wat van.

code:
1
If c.Tag > "" And c.Value > "" Then
moet
code:
1
If c.Tag <> "" And c.Value <> "" Then
zijn of niet?
Bij mij keert ie een lege strWhere uit terwijl er wel tekstbox gevuld zijn? Enig idee wat er fout is?

[ Voor 18% gewijzigd door MaxEagle op 31-01-2006 16:25 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

heeft c.tag wel een waarde? (eigenschappen, extra info)?

offtopic:
In theorie werkt '>' een fractie sneller. (0,1 sec bij 500000 iteraties oid). Bij strings zou if len(str) nog netter zijn.Functioneel komt het bij strings op hetzelfde neer.

[ Voor 4% gewijzigd door Lustucru op 01-02-2006 00:37 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Niesje schreef op woensdag 01 februari 2006 @ 00:36:
heeft c.tag wel een waarde? (eigenschappen, extra info)?

offtopic:
In theorie werkt '>' een fractie sneller. (0,1 sec bij 500000 iteraties oid). Bij strings zou if len(str) nog netter zijn.Functioneel komt het bij strings op hetzelfde neer.
De c.tag is inderdaad leeg. Op zich werkt het wel maar moet de naam van de textbox er wel uit zien te krijgen en dat werkt nog niet. Anders is dit een nog mooiere methode.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik heb een voorkeur voor de tag omdat je daar alles naar keuze in kwijt kunt. Gebruik je de .name property dan moet je hem weer met [] omsluiten als er spaties in voor zouden komen; of je moet hem parsen als je bv een specifieke naamgeving gebruikt voor je controls. Jezelf dwingen de naam van een control aan te passen aan een specifieke functionaliteit is imho niet slim. Sowieso is het slim om op een of andere manier de controls die je wilt opnemen in de query te waarmerken, en dat kan dus door tag in te vullen.

Enfin, mocht je dat nu allemaal onzin vinden en toch de naam van de control willen gebruiken als veldnaam dan wijzig je de code:
code:
1
strWhere=strWhere & " AND [" & c.name & "] Like '*" & c.value & "*'"

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
code:
1
2
3
4
5
6
7
8
9
10
11
For Each c In Me.Controls
  With c
    Select Case .ControlType
      Case acTextBox
        .SetFocus
          If c.Value <> "" Then
             strWhere = strWhere & " AND (qry_zoektemp.[" & c.Name & "]) Like '*' & [Forms]![frm_Zoek]![" & c.Name & "] & '*'"         
         End If
     End Select
  End With
Next c


Dat heb ik nu en dit schijnt te werken!! Nu zal ik nog even de comboboxen etc er tussen proppen en dan heb ik gewoon met een paar regels tekst een prachtig zoekformulier waar ik al tijden naar op zoek ben _/-\o_ .

[ Voor 25% gewijzigd door MaxEagle op 01-02-2006 10:56 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

ieeek! Nu zet je in de query een verwijzing naar je formulier, m.a.w. de query moet runtime weer terug naar het formulier om daar de waarde op te zoeken. Net zo makkelijk, en zeker zo efficient, zet je de waarde zelf erin: "like '*" & c.value & "'" ipv Like '*' & [Forms]![frm_Zoek]![" & c.Name & "] & '*'

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Niesje schreef op woensdag 01 februari 2006 @ 11:53:
ieeek! Nu zet je in de query een verwijzing naar je formulier, m.a.w. de query moet runtime weer terug naar het formulier om daar de waarde op te zoeken. Net zo makkelijk, en zeker zo efficient, zet je de waarde zelf erin: "like '*" & c.value & "'" ipv Like '*' & [Forms]![frm_Zoek]![" & c.Name & "] & '*'
Je hebt gelijk, werkte net niet dus had het maar gecombineerd met mijn oude oplossing. Echter zie nu dat het om een typefout ging. Hij werkt nu met
code:
1
strWhere = strWhere & " AND (qry_zoektemp.[" & c.Name & "]) Like '*" & c.Value & "*'"


Zoals ik al zei: VB is nog niet mijn sterkste kant, maar aldoende leert men ;)

Nu wil ik eigenlijk ook nog 1 tekstvakje maken waar je een zoekcriteria in kan geven en dan de gehele tabel (alle velden) worden doorzocht...zal eens kijken of ik hier zelf uit kom

[ Voor 21% gewijzigd door MaxEagle op 01-02-2006 14:30 ]

Pagina: 1