formulier openen gefilterd op naam etc (gegevens op sub formulier)

Status
Niet open voor verdere reacties.

Friend

Verenigingslid
Lid geworden
31 jan 2009
Berichten
1.137
Beste forummers,

Op een formulier (Doorlopend formulier) heb ik een overzicht van de naam gegevens van klanten. Dmv een opdrachtknop achter de naam van de klant wil ik het betreffende formulier "reservering" van die klant openen:

Het probleem is dat de naw gegevens niet op het hoofdformulier "resver_ok" staan maar op het sub formulier hierin "naw".

De code die ik nu heb werkt niet.

Ik heb de volgende code :

Code:
Private Sub Knop100_Click()
On Error GoTo Err_Knop100_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "reservering"
    
    stLinkCriteria = "Forms![resver_ok]![naw].Form![Achternaam] & [Voorletters] & [Voornaam] & [Geboortedatum]=" & "'" & Me![Achternaam] & [Voorletters] & [Voornaam] & [Geboortedatum] & "'"
    
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    
Exit_Knop100_Click:
    Exit Sub

Err_Knop100_Click:
    MsgBox Err.Description
    Resume Exit_Knop100_Click
    
End Sub

Hoe kan ik hem laten kijken, is dit wel mogelijk, naar de velden : [Achternaam] & [Voorletters] & [Voornaam] & [Geboortedatum] op het sub formulier om het juiste record te openen?

Friend
 
Beste,

je zou ipv die extra knop ook gewoon kunnen gaan voor een dubbelclick procedure op de recordkiezer van je doorlopend subformulier, scheelt weeral iets.
Verder zou ik die procedure laten zoek op bv een klant_id of zo (in de veronderstelling dat je tabel die natuurlijk heeft), want anders riskeer je bij dubbele namen en voornamen (of ontbrekende gegevens) geen - of niet de juiste persoon te vinden; een combinatie van naam én voornaam én geboortedatum als zoekterm is ook not-done, kan mij moeilijk voorstellen dat ieder bedrijf de geboortedatum van zijn facturatiecliënten begint op te vragen.
 
Laten we voor het gemak eens voorbijgaan aan de volkomen zinnige opmerking van Johan (filteren doe je altijd op het sleutelveld dat je meegeeft) en kijken naar de fouten die in de code zitten, want dat zijn er nogal wat :). En op zich is het dus wel leerzaam als je ziet waarom jouw code nooit kan werken. Dan kun je die fouten de volgende keer vermijden :D.

1. Filteren doe je altijd op basis van een veld dat op dat formulier staat. Het is dus onzinnig om de velden van een subformulier mee te geven, want je filtert geen subformulier.
2. De truc om velden te combineren tot een filter kan best, als je geen ID hebt. Maar op het te openen formulier moet die combinatie dan wel bestaan, want wat filter je anders?
3. Een datum meegeven als filter in VBA is riskant, omdat je te maken hebt met gegevens op je formulier in Nederlandse opmaak, terwijl je Amerikaanse opmaak (dankzij de VBA) meegeeft. 6-4-2000 is dus niet hetzelfde als 4-6-2000.
4. Je haalt volgens mij 4 waarden uit je subformulier, maar je verwijst maar één keer/I] naar dat subformulier. Waar staan de andere velden? Je code is dus niet consequent.
5. Hetzelfde doe je met de waarden achter het = teken: die verwijs je maar één keer naar het actieve formulier. Minder erg overigens, maar het blijft vreemd.
6. Je plakt alle velden rücksichtslos aan elkaar. Zo valt er niks meer te scheiden. Niet handig
7. Als je al meerdere waarden wilt meegeven in een filter, zet ze dan in de OpenArgs parameter (met fatsoenlijk scheidingsteken) en trek ze op het geopende formulier weer uit elkaar. Met de losse waarden stel je dan het filter in.
8. Om te voorkomen dat je je helemaal suf klopt aan de volledige naam van het subformulier, kun je hem beter in een variabele zetten.

Alles bij elkaar zou ik het dan zo doen (gegeven het feit dat ik uiteraard het ID zou gebruiken, want dan ben je van alle problemen af)

Ik heb de code voor de duidelijkheid gesplitst in 2 blokken, voor het geopende formulier en voor het te openen formulier. Niet getest uiteraard, want we hebben de db niet. Maar het gaat om de procedure...
Code:
Private Sub Knop100_Click()
On Error GoTo Hell
Dim sArgs As String
Dim sF As Form
    
    Set sF = Forms![resver_ok]![naw].Form
    stDocName = "Reservering"
    sArgs = sF.Achternaam & "|" & sF.Voorletters & "|" & sF.Voornaam & CDbl(sF.Geboortedatum)
    DoCmd.OpenForm "Reservering", OpenArgs:=sArgs
    Exit Sub

Hell:
    MsgBox Err.Description
End Sub

Op het formulier Reserveringen trek je de OpenArgs weer uit elkaar met Split en vertaal je het datumgetal weer terug naar een datum.
Code:
Private Sub Form_Open()
Dim arr As Variant
    If Not Me.OpenArgs = "" Then
        arr = Split(Me.OpenArgs, "|")
        Me.Filter = "[Achternaam] = """ & arr(0) & """ AND [Voorletters] = """ & arr(1) _
            & """ AND [Voornaam] = """ & arr(2) & "[Geboortedatum] = CDate(" & arr(3) & ")"
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = True
    End If
End Sub
 
Beste Johan,
Hartelijk dank voor je reactie :thumb:

Je hebt volkomen gelijk, ik zit het mijzelf moeilijk te maken :o terwijl ik gewoon de Id kan gebruiken. Dus daar schakelen we maar snel op over in dit geval.:d

Ook dank voor de tip van het dubbelklikken.

Friend
 
Michel,

Hartelijk dank voor je reactie :thumb:

Zoals gewoonlijk weer leerzaam. Maar dat is jouw kracht :thumb::thumb:
We stappen snel over op het Id en alles is opgelost.

Als zelfstudie neem ik jouw uitgebreide uitleg, waarvoor veel dank, je moet er tenslotte elke keer weer je kostbare tijd instoppen.:thumb::thumb:
Ik ga wel voor mijzelf dit even volgen om de kennis te verrijken.

Nogmaals veel dank voor je voortdurende ondersteuning :)

Friend
 
Laat ik dan nog maar wat olie op het vuur gooien en wat alternatieven in de strijd:
Dmv een opdrachtknop achter de naam van de klant wil ik het betreffende formulier "reservering" van die klant openen:

Dat openen doe je vanaf nu dus op basis van het ID, wat je probleem hopelijk definitief oplost. Wat wellicht nog beter kan is de techniek die je gebruikt.

Om te beginnen moet je je dan de vraag stellen: mogen gebruikers in het subformulier muteren ja of nee? In het laatste geval is het subformulier dus alleen bedoeld om het formulier Reserveringen te openen. Dat kan met dubbelklikken, maar persoonlijk vind ik dat een vervelende techniek. Niet alleen moet je handmatig instellen waar je die dubbelklik wilt hebben (de recordkiezers vind ik zelf gruwelijk, dus in mijn formulieren zitten die niet eens), dus je moet dat per veld instellen wat veel werk is. Maar sowieso vind ik dubbelklikken niet geweldig.

Wat ik in dit soort gevallen dan doe is dan: zorg ervoor dat de knop (die heb je toch al) over het complete record komt te liggen. Hè, denk je dan: dan zie ik toch niks? Klopt, maar de volgende stap is dan om de knop transparant te maken! En nu bereik je 2 dingen: a) het maakt niet uit waar je klikt, je activeert namelijk altijd de knop en b) geen enkele gebruiker kan nog bij de data komen! De knop ligt namelijk in de weg :).
Een (nog betere in mijn ogen) oplossing is: vergeet het hele submenu, en vervang dat door een normale keuzelijst. Daarvan zijn de waarden aanklikbaar, dus je kunt met een enkele klik het gewenste reserveringsformulier openen, en het ziet er veel strakker uit. Daarnaast biedt een keuzelijst de mogelijkheid om meerdere records te selecteren, indien gewenst, die je dan ook allemaal mee kunt nemen naar het filter. De filteropties zijn dus wat makkelijker.
 
Michel, dat van die knop bovenop heb ik ook nog gedaan maar aangezien er hiernogal veel qua lay-out en velden en zo meer veranderd moet ik steeds die knop eerste wegzetten vooraleer je de wijzingen kan doen en dan die knop terugplaatsen.
Tevens gaat dubbelklikken ook met verborgen recordkiezers maar ons dames paniekeren al als ze die blokjes niet zien :-)
 
Les 1: eerst de functionaliteit, dan het gemak :). Overigens is het bij aanpassingen al meer dan genoeg als je de hoogte van en bovenliggende knop verkleint. Maar als je zó vaak aanpassingen moet maken, deugt er m.i. iets niet helemaal. Mijn eerste instinct zegt dan: de dames de deur wijzen :D.
 
Dames weten soms niet wat ze eigenlijk willen en de mannen zijn hier maar 10% van het personeelsbestand dus moeten we rustig blijven.
 
Openargs nog niet onder de knie

Goedemiddag,

Ik ben aan het stoeien om enkele gegevens uit formulier 1 (verslag) over te nemen in formulier 2 (acties). Gebaseerd op de info van vooral Octafish gebruik ik:

Code:
Dim stDocName As String
 Dim stLinkCriteria As String
DoCmd.Close
stDocName = "F_vervolgacties"
DoCmd.OpenForm "F_vervolgacties", , , , acAdd, acDialog, stLinkCriteria
stLinkCriteria = Me.Id.Value & "|" & Me.Account.Value & "|" & Me.Contactpersoon.Value
End Sub

Eenmaal in het nieuwe formulier de volgende:

Code:
Private Sub Form_Load()
'------------------------------------------------------------------------------------------------
'Inlezen van de variabelen
'------------------------------------------------------------------------------------------------
If Not IsNull(Me.OpenArgs) Then
    Dim strLijst() As String
    On Error Resume Next
    strLijst = Split(Me.OpenArgs, "|", -1)
    Me.[Verslagid] = strLijst(0)
    Me.[Account] = strLijst(1)
    Me.[Contactpersoon] = strLijst(2)
End If

En dan...werkt het niet, vast door iets wat ik doe. Maar
* nieuw formulier openen lukt prima
* de gegevens overnemen niet dus, krijg een foutmelding bij de regel (stLinkCriteria = Me.Id.Value & "|" & Me.Account.Value & "|" & Me.Contactpersoon.Value)

Wat doe ik fout???
 
Wat doe ik fout???
Een eigen vraag stellen in een (ook nog eens afgesloten) vraag van iemand anders :). Je zou, gezien de inschrijfdatum bij HelpMij, moeten weten dat dat niet netjes is...
Ik zou zeggen: als de oplossing in dit topic bij jou niet werkt, maak dan een eigen vraag aan. Kijken we daar verder!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan