record zoeken

Status
Niet open voor verdere reacties.

JEPEDEWE

Terugkerende gebruiker
Lid geworden
14 jun 2006
Berichten
1.682
Hallo,

Ik vrees dat de manier waarop IK binnen acces programmeer niet echt de beste manier is..
Dingen werken wel maar het is dikwijls veel te omslachtig.
Daarom deze vraag
Stel, je hebt een database met heel wat records
Je maakt een formulier aan met daarop een entry-field om een naam in te geven
Op basis hiervan wil ik het record zien.. zo "eenvoudig"
Nu steek ik die naam in een query en toon zo het record..
Waarschijnlijk kan het heel wat anders en sneller..
Wil iemand mij eens eenvoudig uitleggen hoe... misschien met een voorbeeldje???:p
Heel erg bedankt

JP
 
Ik gebruik meestal een niet-gebonden keuzelijst waarin je de persoon opzoekt. Bij een klik kun je dan ofwel de persoon opzoeken, ofwel het formulier filteren. Wat het beste aansluit op je behoefte.
 
Het is de syntax die me interesseert...
wat moet je declareren welke code heb je nodig voor je de form opent met de correcte record..
DAT zou ik graag eens weten
JP
 
Die is niet zo moeilijk, zal ik morgen voor je posten.
 
Om te beginnen een leuke; een filter op basis van een tekstveld. Je gebruikt die op een doorlopend formulier, waarbij je het formulier 'live' filtert op de letters die je intypt. Die tekst staat dan op een willekeurige plek in tekstveld.
Code:
Private Sub Zoektekst_Change()
Dim sZ As String
    sZ = Me.Zoektekst.Text
    If Len(sZ) > 0 Then
        Me.Filter = "[Medewerker_naam] Like ""*" & sZ & "*"""
        Me.FilterOn = True
        Me.Zoektekst.SelStart = Len(sZ)
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Sub

Dan op basis van een keuzelijst filteren:

Code:
Private Sub cboMedewerker_Click()
    If Me.cboMedewerker <> vbNullString Then
        Me.Filter = "[MedewerkerID] = " & Me.cboMedewerker
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Sub
En als laatste op basis van een keuzelijst zoeken. Hierbij blijft de hele recordset dus in beeld.
Code:
Private Sub cboMedewerker_Click()
Dim rs As Recordset
    Set rs = Me.RecordsetClone
    With rs
        .MoveFirst
        .FindFirst "[MedewerkerID] = " & CStr(Me.cboMedewerker)
        If .NoMatch Then
            MsgBox "Geen record gevonden"
        Else
            Me.Bookmark = rs.Bookmark
        End If
        .Close
    End With
End Sub
 
OK, Michel... das een eerste stap, maar nadat je op de keuzelijst geklikt hebt moet er zich toch een form openen op basis van wat je koos
Wat is hier dan de juiste syntax voor?

JP
 
Als je een doorlopend formulier gebruikt zoals Michel voorstelde met daarboven bv de keuzelijst dan is je form al open en wordt die gewoon gefilterd op hetgeen je hebt gekozen.
Je kunt dan wel bv extra een enkelvoudig formulier openen als dialoogvenster (pop-up) die de info van die ene record misschien overzichtelijker toont; maar dan zou ik dan doen door een dubbelklik gebeurtenis te hangen aan het formulier.
 
da's duidelijk, maar ik zou graag een individuele form openen op basis van wat je in de keuzelijst koos...
Oogt beter he

JP
 
Dat kan dus door een formulier te openen op basis van een klik, de sleutelwaarde uit te lezen en te gebruiken als filter op het formulier. Je geeft dus het filter mee bij het openen van het tweede formulier.
 
Wat met dimentioneren van recordsets of database toestanden.. hoe pak je de filter mee? Enfin, een voorbeeldje zou leuk zijn.. ;)
 
Code laat zich vrij makkelijk bouwen als je de IntelliSense gebruikt; je pakt dan alle parameters die je nodig hebt min of meer automatisch. Voor het openen van een gefilterd formulier heb je de parameter <WhereCondition> nodig. En dan krijg je iets als:
Code:
Private Sub FactuurnummerID_DblClick(Cancel As Integer)
    DoCmd.OpenForm "f_Factuur", , , "[FactuurnummerID] = " & Me.FactuurnummerID
End Sub
Dit voorbeeld is dus op basis van een veld [FactuurnummerID] dat ook zo op het formulier heet.
 
Ik schrijf:

Code:
Private Sub Tekst2_DblClick(Cancel As Integer)

       DoCmd.OpenForm "Fiche patient", , , "[NAAM] = " & Me.Tekst2
    
End Sub

en krijg een foutcode:

3075

Syntaxfout (operator ontbreekt) in query-expressie [naam] = Smet Jan

wat is er fout?
JP
 
Formulieren openen doe je doorgaans op basis van een sleutelveld, en dat is dan weer meestal een getal. Zoals in mijn voorbeeld. Als je een tekstveld gebruikt, moet je de parameter ook als tekst meegeven, en niet als getal. In een tekst kunnen spaties zitten, zoals dus bij jou het geval is. En dat mag niet in een string, dat moet één geheel zijn. Je moet de code dus aanpassen naar:
Code:
     DoCmd.OpenForm "Fiche patient", , , "[NAAM] = """ & Me.Tekst2 & """"
 
OK, dat blijkt te werken...
3 extra vragen:
Stel, de gevraagde naam wordt niet gevonden... dan opent er zich een lege fiche... wat niet ok is natuurlijk... hoe ondervang ik dat op een "propere" manier
Stel, de naam wordt gevonden en de correcte fiche wordt geopend, ik wil nu graag naar de volgende fiche gaan... de filter is echter op dat moment nog actief dus de volgende fiche (met eventueel een compleet andere naam) wordt niet getoond. De filter zou dus, op het moment dat de fiche getoond wordt, inactief moeten worden... of hoe doe je dat?
Stel, je wil een deel van een naam zoeken... ik schreef:
Code:
DoCmd.OpenForm "Fiche patient", , , "[NAAM] = " Like "*" & Me.Tekst2 & "*"""
dit geeft een lege fiche...


Bedankt
JP
 
Laatst bewerkt:
Stel, de gevraagde naam wordt niet gevonden... dan opent er zich een lege fiche... wat niet ok is natuurlijk...
Dat zou niet voor moeten kunnen komen, toch? Je hebt je zoekformulier correct gemaakt neem ik aan, dus je hebt een doorlopend formulier waarin je ofwel met een tekstvak de tabel filtert (laat dus alleen bestaande personen zien, of niks als je een niet-bestaande lettercombinatie intypt) of je filtert/zoekt met een keuzelijst, en dan zie je ook alleen maar bestaande personen. Dus hoe krijg je dan een leeg formulier geopend?

Je tweede vraag heb je zelf al opgelost, als je het goed terugleest. Je moet inderdaad het filter verwijderen (Me.Filter="" en Me.FilterOn=False). Dat moet je dan ergens onder een knop hangen. Daarnaast moet je uiteraard het filterproces weer opnieuw opstarten.

Wat betreft je laatste vraag: Vergelijk jouw code
Code:
        DoCmd.OpenForm "Fiche patient", , , "[NAAM] = " Like "*" & Me.Tekst2 & "*"""
eens met de mijne:
Code:
        DoCmd.OpenForm "Fiche patient", , , "[NAAM] Like ""*" & Me.Tekst2 & "*"""
 
Dat zou niet voor moeten kunnen komen, toch? Je hebt je zoekformulier correct gemaakt neem ik aan, dus je hebt een doorlopend formulier waarin je ofwel met een tekstvak de tabel filtert (laat dus alleen bestaande personen zien, of niks als je een niet-bestaande lettercombinatie intypt) of je filtert/zoekt met een keuzelijst, en dan zie je ook alleen maar bestaande personen. Dus hoe krijg je dan een leeg formulier geopend?

Klopt, tenzij j vertrekt van een tekstveld waarin je zelf een naam invult natuurlijk... DAN krijg ik een lege fiche
 
Nu zoek ik uitsluitend op het veld NAAM
Stel, ik wil ook kunnen zoeken op het veld STRAAT of PLAATS
Moet ik dan telkens een nieuwe lijn aanmaken of bestaat er een syntax waarmee ik alle belden doorzoek naar de correcte match?
Bedankt
JP
 
Je vraag is niet helemaal helder, want voor meerdere uitleggen vatbaar. Zo is mij niet duidelijk of je met één (gecombineerde) zoekopdracht verschillende waarden in verschillende velden wilt zoeken, of met één zoektekst in meerdere velden. Bijvoorbeeld de tekst "gem" die dan in het veld [Naam] mag voorkomen ("Zegemers") of in het veld [Straat] ("Burgemeester van Loo straat") etc. of in het veld [Plaats] ("Gemert"). Of dat je op drie velden zoekt met drie verschillende zoekwoorden.

Overigens snap ik je formulier nog steeds niet; volgens mij ben je nog veel te ingewikkeld bezig. Filteren (zoeken) gaat het best op een doorlopend formulier, waarbij je het formulier 'live' filtert met een tekstvak. Dat kan op bovenstaande manieren, of op andere varianten, maar sowieso moet je er m.i. voor zorgen dat je never nooit niet in de situatie komt dat iemand een formulier opent met de verzoeking "op hoop van zegen" in de hoop dat er een record in de vondst zit. Bij mijn db's zul je nooit in de situatie komen dat je denkt dat je een formulier opent met een zoektekst, en dat het formulier dan leeg is....
 
1 zoektekst in meerdere velden zou super zijn...
Deel 2
Concreet in mijn situatie op dit moment: iemand komt de praktijk binnen. Ik geef de naam in, het systeem zoekt of de naam voorkomt in het bestand.
Is dat niet zo.. ikzie dus een lege fiche: nieuw record wordt aangemaakt
Is dat wel zo: bestaande record wordt getoond en kan eventueel aagepast worden
Nu is de code opgebouwd rond recordsets en sqls... veel te complex en niet al te flexiebel.. ik zou het graag aanpassen, vandaar
 
Dat kun je volgens mij met één simpele keuzelijst oplossen. Om te beginnen: als je op je (doorlopende) formulier (een formulier met daarop een keuzelijst met de namen kan natuurlijk ook) een keuzelijst met invoervak zet om de namen te zoeken, dan filter je de lijst al zodra je begint te typen. Daarmee kun je dus heel simpel een persoon opzoeken. En bestaat de persoon niet, dan vind je hem/haar niet in de lijst (logisch...) maar kun je de persoon toevoegen m.b.v. de gebeurtenis <Bij niet in lijst>. Heb je de persoon wél, dan open je met een klik in de keuzelijst dus het formulier met de juiste persoon, is de persoon onbekend, dan open je een leeg formulier, en kun je al gelijk de ingevulde naam gebruiken als basis voor dat nieuwe record. Snap je nu waarom ik vind dat je veuls te moeilijk aan het doen bent?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan