Keuzevakjes automatisch te laten veranderen als je een bepaalde keuze maakt

Status
Niet open voor verdere reacties.

JEPEDEWE

Terugkerende gebruiker
Lid geworden
14 jun 2006
Berichten
1.697
Hallo,
ik heb een table met 4 velden:
afdeling, keuze, code, omschrijving
(ik steek er een schermafdrukje bij)

de bedoeuling is de keuzevakjes automatisch te laten veranderen als je een bepaalde keuze maakt
bvb
je kiest voor 1.3.1 dan zal automatisch 1.3 en 1 ook gekozen worden (dat zullen dan uiteindelijk mijn titels worden in een rapport)
je laat 1.3.1 weg dan zal 1.3 ook weggevinkt moeten worden maar NIET 1 want je koos ook voor bvb 1.2.2...
snap je hem.....
enig idee hoe ik dat geprogrammeerd krijg?
bedankt voor de hulpkeuze.jpg
 
Titel aangepast "hier kan ik geen titel bij verzinnen" zegt niets over je vraag/probleem. Zo moeilijk was het niet om de titel te verzinnen, heb gewoon een zin van jou gepakt.;)
 
Ik kan je plaatje niet bekijken/opslaan (stom Firefox probleem o.i.d.) dus ik moet er even een gokje naar slaan wat er op staat. Maar ik vermoed, dat je een keuzelijst hebt gemaakt, met daarin de verschillende opties? En dat daar dan bijvoorbeeld 1.2, 1.2.1, 1.2.2, 1.3, 1.3.1 en 1.3.2 etc. gekozen kunnen worden? En de laatste veronderstelling: afhankelijk van deze keuzes wil je selectievakjes aan- of uitzetten?
Een oplossing kan dan zijn, dat je de waarde uit de keuzelijst inleest in een matrix variabele en dan door de verschillende opties heen loopt met een loopje. Ziet er dan ongeveer zo uit:

Code:
Function Splitten()
Dim sTmp() As Variant
Dim i As Integer
Dim sCheck As String
If InStr(1, Me.Keuzelijst, ".") > 0 Then
    sTmp = Split(Me.Keuzelijst, ".")
    For i = LBound(sTmp) To UBound(sTmp) - 1
        If i = LBound(sTmp) Then
            sCheck = "chk" & i
        Else
            sCheck = sCheck & "." & i
        End If
        Me(sCheck).Value = -1
    Next i
End If
End Function

Je zou (ik weet niet precies hoe e.e.a. er uitziet) er nog voor kunnen kiezen om alle checkboxen te resetten.
 
Vrees dat het niet echt dat is....
het ziet er zowat als volgt uit:
een continuous form

1 Eigen werkzaamheden plannen.
1.1 Zich inhoudelijk over de opdracht informeren.
1.1.1 Het gepaste gereedschap kunnen nemen.
1.1.2 Het gepaste gereedschap in juiste volgorde kunnen gebruiken.
1.2 Technische informatie aadplegen en gebruiken.
1.2.1 Gegevens van materialen en gereedschappen kunnen opzoeken
1.2.2 Gegevens van materialen en gereedschappen kunnen opzoeken via pc.
1.3 De eigen werkvolgorde en – methode bepalen.
1.3.1 Een werkgang kunnen volgen.

voor elke code staat een keuzevakje
de tekst achter 1 of 1.1 of 1.2 of 1.3 zijn titels
de tekst achter codes met 2 of 3 punten zijn doelstellingen

deze doelstellingen zijn het belangrijkst en worden dus aangeduid
er zou automatisch een code moeten lopen die er voor zorgt dat, als je een doelstelling koos, je ook automatisch de titels aangevinkt krijgt

dus kies je 1.3.1 dan zou 1.3 en 1 ook gekozen moeten worden
zet je 1.3.1 uit dan zou je moeten kijken of bvb 1.3.2 ook al niet aangevinkt had want dan moeten de titels blijven staan, pas als er geen doelstelling onder 1.3 aangevinkt werd mag de titel van 1.3 ook uit..

Het is misschien wat verwarren maar het zit toch logisch in mekaar

elke record heeft 4 velden: keuze (yes/no), afdeling, code en omschrijving

Hopelijk is het nu wat duidelijker

Merci in elk geval
JP
 
Het mag voor jou logisch in elkaar zitten, dat is het toch niet.... Je hebt het namelijk over verschillende records die tegelijk moeten worden bijgewerkt. Mijn code gaat dat inderdaad niet doen, omdat die er vanuit gaat dat je binnen één record werkt. In jouw geval moet je een bijwerkquery gebruiken die op basis van de aangevinkte optie dus door alle records heen het vinkje controleert/bijwerkt. En dat is een ingewikkeld proces. Dat kan ik sowieso niet op basis van het plaatje maken, daar heb ik de db voor nodig....
 
die kan ik doorsturen als ik dat mag natuurlijk...
je kan toch een database door wandelen via

Code:
 rs.MoveFirst
    Do Until rs.EOF
        ' doe iets
        rs.MoveNext
    Loop

of zo iets
 
Laatst bewerkt door een moderator:
Dat klopt, maar het is nogal lastig om zulke specifieke code te maken zonder de db erbij. Je wilt 'm uiteraard ook kunnen testen.... Je mag een db (in 2003 format uiteraard) doorsturen.
 
Laatst bewerkt:
Kan die nog een keer met het formulier erbij?
 
Ik heb er wel even naar kunnen kijken, maar nog niet genoeg... Druk en zo! Maar ik ga vandaag weer een poging wagen.
 
is OK...
ik ben vragende partij dus... word verondersteld wat geduld te hebben
alvast bedankt
 
Voor het algemeen nut zet ik de oplossing hier neer, kunnen anderen er ook hun voordeel mee doen! Op de AfterUpdate van het keuzevakje [Keuze] zet je deze code:

Code:
Private Sub keuze_AfterUpdate()
Dim tmp As String, sF As String
Dim iKlas As Integer, sKlas As String
Dim i As Integer
Dim sq As Variant
Dim strSQL As String
Dim bCheck As Boolean
strSQL = ""
sF = ""
iKlas = Me.Parent!Combo_jaar.Value
sKlas = "AND klas" & iKlas & "=" & iKlas
sKlas = sKlas & " AND Afdeling='" & Me.Parent!keuze_afdeling.Value & "'"
If Me.Dirty Then Me.Dirty = False
Select Case Me.keuze
    Case -1
        If InStr(1, Me.code, ".") > 0 Then
            sq = Split(Me.code, ".")
            strSQL = "SELECT keuze, code from [BGV Competenties] "
            strSQL = "UPDATE [BGV Competenties] SET keuze = -1 "
            If IsNumeric(LBound(sq)) Then
                strSQL = strSQL & "WHERE ("
                For i = 0 To UBound(sq) - 1
                    sF = sF & sq(i)
                    strSQL = strSQL & "Code='" & sF & "'"
                    If i < UBound(sq) - 1 Then
                        sF = sF & "."
                        strSQL = strSQL & " OR "
                    End If
                Next i
                strSQL = strSQL & ") " & sKlas
            DoCmd.RunSQL strSQL
            If Me.Dirty Then Me.Dirty = False
            Me.Form.Requery
            Me.Form.Repaint
            End If
        End If
    Case 0
        If InStr(1, Me.code, ".") > 0 Then
            sq = Split(Me.code, ".")
            If IsNumeric(LBound(sq)) Then bCheck = True
        Else
            If IsNumeric(Me.code) Then bCheck = True
        End If
        If bCheck = True Then
            strSQL = "UPDATE [BGV Competenties] SET keuze = 0 "
            strSQL = strSQL & "WHERE ((code='" & Me.code & "' Or code Like '" & Me.code & ".*') " & sKlas & ")"
            DoCmd.RunSQL strSQL
            If Me.Dirty Then Me.Dirty = False
            Me.Form.Requery
            Me.Form.Repaint
        End If
    Case Else
End Select
End Sub

Bij Case -1 wordt de keuzelijst aangezet voor de gekozen subselectie, en Case 0 zet alle (sub)codes die bij elkaar horen weer uit.

Je kunt de code voor de keuzelijst (en Combo_Jaar ook trouwens) nog behoorlijk opfrissen. Het kosste mij behoorlijk wat tijd om goed te zien wat je aan het doen was. Op deze manier is het een stuk overzichtelijker:

Code:
Private Sub keuze_afdeling_AfterUpdate()
    
    Me.competentielijst.Form.Visible = True
    strSQL = "SELECT keuze, Titel, code, omschrijving, klas1, Afdeling FROM [BGV Competenties] WHERE klas"
    Select Case Me.Combo_jaar
        Case 1
            strSQL = strSQL & "1=1 AND Afdeling='" & Me.keuze_afdeling & "';"
        Case 2
            strSQL = strSQL & "2=2 AND Afdeling='" & Me.keuze_afdeling & "';"
        Case 3
            strSQL = strSQL & "3=3 AND Afdeling='" & Me.keuze_afdeling & "';"
        Case 4
            strSQL = strSQL & "4=4 AND Afdeling='" & Me.keuze_afdeling & "';"
        Case 5
            strSQL = strSQL & "5=5 AND Afdeling='" & Me.keuze_afdeling & "';"
    End Select
    Me.competentielijst.Form.RecordSource = strSQL
    Me.competentielijst.Form.Requery
End Sub
 
Amaai man... jij bent wel super..

Buiten de tijd die je er ongetwijfeld instak... code gaat mijn petje ferm te boven... top

Ik stak de code in afterupdate keuze van "primaire competentuies" en kreeg een foutmelding bij iKlas: combo_jaar is niet bekend...

Hoe pas ik aan?

JP
 
Michel, jammer, maar ik ontdekte een fout...
Kies voor 2 GKM

stel je kiest voor 4.1.1... dan vinken 4.1 en 4 ook aan... perfect
je vinkt 4.1.1 uit... in dit geval zouden 4.1 en 4 ook moeten uitgevinkt... maar dat gebeurt niet
Vink je 4.1 uit dan krijg je de vraag of je 7 (???) records wil veranderen... denk niet dat het kan...

Sorry

JP
 
Ik denk dat je zelf een denkfout maakt ;)
Als je de opties 4.1. 4.1.2 en 4.1.3 hebt aangevinkt, en je vinkt 4.1 uit, dan verdwijnen de vinkjes ook bij 4.1.1, 4.1.2 en 4.1.3 Verwijder je het vinkje bij 4.1.2, dan lijkt het mij, dat volgens een topdown systeem de opties 4.1.1 en 4.1.3 nog steeds geselecteerd kunnen zijn. En in dat geval (lijkt mij) moet 4.1 dus wel degelijk geselecteerd blijven. Deselecteer je 4.1, dan worden alle onderliggende vinkjes ook verwijderd, in dit voorbeeld dus 4.1.1, 4.1.2 en 4.1.3
Of hanteer jij een andere logica??
 
Nog een aanvulling: de vraag of je de query wilt uitvoeren kan optreden op het moment dat je een actiequery uitvoert (wat je ook doet). Die kun je onderdrukken door het commando
Code:
DoCmd.SetWarnings False
aan het begin van de procedur te zetten, en
Code:
DoCmd.SetWarnings True
aan het eind.
Het aantal records dat wordt aangepast is uiteraard afhankelijk van de selectie die je maakt. Als je de query in een inputbox opvraagt (tmp=InputboX("","",strSQL) kun je controleren wat-ie doet, of gedaan heeft. De inputbox toont de query zoals die wordt uitgevoerd. Die kun je kopieëren en in een nieuwe query plakken. Maar ik heb bij mij geen fouten kunnen ontdekken...

In een TopDown benadering stel je alle opties in op het niveau dat je selecteert. Kies je dus Niveau 1 (opties als 1,2,3 etc) dan worden ook alle opties daaronder, zoals 1.1, 1.1.1, 1.1.2, 1.2, 1.2.1, 1.2.2 etc. veranderd. Kies je 1.2 dan verandert alles onder 1.2, dus: 1.2, 1.2.1, 1.2.2 etc. Lijkt mij, zoals ik al zei, een logische opbouw.
Wil je in één keer alles resetten, dan kies je dus het hoofdniveau.
Wil je toch iets anders, zoals je laatste post suggereert, dan kun je dat denk ik zelf wel verzinnen aan de hand van de voorbeeldcode.
 
oei, oei, oei....
probeer eens de stappen te doorlopen die ik maakte:

Michel, jammer, maar ik ontdekte een fout...
Kies voor 2 GKM

stel je kiest voor 4.1.1... dan vinken 4.1 en 4 ook aan... perfect
je vinkt 4.1.1 uit... in dit geval zouden 4.1 en 4 ook moeten uitgevinkt... maar dat gebeurt niet, in dit concrete geval is er geen aangevinkte keuze voor 4.1.2 of 4.1.3 of wat er dan ook achter komt, dus als ik 4.1.1 uitvink zijn er op dat niviea, voor die afdeling voor dat jaar geen opties meer gekozen dus, niveau hoger moet ook uit...

of ben ik WEER eens verkeerd...

JP
 
Lees mijn vorige post nog eens door: als je 4.1.2 uitvinkt, en 4.1.1 en 4.1.4 zijn nog aangevinkt, dan moeten, in mijn beleving, 4.1 en 4 gewoon aangevinkt blijven. De lijn loopt dan namelijk nog van 4 -> 4.1 -> 4.1.1 en 4 -> 4.1 -> 4.1.3. Pas als die ook uit zijn, dan mag 4.1 en 4 worden uitgezet.... Dat gebeurt dus wel als je 4.1 uitvinkt (4.1.1, 4.1.2 en 4.1.4 worden ook uitgevinkt).
Ik zie mijn systeem als logisch, die van jou niet...
 
Overigens is er nog wel een nuttige aanpassing te verzinnen. Die is als volgt: als alle keuzes in een bepaalde laag zijn uitgezet, behalve de laatste, dan zou je kunnen bedenken dat bij het uitzetten van de laatste optie alle opties van de bovenliggende niveau's in dat hoofdstuk worden uitgezet. Misschien is dat ook wel wat je bedoelt?

Bijvoorbeeld deze situatie:
De opties 4.1.1, 4.1.2 en 4.1.3 zijn aangevinkt. Derhalve ook 4.1 en 4. Als je 4.1.2 uitzet, blijft de rest aangevinkt, want 4.1.1 en 4.1.3 zijn nog actief. Zet je 4.1.1 uit, dan blijft de rest nog steeds aangevinkt staan; omdat 4.1.3 nog aan staat, moeten 4.1 en 4 ook aan blijven. Als je nu 4.1.3 uitzet, is er geen vinkje meer actief voor het derde niveau, en moeten dus met één actie ook 4.1 en 4 worden uitgezet.

Als dit de situatie is, dan is dat op te lossen. Sterker nog: die heb ik als zodanig opgelost. Maar ik moet natuurlijk eerst weten of je dit zoekt ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan