formulier met subform (met meerdere tabs)

Status
Niet open voor verdere reacties.

yentldj

Gebruiker
Lid geworden
22 mei 2013
Berichten
51
Dag allen,

Bijgevoegd heb ik 2 afbeelding. Een afbeelding met mijn relaties (Gewoon ter hulp voor mijn volgende vraag) en een foto van hoe ik de layout van mijn Form wil.

Ik heb dus verschillende wagens. in deze wagens heb ik een hoofdlocatie en een sublocatie.
Nu wil ik zoals in dat report alle producten bekijken diet in een bepaalde wagen, hoofdlocatie en sublocatie zitten.
De producten zou ik dan met hun vervaldatum en hun stock in een subform zetten zodat ik ook producten kan toevoegen en verwijderen op een bepaalde locatie.

misschien moet ik er ook nog bij zetten dat sommige producten enkel in een wagen zitten en geen hoofd of sublocatie hebben

Kan er iemand hierbij helpen?

Het lijkt toch iets moeilijker dan ik dacht.

Alvast bedankt

Groeten Yentl
 

Bijlagen

  • model form.png
    model form.png
    249,2 KB · Weergaven: 69
  • relations.png
    relations.png
    189,5 KB · Weergaven: 87
Laatst bewerkt:
Ik zie dat je wél een zin aanpast, maar de taalfouten (‘men relaties’, ‘men form’, ‘producten bekijken dat in een bepaalde wagen’ moet natuurlijk zijn: ‘mijn relaties’, ‘mijn formulier’ en ‘die in een bepaalde wagen’).
Daar kan ik overigens nog wel doorheen lezen, maar de opzet van je db wordt er bepaald niet duidelijker door.

Wat ben je precies aan het doen? Het riekt een beetje naar het registreren van foodtrucks, maar dat zou ik, als dat het geval is, toch heel anders doen. Maar leg even uit wat de bedoeling is, dan kunnen we beter inschatten hoe je het aan moet pakken.
Sowieso is de eerste aanbeveling: één tabel voor locaties. Nergens voor nodig om daar meerdere tabellen voor te gebruiken.
 
Beste Octafish,

Wat ik wil doen is een database maken voor materiaal. Zo kan ik bijhouden welk product zich waar bevindt en wat de stock ervan is.

Ik heb ze ook apart gezet omdat ik dacht:
1 wagen heeft meerdere hoofdlocaties en een hoofdlocatie kan meerdere sublocaties hebben.

De locaties en producten heb ik ook apart gezet zodat ik dan in die tabellen altijd producten en locaties kan toevoegen via een form.

Ik heb al een Form gemaakt dat weergeeft waar ieder product zich bevindt. (zie hieronder
Nu wil ik eigenlijk het omgekeerde hiervan. Ik wil zien welke producten zich bevinden in een bepaalde locatie.

Alvast bedankt!

Groeten Yentl
 

Bijlagen

  • formulier per product.png
    formulier per product.png
    201,7 KB · Weergaven: 44
Je moet, om te beginnen, pas formulieren maken als de structuur van de database in orde is. Dat is hij dus (imho) niet.

Als je een database gaat maken, moet je in objecten denken (entiteiten). Een locatie is een type object, een sublocatie is hetzelfde type. Ergo: dat sla je op in één tabel. Sublocaties zijn afhankelijk van hoofdlocaties, en dat los je op met een extra veld: ParentID. Bij het invoegen van een hoofdlocatie voer je géén ParentID in (heeft-ie niet) bij een sublocatie heb je wél een ParentID. Dus daar vul je hem wél in.
Voordeel: als je op je formulier/tabel een hoofdlocatie kiest, zie je in de afhankelijke keuzelijst automatisch de sublocaties die daar bij horen.

Jouw tabellen met (sub)locaties hebben (bijna) dezelfde naam als de tabel waarin je de velden gebruikt. Dat is weliswaar niet verboden, maar handig is anders. Je slaat in die tabel ook geen locaties op, maar voorraden.

Met de juiste structuur, kun je inderdaad prima maken wat je wilt. Maar eerst dus de juiste structuur :). Ik zou zeggen: doe er eens een voorbeeldje bij, dat kijkt wat makkelijker.
 
Beste Octafish,

Alvast bedankt voor de hulp.

Als ik het goed begrijp moet ik alle locaties in 1 tabel zetten.

Dus ik heb bevoorbeeld de materiaalwagen waarin een koffer A zit. In die koffer zit ook een schuif A.

Dan moet ik dus de wagens, hoofdlocaties en sublocaties in 1 tabel zetten met een veld parentid.

Nu is mijn vraag welke relaties ik hiermee moet maken. En hoe ik die parentid koppel met de sublocatie (en eventueel de hoofdlocatie aangezien die afhangt van de wagens)

Alvast bedankt

Groeten Yentl
 
Ik begin (vermoed ik) langzaam te snappen wat je met locaties bedoelt. D.w.z.: wat het niet is (namelijk: een lokatie :)). Je bedoelt vermoed ik ruimtes waarin je iets kan opslaan. Daarmee verandert mijn vorige antwoord een beetje, want nu ga ik je vertellen dat ook de tabel Wagens weg kan :). Laten we je voorbeeldje eens nader bekijken. Dan heb je het over een materiaalwagen, met daarin koffers en die koffers hebben laden. Er vanuit gaande dat je in één wagen meerdere koffers kwijt kan (hoewel er natuurlijk wagens zijn waarin zelfs een koffer al teveel gevraagd is :)) en één koffer meerdere laden kan bevatten, dan heb je dus in je tabel Locaties de volgende records (met een ID erbij als voorbeeld:
Code:
LocatieID  Naam      ParentID
 1         WagenA    
 2         Koffer1     1    
 3         Koffer2     1
 4         Koffer3     1
 5         LadeK1_1    2    
 6         LadeK1_2    2    
 5         LadeK2_1    3    
 6         LadeK2_2    3
Etc. Elke laag dieper grijpt dus in de ParentID terug naar het bovenliggende niveau. Door deze aanpak kun je zelfs de laden nog onderverdelen met vakjes waarvan je de inhoud nog kan uitdiepen, door dus in de nieuwe records te verwijzen naar het ID van de betreffende lade.

Groot nadeel (onder andere) van jouw constructie is, is dat de 3 velden die je nu gebruikt totaal onafhankelijk zijn in te vullen; er is geen verband tussen. En dat ís er natuurlijk wel, want je kunt fysiek onmogelijk wagen A gebruiken, en koffer2 en van koffer 2 de laden van koffer 3. Dat kan nu dus wél.
Ik kan mij overigens nog voorstellen dat je koffers nog wel eens verplaatst, en als dat dagelijks gebeurt, dan moet je die koffers natuurlijk al helemaal niet aan een wagen hangen. In dat geval is de koffer namelijk geen attribuut van de wagen meer.
 
Beste Octafish,

Ik heb mijn database aangepast naar hoe je zegt. Kan je me even zeggen hoe ik mijn relatie nu moet leggen aub?

Hoe implementeer ik dit in men formulieren?

Alvast bedankt

Groeten Yentl
 

Bijlagen

  • nieuw.png
    nieuw.png
    175,2 KB · Weergaven: 48
Laatst bewerkt:
Het zou beter zijn als de benaming van de te koppelen velden beter herkenbaar zijn.
Daarnaast moeten de velden om te koppelen gelijkwaardig zijn bv nummeriek.
Verder moet je dan de wijze van de relatie bepalen een op veel of een op een.
Anders krijg je een bericht van een onjuiste verbinding.

Gebruik daarna de wizard om een formulier te maken.
 
Laatst bewerkt:
tbl_Locatie heb je nog niet gekoppeld aan tbl_Voorraad, dus dat moet je op dezelfde manier doen als de andere tabel: het veld ID slepen naar het overeenkomende veld. Omdat de oude koppelingen werkten, ga ik er vanuit dat het veld [Locatie] een numeriek veld is. Persoonlijk geef ik velden altijd een logische naam; Access geeft, als het zelf sleutelvelden aanmaakt, die de naam ID maar dat is een waardeloze naam, zeker als je hem voor alle tabellen gebruikt. Maak daar dus LocatieID, VoorraadID en ProductID van.
Voor de tabel Voorraad geldt dan nog (wat mij betreft) dat de ontvangende velden (de Veelkant dus) ook numeriek zijn, en dat wil je dan ook terug zien in de naam. Ik kies dan vaak voor één van deze varianten: Product_ID of ProductID, Locatie_ID of LocatieID. De tweede variant is dus gelijk aan de naam van het sleutelveld van de Eén tabel. Dat heeft voor- en nadelen. Voordeel: als je queries maakt, zal Access de koppeling automatisch leggen, omdat de namen identiek zijn. Nadeel: in queries, formulieren en rapporten moet je altijd de naam van de tabel óók gebruiken, omdat een formule op het veld [ProductID] niet meer te herleiden is naar een tabel. Je krijgt dan: [tbl_Producten].[ProductID]. Heb je velden die [ProductID] ( uit [tbl_Producten]) en [Product_ID] ( uit [tbl_Voorraad]) heten, dan heb je dat probleem niet, omdat de namen nu uniek zijn. Ik prefereer dus de unieke variant.

Ik zou het formulier gewoon met de hand maken; ik heb nog nooit een mooi formulier uit een wizard zien komen. Bovendien moet je er toch wat 'handwerk' op los laten, om de drie keuzelijsten voor de locaties (als je er drie nodig hebt) te kunnen gebruiken.

Ik zie dat je de schreivwèze van het woord 'mijn' nog niet helemaal onder de knie hebt, oefen je daar genoeg wel op? :).
 
Beste Octafish,

Ik doe mijn best.

Kan je me nog even zeggen hoe ik mijn Formulier maak om locaties toe te voegen.

Ik raak er niet echt aan uit hoe ik ervoor zorg dat ik meerdere locaties kan toevoegen en hoe ik dit dan organiseer naar een form met subformulier. (Ik zie het persoonlijk niet zitten om het parentID nummer altijd te onthouden maar ik denk ook niet dat dat het plan was)

Alvast bedankt

Groeten Yentl
 
Laatst bewerkt:
Kan je me nog even zeggen hoe ik mijn Formulier maak om locaties toe te voegen.
Ik raak er niet echt aan uit hoe ik ervoor zorg dat ik meerdere locaties kan toevoegen en hoe ik dit dan organiseer naar een form met subformulier.
Ik snap niet helemaal wat je wilt. Wat bedoel je met ‘meerdere locaties toevoegen’?
 
Ik wil dus eigenlijk 3 formulieren maken:

- 1 formulier waarbij ik locaties kan toevoegen: vb materiaalwagen - koffer 1 - lade 1
- 1 formulier met subform waarbij ik kan zien: in materiaalwagen - koffer 1 - lade 1 zitten volgende producten (met subform)
- 1 formulier waarbij ik kan zien waar elk product zit.


Ik kan de formulieren wel maken (dit heb ik al eerder gedaan in andere databases) maar ik zit een beetje in de knoop met die parentID. Hierbij nog een foto van men gemaakte relaties.

Alvast bedankt

Groeten Yentl
 

Bijlagen

  • relaties.png
    relaties.png
    179,9 KB · Weergaven: 42
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 :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan