Qwaarde uit subformulier in hoofdformulier gebruiken

Status
Niet open voor verdere reacties.

Theo65

Gebruiker
Lid geworden
20 mrt 2023
Berichten
55
voorbeeld access documenten.jpg


Aangepast: Heb afbeelding toegevoegd.
Doel is een database met genealogie documenten (nu in excel met vba, maar wordt traag door omvang)

Hoofdtabel is PersonenT en een tabel met DocumentenT
Hier zijn 3 Queries:
- PersonenQ,
- DocumentenQ (dit zijn de records uit DocumentenT waarbij ID overeenkomt met ID in PersonenF (form)
- KinderenQ (dit zijn de records uit PersonenT waarbij Vader-ID of Moeder-ID overeenkomt met ID in PersonenF (form)

Er is een formulier PersonenF met 2 subformulieren : KinderenF en DocumentenF

In het hoofdformulier kan ik op velden klikken en via gebeurtenis (event) daar een actie aan koppelen.
Door op het vader_id of Moeder-ID te klikken, waarbij dan naar die persoon wordt gegaan, met die informatie
Zelfde voor partners.

Tot zover werkt het

Echter met subformulieren werkt dit niet.
Als ik op het kind klik zie ik wel het juiste ID (zoekID)

Maar hoe ga in het hoofdformulier PersonenT naar dat record?
Ik doe waarschijnlijk iets fout in het DoCmd opdracht

Code:
Public Sub ID_Click()

On Error GoTo Err_ID_Click
Dim myValue
Dim ZoekID

myValue = Forms!PersonenF!KinderenF.Form!ID
ZoekID = DLookup("ID", "PersonenT", "ID = " & myValue & "")
MsgBox ZoekID

DoCmd.OpenForm "PersonenT", GoToRecord, , acGoTo, ZoekID

Exit_ID_Click:
    Exit Sub

Err_ID_Click:
    MsgBox Err.Description
End Sub
 

Bijlagen

  • MS_voorbeeld.zip
    784,2 KB · Weergaven: 11
Laatst bewerkt:
Ik snap je hele vraag niet, en ik vermoed Peter ook niet, want die geeft een raar antwoord. Als je een formulier hebt met een Hoofdformulier-Subformulier constructie, kun je met de code van Peter geen formulier openen, want dat formulier ís al open. Sowieso zijn de formulieren aan elkaar gekoppeld, want als het goed is hangt een subformulier met kinderen aan een formulier met de bovenhangende personen (doorgaans ouders of voogden e.d.). Als je het netjes gemaakt hebt, dan heeft de personen tabel voor elke persoon twee velden voor de ParentID, en op basis daarvan kun je een stamboom opbouwen. Je kunt dan altijd 'omhoog' en omlaag vanuit het hoofdformulier.
Maar voor hetzelfde geld doe je iets heel anders, en dat is het leuke van zo'n vraag: zonder database hebben wij geen idee, en blijft het lukraak met de armen in de lucht zwaaien :). Dus graag meer uitleg, dan krijg je óók correcte antwoorden.
 
Ik heb een tabel voor mijn stamboom documenten.
De personentabel heeft velden b.v. ID, persoonsgegeven, vader, moeder etc
Daarnaast nog een tabel met documenten

In het hoofdformulier heb ik de persoonsgegevens en 2 subformulieren
1. subformulier met kinderen, welke in de personentabel welke via query worden opgezocht (als ID overeenkomt met ID van vader/moeder, dan is het een kind)
2. subformulier met documenten (daar wil ik nog door op id te klikken de afbeelding van harde schijf halen

In deze vraag klik ik op het nummer (ID) van het kind in het subformulier, om die de hoofdpersoon te maken. Navigatie dus.

Code:
myValue = Forms!PersonenF!KinderenF.Form!ID
ZoekID = DLookup("ID", "PersonenT", "ID = " & myValue & "")
MsgBox ZoekID

De msgbox geeft wel het nummer (ID) van het kind.
Daarna moet ik het nummer dus naar (GoTo) naar dat record in hoofdformulier gaan

Peter zijn oplossing deed het wel, maar loopt daarna vast. Krijg melding "kan niet naar de opgegeven record gaan""
 
Octafisch, ik begrijp dat je een formulier niet nog eens kunt openen, dan loopt het dus vast.
Ik heb geprobeerd met een afbeelding en wat meer uitleg geprobeerd dit toe te lichten in het eerste bericht. (aanpassing)

Is dat wat je bedoeld?
 
Ik ben even de draad kwijt. Ik meende begrepen te hebben dat je hoofdformulier PersonenF en subformulier KinderenF hebt en dat je via KinderenF een ander formulier (PersonenT) wilt openen. De OpenForm in je code wijst daar ook op. Nu heb je het over navigeren op PersonenF en doet PersonenT niet meer mee.

Toch niet raar dat OctaFish het raar vond :D

Ik heb zoiets wel eens gemaakt. Zal eens in mijn archief duiken.
 
@Theo: ofwel jij post een voorbeeldje met wat je hebt (op basis van jouw plaatjes is dat al behoorlijk anoniem, dus dat mag geen probleem zijn) ofwel je wacht even tot ik een eigen voorbeeld meestuur. Dat laatste ben ik nog even aan het bewerken, maar in beginsel doet dat volgens mij exact wat jij wilt. Aan u de keuze :). Persoonlijk zie ik het liefste jouw database, want dan wordt de hulp een stuk toepasbaarder voor jou.
 
@Octafish ik heb in eerste bericht zip bijlage toegevoegd.
Access is vrij nieuw voor me, meeste doe ik in Excel, dus weet dat het nog rommelig is en beter kan. Maar aldoende leert men.
Ben ook wel benieuwd naar jou voorbeeld, daar kan ik misschien weer van leren
 
... dus weet dat het nog rommelig is en beter kan. Maar aldoende leert men.
Met die wetenschap in het achterhoofd zullen we je niet te hard aanpakken; mijn eerste databases durf ik nu ook niet meer te openen :). Maar een paar tips kan ik je gelijk al geven, naar een paar seconden naar de db gekeken te hebben.

1. Gebruik de juiste gegevenstypes voor je velden. Een veld als [GEBOORTEDATUM] of [DOOPDATUM] is een datumveld, en géén tekstveld. Met datumvulden kun je rekenen, met tekstvelden niet. Zet die dus z.s.m. om naar het type Datum.
2. Zodra ik blokken identieke velden zie waarvan de namen beginnen met P1, P2 etc weet ik dat de tabel niet genormaliseerd is. Al die gegevens moet je eigenlijk z.s.m. naar een aparte tabel verhuizen, met uiteraard een koppeling met de tabel PersonenT.
3. Ik zie in je database geen relaties. Dat is weliswaar niet verboden (om het niet te doen), maar niet handig, want relaties zorgen ervoor dat je geen 'zwevende' data kan invoeren. Dus geen documenten voor niet-bestaande personen, om maar wat te noemen.

Maar ik snap nu ook waarom je probleem is ontstaan, want je gebruikt het principe van een genealogische tabel niet goed. Jij slaat alle voorouders op in één record bij een bepaald persoon, en dat moet je dus níet doen. Elke persoon heeft, zoals ik al eerder schreef, hooguit twee biologische ouders. Die zijn, net als het kind, zelfstandige entiteiten en krijgen dus een eigen record in de tabel, met ook weer, als je die gegevens hebt, eigen ouders. En op die manier bouw je dat door. Eigenlijk dus zoals ik dat in mijn eigen voorbeeld ook gebruik. Ik zal die vanmiddag dus posten, dan kun je zien hoe het zou moeten.

Oveigens is Access totaal niet te vergelijken met Excel; daar kun je zonder enige kennis nog wel wat mee doen, maar dat is met Access echt uitgesloten. Ik raad je dus ook zeker een cursus aan!
 
@OctaFish
[GEBOORTEDATUM] of [DOOPDATUM] is een datumveld, en géén tekstveld
Bij genealogie komen er veel data voor 1900 voor en daar kan Excel niet mee omgaan. Vandaar bewust voor tekst gekozen, zodat je altijd zelfde formaat (DD-MM-YYYY) hebt.
Maar om eerlijk te zijn weet ik niet of dit ook voor Access geldt.

De stamboom zelf houd ik in een genealogie programma bij, waar ik een code veld gebruik om naar mijn huidige excel bestand te gaan.
Het is in Excel ooit begonnen om documenten bij te houden, een kaartenbak, en zou voor losse personen kunnen zijn.
Stel ik heb van Overgrootvader wel een document, maar van Overgrootmoeder niet, dan staat overgrootmoeder niet in de personenT tabel.
Stel dan ik van ouders geen documenten heb, dan staan ze niet in mijn PersonenT, vandaar ooit de keus gemaakt om daar aparte velden van te hebben bij de persoon.
Daar houd ik in bij welke documenten ik heb, waar ik een eventueel origineel terug kan vinden, en probeer zo veel mogelijk te scannen en digitaal te bewaren.

Maar ben het met je eens dat het misschien voor access niet goed doordacht is.
 
Maar om eerlijk te zijn weet ik niet of dit ook voor Access geldt.
Geen probleem, in Access kun je elke datum invullen die je wilt. Het feit dat je dit niet hebt uitgezocht, geeft al aan in welke mate je het proces hebt overdacht :).

De rest van je verhaal snap ik niet vanuit de database geredeneerd; wellicht dat het in je andere programma wel een rol speelt, maar in een database doe je dit dus niet. Je maakt tabellen op basis van entiteiten, zoals personen en documenten. Daarvoor maak je één tabel. In zo'n tabel sla je alle gegevens op die intrinsiek bij één record horen. Een persoon heeft één naam, één geboortedatum en één sterfdatum. Documenten sla je dus op in een aparte tabel, waarbij je refereert aan de PersoonsID als koppeling. Het maakt dan totaal niet uit of je van een persoon documenten hebt of niet; dat zie je vanzelf terug op het subformulier waar je naar believen meerdere documenten aan kan toevoegen als je ze hebt.

Bij het maken van een database, en dat is echt anders als in Excel, is het voorstadium veruit het belangrijkste. Eérst breng je in kaart wat het doel is van de database, wat de processen zijn, en de workflow. Dán ga je kijken welke tabellen erbij horen, en als dat klaar is begin je aan de formulieren. Maar het Functioneel Ontwerp, waar alles op papier staat beschreven, is in mijn optiek onmisbaar. Volgens mij heb je dat niet :).
 
Kennelijk is je voorbeelddatabase weer verwijderd. Ik kan in ieder geval een stukje code laten zien waarmee ik iets vergelijkbaars (via een knop op een subformulier) voor elkaar kreeg.
Code:
Private Sub ganaar_Click()On Error GoTo Fout
Dim TempID As String


TempID = Me.PersoonsID
Forms.frmPersoonS.Requery
DoCmd.SearchForRecord acForm, Me.Parent.Name, acFirst, "[PersoonsID] ='" & TempID & "'"


Einde:
    Exit Sub


Fout:
    MsgBox Err.Description
    Resume Einde


End Sub
 
Ik zou voorlopig even stoppen met werken aan dit probleem, en eerst het serieuze probleem oppakken: de normalisatie van je personen tabel. Dat heeft m.i. de allerhoogste prioriteit. Dan is vermoedelijk je huidige vraag ook gelijk opgelost. Al zijn er genoeg mensen die je kunnen helpen met een stoplap oplossing voor je vraag.
Zelf sta ik op het standpunt dat dweilen met de kraan open (waar dit een voorbeeldje van is) zonde is van de (in ieder geval: mijn) tijd. Ik help je uiteraard graag op weg als je het op de juiste manier wil aanpakken :). Begin bijvoorbeeld eens met het lezen van de Access cursus in de Handleidingen sectie, waar het Normalisatie proces wordt uitgelegd. Want daar gaat het dus al fout.
 
@OctaFish: Bedankt voor je advies. Ik begrijp dat het niet jou manier van werken is. Als ik tijd heb zal ik wat meer naar die access cursus kijken en op youtube zoeken naar uitleg. Sorry dat ik te veel van je tijd vroeg.
 
Er moet inderdaad nog een hoop gebeuren aan je database. Ik denk echter niet dat normalisatie, hoe nodig ook, de oplossing is voor je vraag/probleem. Je zal altijd de behoefte hebben om op het kinderen-subformulier op een kind te klikken om de details van dat kind (die persoon) te bekijken.
Probeer dit eens:
Code:
Private Sub ID_Click()

    On Error GoTo Fout

    DoCmd.SearchForRecord acForm, Me.Parent.Name, acFirst, "ID = " & Me.ID


Einde:
    Exit Sub


Fout:
    MsgBox Err.Description
    Resume Einde


End Sub
 
Laatst bewerkt:
@xps351: Die code opent inderdaad wel het hoofdformulier. Dit lijkt inderdaad te werken. Zal er eens verder mee experimenteren. Nedankt

 
Sorry dat ik te veel van je tijd vroeg.
Dat hoeft uiteraard niet; wij (ik denk dat dat voor iedereen geldt) steken graag tijd in (liefst interessante) vragen. En ik help je ook graag moet het verbeteren van je database. Maar je moet wel bereid zijn om die basis aan te pakken als hij niet deugt. En zo te zien ben je nog niet zover. Dan vind ik het zonde van mijn tijd; die kan ik dan beter gebruiken :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan