In je belangrijkste formulier (tblVoorraad) heb je (correcte) koppelingen gemaakt met ProductID en LocatieID; je slaat dus
per record één Locatie en één product op. Tot zover is het makkelijk. de Locaties zijn getrapt, d.w.z. dat je vanuit de hoofdlocatie (materiaalwagen) meerdere sublocaties hebt (koffers) en daarin zitten meerdere laden. Wat je dus in je tabel Voorraad opslaat, is de combinatie Product + Laderecord. Als je nu nieuwe locaties gaat toevoegen, dan kun je dat prima op één formulier doen, waar dus iets meer op komt te staan dan alleen maar de in te vullen velden, wat je normaal gesproken zou doen (bij Producten bijvoorbeeld).
Wat je in de gaten moet houden, is dat er eigenlijk maar twee varianten zijn: invoeren van een
hoofdlocatie (is bijvoorbeeld nieuwe materiaalwagen) die dus
geen bovenliggende koppeling heeft (PArentID), en
alle andere records. Dat zijn namelijk de records die wél een ParentID nodig hebben. Daarbij maakt het niet uit of je een nieuwe koffer invoert (koppeling met materiaalwagen) of een nieuwe lade (koppeling met koffer). De twee records bevatten
dezelfde velden.
Dus hoe geef je nu op het formulier aan of je een hoofdlocatie invoert of een sublocatie? Door
geen ParentID in te voeren.
Ik zou het dus zo bouwen: op het formulier dat je maakt op basis van de tabel tbl_Locatie zet je een niet-afhankelijke keuzelijst waarin je de hoofdlocaties zet. Dat is een simpele query: alle velden uit de tabel in de query en het veld ParentID filteren op Is Null. Dan zie je alleen records waarin
geen ParentID is ingevuld, en dat zijn dus per definitie de hoofdcategorieën. Verder zet je er een tweede niet-gebonden keuzelijst naast, waarin je dezelfde query gebruikt als in de eerste keuzelijst, maar deze keuzelijst filter je op basis van de gemaakte keuze in de eerste keuzelijst. Dus als je in de keuzelijst met Hoofdlocaties een keuze hebt gemaakt, dan krijg je gelijk in de tweede keuzelijst de sublocaties te zien die horen bij de hoofdlocaties.
1. Als je een nieuwe hoofdlocatie invult, dan laat je het veld ParentID leeg, en de rest vul je in, en het record is klaar. In de praktijk komt het er op neer, dat je de twee keuzelijsten
niet gebruikt.
2. Wil je een nieuwe koffer (eerste subniveau) toevoegen, dan kies je eerst in de keuzelijst cboHoofdlocaties (ik geef hem maar een naam) een hoofdlocatie. Dan gebeuren er twee dingen: die keuzelijst vult de ParentID van je nieuwe record met het gekozen ID van de eerste keuzelijst,
en de tweede keuzelijst wordt 'klaargezet' (gefilterd) op reeds bestaande sublocaties. Omdat je een eerste niveau sublocatie invoegt, hoef je in de tweede keuzelijst niks te kiezen, en kun je het record dus gewoon afmaken en opslaan.
3. Nu de derde variant: als je een tweede niveau sublocatie wilt invoeren (nieuwe lade) dan
moet je dus een eerste subniveau kiezen (koffer). Dat doe je door in de
tweede keuzelijst óók een record te kiezen. Dan gebeurt ongeveer hetzelfde als in stap 2, alleen wordt nu het ID van de
tweede keuzelijst in de ParentID gezet. Verder is de procedure precies hetzelfde. Kortom: het maakt eigenlijk niet uit hoeveel niveaus je gebruikt; je zou net zo goed nog twee niveaus dieper kunnen gaan. In dat geval moet je dus ook meer keuzelijsten maken, dat spreekt voor zich
.
Stel nu dat je een nieuwe koffer hebt toegevoegd aan de wagen, en je wilt meerdere laden invullen, dan heb je dus ook meerdere keren dezelfde ParentID ingevuld. Dat kan simpel door bij het aanmaken van een nieuw record de waarde(n) van de gebruikte keuzelijst(en) te laten staan. Dus als je na het aanmaken van de eerste lade de volgende lade toevoegt, dan staat de keuzelijst nog ingesteld op de laatst gebruikte keuze (niet-afhankelijke keuzelijst immers) dus die kun je zo weer overnemen. Op die manier kun je heel snel nieuwe items op verschillende niveaus toevoegen.
Het formulier bevat dan op de keuzelijsten wel een paar stukjes VBA; om te beginnen moet je de tweede keuzelijst initiëren op basis van de gekozen waarde in de eerste keuzelijst. Zelf doe ik dat het liefst door de SQL (rijbron) van de tweede keuzelijst 'hard' in te stellen, dus door de filtering te doen op basis van de gekozen waarde. Je kunt ook filteren op basis van een
verwijzing van de eerste keuzelijst. Ook dan heb je nog een klein stukje code nodig, die dan vanuit de eerste keuzelijst de tweede keuzelijst ververst. De werkwijze maakt dus in de praktijk niet heel veel verschil.
Daarnaast heb je code nodig die de ParentID vult vanuit de keuzelijst(en). Dat doe je vanuit de gebeurtenis <Bij Klikken>. Ook dat is een simpele code (één regel)
En, last but not least: als je meerdere records wilt gebruiken, dan moet je nog iets hebben dat de gekozen keuzelijst kopieert naar de ParentID van het nieuwe record. Ook dat is weinig code, en kan op verschillende manieren. Ik zou ook nog een knop in de koptekst zetten die de keuzelijst(en) weer leeg maakt, als je met een schone lei wilt verder gaan. Anders blijf je altijd met een ParentID zitten
.