Theoretische vraag

Status
Niet open voor verdere reacties.

so10070

Gebruiker
Lid geworden
4 feb 2014
Berichten
419
Het is mogelijk om een parentform en een childform op twee manieren te linken

Ten eerste
Via VBA
Code:
        .RecordSource = sqlOffertesWijzigenBasis
        .subfrmOfferteProductenWijzigen.Form.RecordSource = sqlProductOffertesWijzigen
        .subfrmOfferteProductenWijzigen.LinkChildFields = "OFID"
        .subfrmOfferteProductenWijzigen.LinkMasterFields = "OFID"

Ten tweede
Via eigenschappen
* Op eigenschap "Hoofdvelden koppelen" en "Subvelden koppelen" de sleutels linken
* Maar ik merk dan dat, ofschoon de sql als recordbron voor de parent in de procedure Form_Load() opgenomen is, deze ook nog als eigenshap bij de recordbron moet meegegeven worden.

De situatie doet zich nu niet voor bij mij, maar wat zou ik dan moeten doen als de sql van de parent nogal strenge WHERE-condities heeft?

Graag wat theoretische info.
 
Het linken van een hoofd- en subformulier kan maar op één manier: door het correct zetten van de eigenschappen. Het aanpassen van de eigenschappen kan wel op verschillende manieren: via de grafische interface of via VBA.
Als de dataset van het hoofdformulier strenge criteria heeft zullen slechts de records die aan deze voorwaarden voldoen getoond worden in het hoofdformulier. In het subformullier worden alleen de lijnen getoond van het geactiveerde record.

Als een record niet in het hoofdformulier getoond wordt, kan het daar ook niet geactiveerd worden en kan je de afhankelijke lijnen dus ook niet zien.
Voorbeeld: als je in een hoofdformulier alleen de verkopen van de laatste maand toont, kan je ook geen verkoopslijnen van de maanden daarvoor tonen.

Als je in de dataset van het subformulier een strengere selectie zet dan in het hoofdformulier dan worden de records die daardoor uitgefilterd worden niet opgenomen in de basisset en dus ook nooit getoond, zelfs als het hoofdrecord wel getoond en geactiveerd wordt.
Voorbeeld: als je in het hoofdformulier de verkopen toont en in het subformulier een criterium zet: alleen niet-betaalde verkoopslijnen, dan zal voor een verkoop waarvan alles betaald is geen lijnen meer getoond worden in het subformulier.
 
Het linken van een hoofd- en subformulier kan maar op één manier: door het correct zetten van de eigenschappen.
Dit klopt niet; zoals TS al aangaf, kun je wel degelijk op twee manieren de koppeling maken: via eigenschappen en via SQL. En TS laat dat ook prima zien. Noella verwart doel met werkwijze. Ik snap overigens de vraag niet; als ik een niet-afhankelijk formulier via VBA een Recordsource toewijs, gaat dat prima en hoef ik dus niet dat nog eens via de Eigenschappen te doen. Als dat wél moet, dan klopt er dus iets niet in je werkwijze. En je gekoppelde subformulier laat natuurlijk alleen de records zien die in het hoofdformulier aanwezig zijn; dat heeft niets met een filter op dat hoofdformulier te maken. Zonder filter zou je immers alle records zien, en ook de gekoppelde in het subformulier, en mét filter zie je nog steeds alle records in je subformulier die bij de records in het hoofdformulier horen. Andersom kan je een 'probleem' hebben, als de records in het subformulier van zichzelf al een filter hebben.
 
Ik zal me nog even verder verduidelijken. Mijn vraag komt voort uit een verwondering over de werkwijze in Access. Misschien doe ik het verkeerd! :confused:
Ik heb de twee manieren van koppelen getest.

Ten eerste - koppeling via VBA
Dat lukt met deze code

Code:
        .RecordSource = sqlOffertesWijzigenBasis
        .subfrmOfferteProductenWijzigen.Form.RecordSource = sqlProductOffertesWijzigen
        .subfrmOfferteProductenWijzigen.LinkChildFields = "OFID"
        .subfrmOfferteProductenWijzigen.LinkMasterFields = "OFID"

Ten tweede - koppelen via VBA
Elk formulier krijgt zijn recordsource via een sql in procedure "Form_Load()", zowel hoofdformulier als subformulier
Ik zet de link via de eigenschappen op het subformulier in "Hoofdvelden koppelen" en "Subvelden koppelen". Maar ik moet dan - en dat is mijn verwondering - (ofschoon de recordsource voor elk formulier in VBA gedefinieerd is) de recordbron in de eigenschappen van het hoofdformulier nog expliciet definiëren (bv. "SELECT tblOffertes.* FROM tblOffertes;"). Waarom?
 
Het wordt er (voor mij) niet duidelijker op. Ik snap niet wat het subtiele verschil zou moeten zijn tussen "koppeling via VBA" en "koppelen via VBA".
Verder moet je misschien maar eens laten zien hoe die "sql in procedure "Form_Load()" er uitziet. Daar zit kennelijk het probleem.
En natuurlijk de alomvattende vraag: waarom moet dat überhaupt via VBA?
 
Je hebt gelijk: het "Ten tweede" moet worden: "koppelen via eigenschappen". :eek: Lees het zo even. Is het nu duidelijker?
 
Zou het niet zo kunnen zijn dat als je via de on_load de recordbronnen instelt, dit na het afsluiten van het formulier niet opgeslagen wordt?
 
Dat is zeker zo! Maar begrijp niet dat je de recordsource ook nog eens in de eigenschappen moet meegeven. Dit kan je dan opbouwen via de query-editor maar wordt toch een beetje moeilijk indien je in de qeury ook variabelen moet meegeven.
 
Maar begrijp niet dat je de recordsource ook nog eens in de eigenschappen moet meegeven.
Ik wel. Ofwel je doet de complete koppeling via VBA, ofwel je doet de complete koppeling via Eigenschappen. Op het moment dat je een niet-afhankelijk formulier (en subformulier) gebruikt, zijn er geen velden om te koppelen. Bij het openen is er dus geen koppeling. Zodra je daarna via een VBA procedure een Recordsource instelt, ben je al dik te laat. Dus kies één van de twee opties, maar probeer ze niet in een onhandige mengelmoes tegelijk te gebruiken. Dat levert bij dieren ook zelden een goed resultaat op...
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan