Open Subformulier met behulp van keuzeknop

Status
Niet open voor verdere reacties.

Henk Benter

Gebruiker
Lid geworden
13 mei 2010
Berichten
154
Vanuit mijn hoofdformulier wil ik een subformulier openen met behulp van een keuzeknop. Het koppelveld tussen de beide formulieren is het veld genaamd Projectnummer. Als ik een subformulier op het hoofdformulier aanmaak vraagt Access zelf om het koppelingsveld. Dit heb ik al dikwijls toegepast.

Hoe krijg ik dit voor elkaar wanneer ik het subformulier open met behulp van de knop.
 
Ik snap niet wat je wilt. Als je een subformulier koppelt met een hoofdformulier, is het subformulier ook al geopend. Dus waarom een straks knop? Dat heeft alleen zin als het subformulier niet is gekoppeld, en dan komt de vraag naar voren: waar moet het subformulier mee gekoppeld worden als dat niet het hoofdformulier is, en waarom zou je dan überhaupt daarvoor een subformulier gebruiken?
 
x

Onderstaand een plaatje van de relatie tussen beide tabellen. Op basis van de tabel [TblProject] maak ik een hoofdformulier [FrmProject]. Op basis van de tabel [TblDetailDiscipline] maak ik een subformulier [FrmProjectDiscipline]. Het sleutelveld van de tabel [TblProject] is een tekstveld. In het Hoofdformulier [FrmProject] wil ik een knop plaatsen die op zijn beurt het formulier [FrmProjectDiscipline] opent. In dit formulier wil ik dan meerwerkregels toevoegen. In het veld projectnummer van het formulier [FrmProjectDiscipline] moet dan het projectnummer van het hoofdformulier opgeslagen worden.

Hoe luidt de code die onder de knop komt te hangen, welke het subformulier opent in de edit eigenschap. Heb het e.e.a. al geprobeerd. Krijg de waarde van het sleutelveld van het Hoofdformulier niet opgeslagen in het subformulier. Ik vermoed dat wanneer er nog geen gekoppeld subformulier is, er niets gevonden kan worden. Dan zal er eerst moeten worden toegevoegd. Maar, hoe doe ik dat?

Code:
Private Sub Knop40_Click()
    DoCmd.OpenForm "FrmProjectDiscipline", , , "[frmProjectDiscipline]![Projectnummer]=" & Me.[Projectnummer]
End Sub

Ik hoop dat we elkaar hiermee gaan begrijpen. Het is altijd weer moeilijk het probleem goed te omschrijven. Dank al vast.


relatie.JPG
 
In het Hoofdformulier [FrmProject] wil ik een knop plaatsen die op zijn beurt het formulier [FrmProjectDiscipline] opent.
Nogmaals: waarom?? Een subformulier is al gekoppeld aan het hoofdformulier, dus je ziet al alle records in het subformulier, en je kunt al probleemloos records toevoegen. Wat moet die knop dan nog doen?
 
Ik bedenk me ineens dat je een wat ongelukkige manier van uitdrukken hebt gebruikt, en dat je helemaal geen subformulier wilt openen, maar een nieuw formulier dat is gebaseerd op een projectID uit je projecten formulier. In dat geval valt er uiteraard weinig te koppelen of te filteren zoals je nu probeert, want als je een project hebt zonder detailrecords, valt dat formulier niet te openen met de betreffende selectie.

Daarnaast heb je bij het aanmaken van een nieuw detailrecord op dat tweede formulier niet het voordeel dat je met een subformulier wél hebt, en dat is dat het koppelveld automatisch al wordt ingevuld. Kortom: om (mij nog onduidelijke redenen) wil je een hele simpele oplossing (subformulier op hoofdformulier) vervangen door een hele ingewikkelde constructie die ook nog eens foutgevoelig is. Ach, als je niet tevreden bent met een goed werkende database, dan waarom niet :D.
OK, hoe pak je het dan aan?
Niet zo dus
Code:
Private Sub Knop40_Click()
    DoCmd.OpenForm "FrmProjectDiscipline", , , "[frmProjectDiscipline]![Projectnummer]=" & Me.[Projectnummer]
End Sub
En ook niet zo (al is dit al veel beter want dit is een werkend filter)
Code:
Private Sub Knop40_Click()
    DoCmd.OpenForm "FrmProjectDiscipline", , , "[Projectnummer]=""" & Me.Projectnummer & """"
End Sub

Om te beginnen: je moet het projectnummer meegeven aan het formulier, omdat je dat nodig hebt om a) te filteren (als er records zijn) en b) om de standaardwaarde van het veld ProjectID in te kunnen stellen. Dat doorgeven doe je zo:
Code:
Private Sub Knop40_Click()
    DoCmd.OpenForm "FrmProjectDiscipline", OpenArgs:=Me.Projectnummer
End Sub

Maar daarmee ben je er uiteraard nog niet; nu heb je het projectnummer wel meegegeven aan het formulier, maar daar moet het nog verwerkt worden. Je moet het formulier namelijk nog filteren, en je wilt het projectnummer gebruiken bij nieuwe records. Dat kun je bijvoorbeeld zo doen:

Code:
Private Sub Form_Load()
If Not Me.OpenArgs & "" = vbNullString Then
    Me.Projectnummer.DefaultValue = Me.OpenArgs
    Me.Filter = "[Projectnummer]=""" & Me.OpenArts & """"
    Me.FilterOn = True
End If

Maar ook deze oplossing zou voor mij nog niet afdoende zijn, want te onhandig. Zo heb je voor elk (nieuw) project een beginsituatie waarbij je geen detailrecords hebt; je begint dus altijd op 0 records. In dat geval moet je dus beginnen met het invoeren van het eerste record, dus in mijn optiek zou je dan altijd moeten beginnen met het formulier in Toevoegmodus, met een leeg record en het projectnummer al ingevuld. Voeg je echter records toe aan een project met bestaande detailrecords, dan wil je wellicht alleen filteren en kunnen toevoegen. Ik zou dus eerst een check doen op het aantal records op een project, en op basis daarvan bepalen of ik het formulier open in Toevoevmodus of in Edit modus.
 
Je hebt het helemaal bij het rechte eind Octafish. Dit is de bedoeling. Ga er binnenkort mee aan de gang. Je hebt ook gelijk met de opmerking dat dit foutgevoeliger is. Voorheen zette ik mijn gekoppelde (sub)formulieren in een tab besturingselement, het koppelveld was dan idd meteen gevuld. Ik ga in ieder geval jou oplossing eens proberen. Kan altijd nog terugvaĺlen op een tabbesturingselement. Dank al vast tot zover.
 
Foutmelding

Dag Octafish,

Ik heb de code vanuit jou bericht toegepast in mijn toepassing. Ondertussen ruim een uur bezig. Krijg telkenmale de bijgaande foutmelding.

foutmelding.JPG
 
Ik zou de db moeten zien om te bepalen waar de fout vandaan komt (al kun je volgens mij de regel wel opsporen) en waarom.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan