Contextafhankelijke sub-categorie

Status
Niet open voor verdere reacties.

Waldorf79

Gebruiker
Lid geworden
7 dec 2011
Berichten
29
Office versie
magDer
Kenners,

Een klein vraagje van een complete Noob in Acces, vermits ik er al dagen mijn hoofd op zit te breken en het voor jullie wss een fluitje van een cent is.

Wat ik wil doen (hypotetisch voorbeeld):
ik heb twee tabellen:
- Alfabet: heeft 1 veld en 3 records (nl A, B en C)
- Nummers: heeft 2 velden en 9 records (veld 1: 1,2,3,4,5,6,7,8,9 en veld 2 A,A,A,B,B,B,C,C,C)

Nu wil ik in een derde Tabel getiteld 'Samenvoeging' (geen formulier!!) met 2 velden (opzoekkolommen):

In veld 1 krijg je dan de mogelijkheden A,B,C
In veld 2 krijg je de keuzemogelijkheden 1,2,3 of 4,5,6 of 7,8,9 naar gelang wat je geselecteerd hebt in veld 1.

Zo, ik hoop dat mijn vraag een beetje duidelijk is? Vermits ik blijkbaar wat moeite heb met het uploaden van mijn voorbeeldbestand.

Als iemand weet hoe het moet, graag wat hulp!
 
Waarom:
Nu wil ik in een derde Tabel getiteld 'Samenvoeging' (geen formulier!!) met 2 velden (opzoekkolommen):
Tabellen zijn er om gegevens in op te slaan. In een tabel wil je dan ook de opgeslagen gegevens zien, en niet waarden die uit een opzoeklijst komen. Alleen tekstvelden gebruiken dus! (Dat is althans mijn opvatting als je gegevens uit tabellen wilt opslaan; voor keuzelijsten die zijn gebaseerd op <Lijst met Waarden> geldt dat uiteraard niet :) )
Tweede opmerking: in een tabel kun je geen afhankelijke keuzelijsten maken, en in een formulier wel. Kom ik weer bij vraag 1: waarom geen formulier????
 
Ik dacht dat ik het beste kon doen met een externe tabel waar alle gegevens in samenkomen vermits ik die tabel wil linken met excel en daar dan de gepaste grafieken uit trekken. (daarom dus geen formulier)
Een formulier voor de input zou dus geen probleem zijn (in tegendeel een meerwaarde), maar uitendelijk moeten alle velden in een tabel komen te staan waar ik dan verder in excel mee aan de slag kan.

Dus om op mijn vb terug te komen,
Tabel 1 en 2 (Alfabet en Nummers) moeten geselecteerd kunnen worden en nadien geexporteerd... Zoals in Tabel 3 de bedoeling is:
Klant 1 heeft product A besteld met subcategorie 2
Klant 2 heeft product A besteld met subcategorie 1
Klant 3 heeft product B besteld met subcategorie 5
enz...
Aan deze tabel (eventueel gekoppeld aan een formulier) kunnen ook nog extra velden worden toegevoegd.

Aan de initiele tabellen (1&2) zouden ook op termijn nieuwe categoriën en sub-categoriën moeten kunnen bijgevoegd worden...

Ik hoop dat je snapt wat ik bedoel?

Het lijkt wat op wat in topic http://www.helpmij.nl/forum/showthread.php/610352-Sub-categorie?highlight=afhankelijke+keuzelijst behandeld word (in formuliervorm), maar alle ingevoerde gegevens zouden in een aparte Tabel moeten komen dewelke dan exporteerbaar is naar excel (of zelfs beter, gelinkt is aan, maar dat lukt me wel)

Ik heb geen idee wat er mis is met m'n upload van 't voorbeeldbestand, maar hij wilt m'n zip-je niet uploaden...
 
Ik zie nog steeds niet helder wat je aan het doen bent; maar als je een tabel wilt maken (dat zou dan tabel3 zijn?) die je aan Excel koppelt, dan moet je juist niet met keuzelijsten werken, want in Excel zie je die toch niet terug.... Dus in tabellen geen keuzelijsten ;)
Invoeren/koppelen doe je uiteraard met formulieren, en nooit rechtstreeks in de tabel. Dus voor alle tabellen maak je netjes een formulier. Dat daarbij de onderliggende tabellen ook gekoppeld worden met Excel bestanden, boeit niet. Tabel3 bevat dus de gegevens die je gaat opslaan, en die je wilt exporteren naar Excel? En de bedoeling is dat de waarden uit de tweede keuzelijst afhankelijk zijn van de eerste? Die techniek kun je prima uit het andere voorbeeld halen. Alleen heb ik in dat voorbeeld één tabel gemaakt met een kolom ParentID die filtert op de brontabel. Als je twee tabellen hebt, werkt het in beginsel hetzelfde. In dat geval heb je geen ParentID, maar verwijs je naar het koppelveld uit de eerste tabel.
 
Ik zie nog steeds niet helder wat je aan het doen bent
hmm... Ik snap blijkbaar niet veel van acces... ;)

Tabel3 bevat dus de gegevens die je gaat opslaan, en die je wilt exporteren naar Excel?
Juist! Tabel 3 bevat de gegevens die uit Tabel 1 en contextafhankelijk Tabel 2 komen.

Die techniek kun je prima uit het andere voorbeeld halen.
Dat is waar, maar in dit voorbeeld worden de gegevens ingevoerd in het formulier niet als records in een aparte tabel gesaved.

Sorry maat, maar acces is mij echt nog een zorgenkindje! :o
 
die je aan Excel koppelt, dan moet je juist niet met keuzelijsten werken, want in Excel zie je die toch niet terug....
Het is ook niet de bedoeling in excel de volledige keuzelijst te zien, maar de waarde gekozen in de keuzelijst voor dat record.
 
Dat maakt niet uit; een formulier kun je afhankelijk maken van een tabel, of niet. Voor de werking van keuzelijsten of formulier maakt dat verder niks uit. Al komt er een extra stukje code bij, want nu krijg je de situatie dat de keuzelijsten gekoppeld moeten worden aan velden, en je de gekozen waarden dus terug wilt zien in de bestaande records. Ik heb het voorbeeldje dus een beetje aangepast, en er nu een tabel onder gehangen. De werking is verder hetzelfde gebleven.
 

Bijlagen

Great! ;)

Ik denk dat ik het een beetje begin te snappen.

Nu zie ik wel in de tabel dat de output is van het formulier, dat je enkel de ID-nummers krijgt.
Is er een mogelijkheid om de echte waarden in die tabel te kunnen weergeven in plaats van hun ID-nummer?

En... Hoe heb je dat juist voor mekaar gekregen om de ingevoerde gegevens in 't formulier in een tabel te krijgen?

Sorry to spoil your day met zo'n beginnersvragen hoor! :D
 
Laatst bewerkt:
Makkelijke vragen zijn..... 't makkelijkst! Dus brand maar los ;)
Het formulier is simpelweg gekoppeld aan de tabel door de tabel te kiezen bij de optie <Recordbron> in de formuliereigenschappen. Op dat moment zijn alle velden uit de bron beschikbaar, en die kun je dan als <Besturingselementbron> koppelen aan tekstvelden, keuzelijsten etc.

Zolang je binnen Access werkt, is er niet zoveel aan de hand w.b.t. keuzelijsten; je wilt ook eigenlijk niks anders opslaan in de tabel dan de ID's (of sleutelvelden) van de tabellen die je gebruikt voor de keuzelijsten. Alleen ga je met export (en queries) dus een beetje de teil in, omdat je bij je Export niet de sleutelwaarden wilt zien, maar meestal tekstvelden met de omschrijvingen. Daarom zou ik voor je export ook niet de tabel gebruiken, maar een query maken die wèl alle tekstvelden laat zien die je wilt exporteren. Maakt voor de export (en Excel) niks uit, maar je houdt wel je gegevensintegriteit intact. Dus ik zou in het formulier gewoon gebruik maken van de sleutelwaarden, en voor de export een aparte query maken die je dan baseert op alle tabellen die gegevens aanleveren, dus Tabel3 voor de hoofdgegevens, en Tabel1 en Tabel2 voor de omschrijvende tekstvelden voor de keuzelijsten. Als je de db goed hebt opgezet, zijn de tabellen 1 en 2 al gekoppeld aan tabel3, dus dat moet verder geen probleem opleveren.
 
Fantastisch!

één en ander is me al veel duidelijker geworden...
Ik denk dat ik bij deze aan de slag kan en als er nog vragen/onduidelijkheden zijn dan horen jullie die nog wel!

In elk geval bedankt! Ik denk dat ik er nu wel uitkom... :thumb:
 
Mag je de vraag nog op <Opgelost> zetten!
 
Nog even snel een vraagje,

Stel dat ik in mijn form (en de uiteindelijke tabel) de subcategorie meerdere malen wil invoeren. hoe doe ik dat dan?
Als ik nu dat drop-down menutje kopieer in de ontwerpmodus vd form, dan geeft ie compileerfouten.
Dus (subcategorie 2 is niet nodig) maar subcategorie 1 zou nog minstens 1 extra keer moeten voorkomen op de form?
Eigenlijk afhankelijk van een getal dat in een veld in tabel 1 staat.
Hoe doe ik dat?
 
Ik snap de vraag niet helemaal; wat ben je aan het doen? Een kopie maken van een keuzelijst zou op zich prima moeten kunnen. Alleen moet je dan de code ook aanpassen, want daarin wordt verwezen naar de naam van de keuzelijst, en die moet uniek zijn. Ergo: de kopie keuzelijst heeft gegarandeerd een andere (niet zo logische) naam als het origineel, maar wel dezelfde code. Dus eerst de naam van de keuzelijst veranderen, en dan de code ervan aanpassen zodat de verwijzingen weer kloppen.
 
Naar het voorbeeld hier gepost heb ik nu:

Een form gemaakt met de volgende keuzelijsten:

-Hoofdcategorie (vb: besturingssystemen)
-subcategorie (vb: Windows 7)
-nogmaals subcategorie (vb: Windows 7)

-tweede subcategorie heb ik verwijderd.

Nu als ik in subcategorie Windows 7 selecteer kan ik blijkbaar in de tweede keuzelijst niet Windows XP selecteren vermits die beiden aan mekaar hangen?
 
Je hebt dus nog maar twee keuzelijsten op je formulier i.p.v. 3? Dan moet je bijna alle code aanpassen, want bij het laden van het formulier worden er 3 keuzelijsten geïnitialiseerd, en dat moeten er dus twee worden. Iets als:

Code:
Private Sub Form_Current()
    For i = 1 To [COLOR="red"][B]2[/B][/COLOR]
        If Me("Veld " & i) & "" = "" Then
            Me("cboCat" & i) = ""
        Else
            Me("cboCat" & i) = Me("Veld " & i)
            If i < [B][COLOR="red"]2[/COLOR][/B] Then
                strSQL = "SELECT CatID, Naam, ParentID FROM tCategorie WHERE ParentID = " & Me("cboCat" & i)
                Me("cboCat" & i + 1).RowSource = strSQL
                Me("cboCat" & i + 1).Requery
            End If
        End If
    Next i
End Sub

De tweede keuzelijst heeft code die de derde keuzelijst instelt; die code kan weg.
 
Daar was ik zelf intussen achter gekomen, maar toch bedankt! :)

Ik heb nu dus een derde keuzelijst toegevoegd, die eigenlijk identiek zou moeten zijn aan keuzelijst 2.
Probleem is echter dat, naarmate ik met de code pruts keuzelijst 3 ofwel leegblijft, ofwel dezelfde waarden bevat den keuzelijst 2 met het nadeel dat als ik in keuzelijst 3 een andere keuze wil maken dan in keuzelijst 2, de waarde in keuzelijst 2 ook verspringd.

Ik heb nu:
Code:
Option Compare Database
Option Explicit
Dim strSQL As String
Dim i As Integer

Private Sub cboCat1_AfterUpdate()


strSQL = "SELECT tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID, Count(SubCat.CatID) AS AantalSub " _
    & "FROM tCategorie " _
    & "LEFT JOIN tCategorie AS SubCat ON tCategorie.CatID = SubCat.ParentID " _
    & "WHERE (tCategorie.ParentID = " & Me.cboCat1 & ") " _
    & "GROUP BY tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID " _
    & "ORDER BY tCategorie.Naam;"

Me.cboCat2.RowSource = strSQL
Me.cboCat2.Requery
Me.cboCat3.RowSource = strSQL
Me.cboCat3.Requery

End Sub

Private Sub cboCat1_BeforeUpdate(Cancel As Integer)

End Sub

Private Sub cboCat1_Enter()
    If Me.cboCat1 & "" = "" Then
        For i = 2 To 3
            Me("cboCat" & i) = ""
        Next i
    Else
        For i = 1 To 2
            Me("cboCat" & i) = Me("Veld " & i)
        Next i
    End If
End Sub

Private Sub cboCat2_AfterUpdate()

strSQL = "SELECT CatID, Naam, ParentID FROM tCategorie WHERE ParentID = " & Me.cboCat2
strSQL = "SELECT tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID, Count(SubCat.CatID) AS AantalSub " _
    & "FROM tCategorie " _
    & "LEFT JOIN tCategorie AS SubCat ON tCategorie.CatID = SubCat.ParentID " _
    & "WHERE (tCategorie.ParentID = " & Me.cboCat2 & ") " _
    & "GROUP BY tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID " _
    & "ORDER BY tCategorie.Naam;"
   
End Sub

Private Sub cboCat2_Enter()
    If Me.cboCat2 & "" = "" Then
        Me.cboCat2 = ""
    Else
        Me.cboCat2 = Me.[Veld 2]
    End If
End Sub
Private Sub cboCat3_AfterUpdate()

strSQL = "SELECT CatID, Naam, ParentID FROM tCategorie WHERE ParentID = " & Me.cboCat3
strSQL = "SELECT tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID, Count(SubCat.CatID) AS AantalSub " _
    & "FROM tCategorie " _
    & "LEFT JOIN tCategorie AS SubCat ON tCategorie.CatID = SubCat.ParentID " _
    & "WHERE (tCategorie.ParentID = " & Me.cboCat3 & ") " _
    & "GROUP BY tCategorie.CatID, tCategorie.Naam, tCategorie.ParentID " _
    & "ORDER BY tCategorie.Naam;"
   
End Sub

Private Sub cboCat3_Enter()
    If Me.cboCat3 & "" = "" Then
        Me.cboCat3 = ""
    Else
        Me.cboCat3 = Me.[Veld 2]
    End If
End Sub

Private Sub Form_Current()
    For i = 1 To 2
        If Me("Veld " & i) & "" = "" Then
            Me("cboCat" & i) = ""
        Else
            Me("cboCat" & i) = Me("Veld " & i)
            If i < 2 Then
                strSQL = "SELECT CatID, Naam, ParentID FROM tCategorie WHERE ParentID = " & Me("cboCat" & i)
                Me("cboCat" & i + 1).RowSource = strSQL
                Me("cboCat" & i + 1).Requery
            End If
        End If
    Next i
End Sub
 
Niet getest, want daar had ik geen tijd voor, maar volgens mij moet je dit aanpassen:
Code:
Private Sub Form_Current()
    For i = 1 To 3
        If Me("Veld " & i) & "" = "" Then
            Me("cboCat" & i) = ""
        Else
            If i = 1 Then
                strSQL = "SELECT CatID, Naam, ParentID FROM tCategorie WHERE ParentID = " & Me("cboCat" & 1)
                Me("cboCat" & 2).RowSource = strSQL
                Me("cboCat" & 3).Requery
            End If
            Me("cboCat" & i) = Me("Veld " & i)
        End If
    Next i
End Sub
En de code voor Cat2 en 3 kunnen volgens mij weg.
 
:confused:
hmm... Geraak er nog steeds niet uit...
Denk dat ik maar eens een cursus Visual Basic moet gaan volgen...

Cat1 doet wat hij moet doen,
Cat2 doet ook wat ie moet doen,
maar Cat3 zou eigenlijk dezelfde keuzes moeten hebben en dus identiek zijn aan Cat 2, maar blijft een leeg keuzemenu.

Gewoon Cat 2 in de form copieren en de code van Cat 2 copieren en naamverwijzing aanpassen lijkt dus niets op te leveren...

Ook je stukje code van gisteren doet het hier bij mij alleszins niet.
Dus als je even tijd zou hebben? :thumb:

't Is niet superdringend maar eens dit euvel vd baan is hoop ik verder toch wel mijn plan te kunnen trekken...
 
Ben eruit gekomen!!! :D

Great! Thx voor de hulp!!

Draad kan dicht! :)
 
Vermeld nog even wat de oplossing was, voor de geïnteresseerden!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan