Beginner: hoe voeg ik sub branches toe.

Status
Niet open voor verdere reacties.

Tweela

Gebruiker
Lid geworden
7 mei 2018
Berichten
15
Hallo allen,

Dank bij voorbaat voor het lezen van mijn vraag. Ik ben dus ontzettend nieuw met Access en hoop dat een veteraan mij kan/wil helpen.

Casus:
Heb een tabel bedrijven en daarin een kolom Branche en een kolom Sub Branche. Branche en Sub Branche zijn ook 2 aparte tabellen.
Mijn wens is dat ik een Branche selecteer en vanuit die keuze een relevante selectie uit de Sub Branche tabel krijg.
Bijvoorbeeld Branche "Bouw en Vastgoed" en dan bij Sub Branche de keuze "Advies- en ingenieursbureaus, Bouwondernemingen, Woningcorporaties, Projectontwikkelaars, Vastgoedondernemingen, Architectenbureaus"
Zonder dat alle andere velden in de tabel Sub Branche worden getoond.

Als ik dit helemaal verkeerd heb aangepakt (zal vast wel zo zijn) dan waardeer ik een zet in de goede richting enorm.
 
Als ik dit helemaal verkeerd heb aangepakt (zal vast wel zo zijn) dan waardeer ik een zet in de goede richting enorm.
Helemaal verkeerd is het niet wat je doet, als de GGD (Grootste Gemene Deler) in deze kwestie maatgevend is. Het gros van de gebruikers doet het namelijk zo. Dat wil niet zeggen dat het de beste oplossing is. Zelf doe ik het in ieder geval anders, ik zie namelijk geen enkele noodzaak om daar 2 tabellen voor te gebruiken; alles kan makkelijk in een tabel. De theorie daar achter is dat je objecten die hetzelfde bevatten, altijd in 1 tabel zet. En een categorie is in deze niets anders dan een subcategorie. Met als onderscheid dat een subcategorie afhankelijk is van het niveau erboven: de categorie. Dus in mijn tabel vind je altijd een veld ParentID waarin ik een verwijzing zet naar het record met de bijbehorende Categorie. Om even bij jouw voorbeeld te blijven:
De Branche "Bouw en Vastgoed" heeft CategorieID 6. Omdat het hier een hoofdcategorie betreft, vul je niks in bij ParentID. Daarna krijg je in diezelfde tabel aparte records voor Advies- en ingenieursbureaus, Bouwondernemingen, Woningcorporaties, Projectontwikkelaars, Vastgoedondernemingen eng Architectenbureaus. Al deze records krijgen een eigen CategorieID, en in het veld ParentID de waarde 6.

Daarbij heb jij straks een probleem als je besluit dat je nog meer wilt specificeren, bijvoorbeeld op bedrijfsgrootte, voor Bouwondernemingen en Aantal woningen voor woningcorporaties. Dan ben jij verplicht nog meer tabellen in de strijd te gooien, want dat kun jij niet kwijt. Ik wel: ik voeg gewoon nieuwe records toe, waarbij ik nu in het veld ParentID een verwijzing opneem naar de CategorieID van Bouwondernemingen resp. Woningcorporaties.

Kortom: mijn systeem met 1 tabel is veel flexibeler dan een oplossing op basis van losse tabellen voor alle aparte categorie niveaus. Al is dat ook best werkend te krijgen, dat is het probleem niet echt. Maar flexibel is anders.

Laten we er even vanuit gaan dat ik je overtuigd heb, en dat je nu ook alles in één tabel gaat zetten. Hoe krijg je dan de gewenste informatie in de keuzelijsten? Eigenlijk wel simpel. Om te beginnen maak je de keuzelijst voor de hoofdcategorieën. De query die je daarvoor maakt, filter je op het veld ParentID, waarbij het veld leeg moet zijn, want hoofdcategorieën hebben geen ParentID. De tweede keuzelijst (en dit geldt ook voor de volgende mocht je die gaan gebruiken) gebruikt dezelfde bron (zelfde tabel) maar nu gebruik je de waarde uit de eerste keuzelijst als filter (criterium) voor de tweede. Dan zie je namelijk alleen die records met het juiste CategorieID.

Daar zit nog wel een klein stukje programmeren bij, want de tweede keuzelijst moet elke keer opnieuw worden ververst als je een nieuwe categorie kiest. Daarom geef je de tweede keuzelijst een Requery zodat die bij het klikken op de eerste keuzelijst gelijk wordt bijgewerkt.
 
Dank

Dankjewel OctaFish,

Zal er even flink voor moeten gaan zitten om de informatie te verwerken, maar dat hoort erbij :) Enorm bedankt dat je de tijd en moeite hebt genomen voor je uitleg.
 
Mocht je er niet uitkomen: post een voorbeeld bestand mee, dat kijkt een stuk makkelijker.
 
Hoi Octafish, ik kom er inderdaad niet uit. Er volgt nog een mail met bestand.
 
@guidothys: dat is niet 'de oplossing', maar één van de oplossingen. Zoals ik in mijn eerste antwoord al aangaf, kun je met meerdere tabellen werken, of met één tabel. Dat laatste heeft altijd mijn voorkeur, omdat je dan altijd een werkend systeem hebt. Met meerdere tabellen ben je verplicht voor elke laag een nieuwe tabel te maken. Dat mág natuurlijk wel, maar is niet altijd handig. In het geval van een postcodetabel overigens wel, omdat de entiteiten verschillend zijn. Een land is niet gelijk aan een plaats is niet gelijk aan een straat. Daarom maak je daar wél verschillende tabellen voor. Maar voor een systeem van categorieën en subcategorieën (zeker op meerdere subniveau's) doe je dat dus niet.
 
Ik had nog een oplossing voor je bedacht, en die heb ik in de bijgaande database uitgewerkt. Kijk maar even of je snapt wat ik gedaan heb. En anders komen de vragen vanzelf wel :).
 

Bijlagen

  • OefenDB_octa.zip
    140,8 KB · Weergaven: 32
Hoi Octa, het is puzzelen. Omdat ik pas een paar weken met Access bezig ben is de code voor mij lastig. Maar ik begrijp de logica (denk ik).
Je maakt een keuze bij branche en bij subbranche roep je geen nieuwe tabel of query op. Maar je selecteert de parentID door de code te laten kijken naar het veld erboven en die input te vergelijken met de match in de tabel en alleen dat weer te geven.
Makes perfect sense, je moet het alleen wel kunnen bedenken :) Enorm bedankt. Ik hoop dat ik het kan reproduceren.
 
Laatst bewerkt:
Je snapt in ieder geval de gedachte, en daar begint het mee. Met dit systeem kun je dus ook makkelijk doorbouwen, want elke subcategorie kan weer als ParentID werken voor een laag dieper. Ik heb de code iets uitgebreider dan noodzakelijk; de meeste mensen geven alleen een Requery opdracht voor de tweede keuzelijst. Mijn oplossing werkt wat netter.
 
Foutje denk ik

Hoi Octa, ik kreeg het maar niet voor elkaar om de oplossing te kopieeren naar een nieuwe DB en werkzaam te krijgen.
Er zit namelijk een foutje in jouw terugkoppeling met DB. Tenminste dat vermoed ik.
Wat er gebeurd is dat bij het toevoegen van een nieuwe branche en subbranche, dan opslaan, opnieuw openen en wederom bij een volgend bedrijf een branche en subbranche invullen bij voorgaande records de sub branches niet meer worden weergegeven.
 
Dat is geen foutje, maar een logische consequentie. Zodra je keuzelijsten afhankelijk van elkaar maakt, krijg je alleen de waarden te zien in de tweede keuzelijst die horen bij de keuze in de eerste keuzelijst. Verander je de waarde in de eerste keuzelijst, dan hoort de waarde die je in de tweede keuzelijst hebt gekozen niet in de subselectie. Het gevolg is dan, dat je op je formulier geen waarde meer ziet in de tweede keuzelijst. De waarde zit echter nog wel in het veld de tabel opgeslagen, alleen kun je hem niet meer zien.
Om het systeem helemaal perfect te maken, en voor mezelf doe ik dat uiteraard, moet de keuzelijst dus eigenlijk twee verschillende functies krijgen: één tak die je gebruikt bij het toevoegen van records (zoals gemaakt) en één tak die je gebruikt bij het bladeren, en waarbij de tweede keuzelijst dus niet afhankelijk is van de eerste. In dat geval moet de tweede keuzelijst dus altijd alle records laten zien.

Ik heb dat niet toegevoegd, om je zelf ook nog wat te laten ontdekken :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan