Access 2016. ID nummer en relatie tussen twee tabellen.

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Mijn db is al behoorlijk uitgebreid met veel functies maar het lukt mij niet meer, hoe simpel ook, om een tweede formulier te openen op basis van de "current" record van het eerste formulier en de gegevens op te slaan. Bijgaande een voorbeeld db. Twee tabellen Opdrachten en Status. Twee formulieren Werk en Status. frml Status wordt geopend door een knop Status Werk.
De relatie tussen de twee tabellen is gelegd. Dan zou je toch verwachten dat het ID nummer van de tabel Opdrachten overgenomen wordt in de tabel Status, maar nee. In tabel Opdrachten kan ik mbv formulier Werk een werknummer invullen en opslaan maar, na het drukken van de knop Status werk, opent het formulier Status en kan ik daarna de status niet opslaan omdat het OpdrachtID-nummer van tabel Opdrachten niet is overgenomen. Waarom niet, wat zie ik over het hoofd?
 

Bijlagen

  • Proef.zip
    51,2 KB · Weergaven: 28
Laatst bewerkt:
Wat wil je precies? Ik zie een één-op-één relatie tussen [o_Opdrachten] en [Status] en daar snap ik dus niets van; waarom zitten de velden uit [o_Opdrachten] niet in [Status]? Of omgekeerd? Sowieso is het onmogelijk om met één formulier twee tabellen tegelijk te vullen; je formulier [frml Status] (probeer spaties in objectnamen te vermijden, is erg onhandig) is dat nu wel.
 
De één op één relatie heb ik ook voor test omgezet naar één op veel maar loste niets op. Spaties etc. terecht opgemerkt.
Ik heb één formulier Werk en kan daar wat invullen. Met een knop op het eerste formulier wordt een tweede formulier Status geopend en kan daar via een keuzelijst wat invullen. Het tweede formulier dient altijd qua gegevens aan het eerste formulier gerelateerd te zijn. Ik dacht dat het openen van het tweede formulier dit doet op basis van het ID van het eerste formulier, maar dat doet het niet. Het o_Opdracht ID nummer van de eerste Opdrachten tabel wordt niet in de tabel Status in het veld s_StatusID gezet. Het lijkt wel of de relatie ontbreekt. Ik vul dus niet met één formulier twee tabellen. Het is toch niet vreemd om met een knop een ander formulier te openen die gerelateerd is aan de gegevens in de record van het eerste formulier. Ik wil twee losse formulieren. Hoe kan ik het realiseren?
 
Je haalt een paar zaken door elkaar; formulieren nemen nooit automatisch gegevens over, dat heeft ook helemaal niks met de relaties te maken. Tenzij het tweede formulier een subformulier van het eerste is, dan werkt dat wél. Jij hebt in je code alleen een filter ingesteld, wat natuurlijk niet werkt omdat er op dit moment helemaal niks te filteren is. Kortom: als een nieuw (zelfstandig te openen) formulier informatie moet krijgen uit het eerste formulier, dan moet je die data specifiek meegeven bij het openen van dat tweede formulier. Ik doe dat via het OpenArgs argument. Maar daarmee ben je er nog niet: als dat formulier opent, moet je het argument ook nog eens uitlezen. Het tweede formulier kan natuurlijk nooit weten wat je precies met de OpenArgs string wilt doen.
 
Dank. Ik haal geen zaken door elkaar maar bedoel wat anders. Ik heb de db code (#1) aangepast en OpenArgs gebruikt. De proef db werkt nu goed.
Ik heb deze code met OpenArgs op dezelfde wijze voor andere formulieren in de "echte" db verschillende malen succesvol toegepast maar deze keer voor het nieuwe formulier "Status Werkorder" werkt het niet, waarom niet?

Code van het eerste formulier met knop Status Werkorder:
Code:
        DoCmd.OpenForm "Status_Werkorder", , , "[s_Status_ID] = " & Me.[o_Opdracht ID], , acDialog                       ', OpenArgs:=Me.s_Status_ID

Code tweede formulier:
Code:
 If Not Me.OpenArgs = vbNullString Then Me.s_Status_ID = Me.OpenArgs

Het blijkt dat de OpenArgs steeds de waarde Null geeft en blijft steken op If Not Me.OpenArgs. Er wordt wel een tweede formulier geopend met ID Nieuw.
Moet in het eerste formulier ook geen OpenArgs staan? De waarde van s_Status_ID moet toch worden doorgegeven naar het tweede formulier. Ik heb van alles geprobeerd maar geen resultaat. Waarom werkt het één wel en het ander niet?
 
Laatst bewerkt:
Moet in het eerste formulier ook geen OpenArgs staan?
De vraag stellen is hem beantwoorden :). Ja, natuurlijk moet dat. En dus géén filter, wat je nu doet. Nota bene heb je de juiste code al in je opdrachtregel staan, maar als commentaar...
Code:
    DoCmd.OpenForm "Status_Werkorder", WindowMode:=acDialog, OpenArgs:=Me.s_Status_ID
 
Op deze mooie dag de vraag beantwoorden, top. Je code getest maar het geeft een compileerfout op .s_Status_ID, Kan methode of gegevenslid niet vinden. Helaas geen resultaat. <s_Status_ID> is wel de ID van de tweede tabel voor het tweede formulier. Kan het zijn dat .s_Status_ID niet gevonden kan worden omdat deze niet staat in de eerste tabel c.q. eerste (dit) formulier waar deze code voor is.

Ik heb voor test alsnog het "[s_Status_ID] = " & Me.[o_Opdracht ID] er tussen gezet. Ik krijg dan de foutmelding dat s_Status_ID niet is benoemd. Kan toch niet, het is een veld in de tweede tabel Status. Is s_Status_ID wel benoemd c.q. gedeclareerd in de code? Moet er iets "aan" gezet worden?

Voor je beeldvorming: De eerste tabel <Opdrachten> heeft de key [o_Opdrachten ID]. De tweede tabel< Status_Werkorders> heeft de key [s_StatusID]. Het tweede veld van deze tabel is s_Status_ID en is één op één gerelateerd aan de key eerste tabel [o_Opdracht ID].

Na wat testen: Als ik [s_Status_ID] verander in [o_Opdracht ID], dan wordt het tweede formulier wel weergegeven met de drie indexen Key tabel 1[o_Opdracht ID], key tabel 2 [s_StatusID] en veld [s_Status_ID]. De inhoud c.q. de velden van tabel 2 worden helaas niet in het formulier getoond.
Code:
DoCmd.OpenForm "Status_Werkorder", WindowMode:=acDialog, OpenArgs:=Me.[o_Opdracht ID]
 
Laatst bewerkt:
Nog even afgezien van het (in mijn ogen) idiote idee dat je koppelvelden een verschillende naam geeft (meelezers: nooit doen :) ), moet je de waarde van het eerste veld meegeven als parameter (OpenArgs) aan het tweede formulier. Dáár wijs je de waarde toe aan het juiste veld. Ik had in jouw voorbeeldje al gezien dat de veldnamen niet klopten, maar ik ging er vanuit dat je in je productie omgeving de juiste namen wél gebruikte. Dat blijkt dus niet zo te zijn. In je voorbeeldje moet je het dus zo doen:
Code:
Private Sub Knop19_Click()
    DoCmd.OpenForm "frml Status", WindowMode:=acDialog, OpenArgs:=Me.o_OpdrachtenID
End Sub

En
Code:
Private Sub Form_Load()
    If Not Me.OpenArgs = vbNullString Then Me.s_Status_ID = Me.OpenArgs
End Sub
 
Anderhalf jaar geleden als eerste db ontwikkeling bedacht om goed onderscheidt te kunnen maken, ik zal het nooit meer doen. Ik begrijp dat de key van de eerste tabel [o_Opdrachten ID] in OpenArgs van DoCmd Openform moet komen en in het te openen formulier de OpenArgs van het gerelateerde c.q. gekoppelde veld. In de productie db; Je gebruikte in #6 s_StatusID en nu [o_Opdrachten ID]?

Ik heb dit uitgevoerd maar geen goed resultaat. Het tweede formulier opent met correcte ingevulde waarden in de velden o_Opdracht ID, s_StatusID (Key) en s_Status_ID (gekoppelde veld echter zonder de waarden zoals de status in de overige velden. Tevens is de OpenArgs waaarde van het tweede formulier nog steeds Null. De code van het tweede formulier komt niet verder komt dan: If Not Me.OpenArgs = vbNullString Then . . .

Opmerkelijk is dat het voorbeeldprogramma Proef wel werkt en zelfs zonder OpenArgs in het eerste formulier. Ik heb ook een andere db die meerdere knoppen op een dergelijke manier heeft en goed werkt. Waarom dan niet de productie db?
 
Laatst bewerkt:
Je gebruikte in #6 s_StatusID en nu [o_Opdrachten ID]?
In #5 had je dat veld zélf al in de code gezet (met commentaar). Ik ging er vanuit dat je dus met dát veld in je productie db verder werkt. In je proef versie is het een ander veld.
Waarom het in de testversie wél werkt, en in de productie db niet, kan uiteraard niet worden vastgesteld zonder die db erbij te halen. Koffiedik kijken blijft toch een heel ander vak :).
 
Ik heb voor de tweede maal een nieuw Status formulier gemaakt en de code weer gebruikt. Bij de eerste probleempoging had ik het formulier op basis van een query gemaakt en nu op basis van de tabel. Het is gelukt. Alles wat je in VBA maakt levert nogal wat problemen op, maar als het werkt, dan is het super en kan eigenlijk "alles". Hartelijk dank voor het meedenken :D.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan