Selectievakjes laten opslaan in tabel dmv query

Status
Niet open voor verdere reacties.

Tamara27

Gebruiker
Lid geworden
1 mrt 2010
Berichten
224
Ik heb een formuliertje gemaakt met verschillende combo's, tekstvakken, en selectievakjes. De combo's en tekstvakken zijn makkelijk op te slaan in mijn bestaande tabel dmv een toevoegquery, werkt prima, met de selectievakjes zit ik echter vast.:confused:

Het betreft hier 3 keuzes, een combinatie moet mogelijk zijn (groepsvak gaat dus al niet).

Ik had graag hetvolgende bereikt:
1 optie aangevinkt: 1 record wordt toegevoegd aan de tabel
2 opties aangevinkt: 2 records worden toegevoegd aan de tabel

De tabel bestaat uit 3 velden:
autonummer
unieke code (wordt gebruikt om alles te linken)
en complicaties

Ik had graag 1 record per optie, omdat het dan naderhand makkelijk is om de gegevens op te vragen, ik duw gewoon de unieke code in, en de complicaties komen vanzelf...

DE VRAAG:
Hoe kan ik deze selectievakjes laten opslaan in mijn tabellen?
Ik had zelf gedacht aan een If -statement maar ik krijg het niet klaargespeeld.
Kan iemand me mss helpen?

Alvast bedankt!
 
Zo te zien heb je een niet-gebonden formulier gemaakt, waarbij afhankelijk van de gekozen opties records worden toegevoegd aan je tabel. Klopt dat?
Je zou deze code onder een knop kunnen hangen en voor elke checkbox kunnen gebruiken:

Code:
If Me.chkBox1 = -1 Then
    With CurrentDb.OpenRecordset("Tabel")
        .AddNew
        !Code = Me.cboCode
        !Complicatie = Me.cboComplicatie
        .Update
        .Close
    End With
End If
 
Ik heb inderdaad een ongebonden formulier.
Heb hier een cmdbutton opgezet met tekst "opslaan"
de cmdbutten activeert de toevoegquery's

hieronder de vb code van de cmdbutton

Code:
Private Sub cmdAllesOpslaan_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Q_ToevoegenGegevensPatienten", acViewNormal
DoCmd.OpenQuery "Q_ToevoegenGegevensIBD", acViewNormal
DoCmd.OpenQuery "Q_ToevoegenGegevensAantasting", acViewNormal
DoCmd.SetWarnings True
MsgBox ("Alle gegevens zijn opgeslagen")
End Sub
De query is simpelweg opgebouwd: [forms]![MainForm].[txtbx] en dan toe te voegen aan tabel.

Iets gelijkaardigs in de query had ik voor de selectievakjes willen doen
Ik zal de code hierboven even proberen als ik thuis ben..

bedankt alvast!
 
Laatst bewerkt door een moderator:
Hmm, dit blijkt niet te werken...

Misschien nog een ander idee hoe ik dit kan opslaan?

nog even kort:
er zijn 3 complicaties mogelijk,
per aangeduide complicatie (met selectievakje) moet er een record toegevoegd worden aan de tabel...

-------------------------------------------------------------------------------------------------------------------------------
Bijkomend nog een vraagje:

ik heb 2 combo-boxen, afhankelijk van elkaar.
de 2de lijst wordt bepaald door de 1ste, lukt prima.
Afhankelijk van de keuze in de 2 lijst, verschijnt er een textbox (met optie visible = true)

hetgeen er dus opgeslagen moet worden in de tabel (veld Aantasting), is afhankelijk van de keuzes die gemaakt worden in combo 1 en combo 2.

hierbij de lijst van wat bij wat hoort:

- combo 1 = ongedefinieerd, dan wordt txtOngedefinieerd opgeslagen in de tabel
- combo 1 = crohn, dan wordt cmbAantasting opgeslagen in de tabel
- combo 1 = Colitis Ulcerosa, dan zijn er 2 mogelijkheden: als combo 2 dan "pancolitis" is, wordt cmbAantasting opgeslagen in de tabel. Is combo 2 "aantal cm" dan wordt txtAantalCm opgeslagen in de tabel

ik heb volgende code proberen samen te stellen maar het werkt niet.
vooral dan de laatste stap gaat niet. Ik kan me wel voorstellen dat ik iets fout gedaan heb, misschien iemand die het ziet?

Code:
If ([cmbIBD] = “Ongedefinieerd”;[Forms]![GegevensInvoeren].[txtOngedefinieerd];
If([cmbIBD] = “Crohn”;[Forms]![GegevensInvoeren].[cmbAantasting];
If ((AND([cmbIBD]=”Colitis Ulcerosa”,[cmbAantasting]=”Aantal Cm”));[Forms]![GegevensInvoeren].[txtAantalCm],[Forms]![GegevensInvoeren].[cmbAantasting]))))
 
Kun je weer een voorbeeldje posten? Want ik denk nog steeds dat het niet zo moeilijk is...
 
Hierbij mijn (lege) databank... ik probeer de knopjes enzo altijd uit met fictieve gegevens omdat ik met patiënten gegevens werk...

Hetgeen voorlopig nog een struikelblok is:

- ik kan de selectievakjes niet opslaan in de desbetreffende tabellen (voor elk selectievakje dat wordt aangeduid zou er een nieuw record moeten gemaakt worden in de tabel)

- als ik in het tabje "behandeling" van het formulier GegevensInvoeren meerdere behandelingen kies, wordt ook enkel het 1ste rijtje opgeslaan (misschien ergens iets over het hoofd gezien?)


Ik begrijp best dat de databnk voor jullie misschien niet al te veel "sense" maakt, dus laat maar weten als er vragen zijn...

Alvast heeeeeel erg bedankt!
 
Laatst bewerkt:
Hoi Tamara,

De db is niet helemaal abacadabra voor mij; ik heb zo'n acht jaar in een ziekenhuis gewerkt (al was dat niet medisch...). Gelukkig zitten er wat probleempjes in die niks met medisch te maken hebben ;)
Om te beginnen: je hebt voor de Keuzeopties radiobuttons gebruikt. Dat zou ik (al is het technisch wel mogelijk) niet doen, omdat optierondjes meestal gebruikt worden in combinatie met elkaar, om de gebruiker de mogelijkheid te geven om één optie te kiezen uit een aantal. Als je dus een optie aanklikt, moet een eerder gekozen optie worden uitgezet. Je kiest dus altijd maar één optie uit een groep. Doorgaans gebruik je optierondjes dus gegroepeerd, waarbij elke optie een eigen waarde krijgt. Deze waarde lees je dan uit, en afhankelijk van die waarde gebeurt er dan iets op het formulier. In jouw geval wil je meerdere opties laten kiezen, en dan zijn Selectievakjes dus beter. Deze zet je aan, of je zet ze uit, onafhankelijk van andere mogelijkheden. Ook voor de gebruiker(s) van de db is dat duidelijker, want het is een algemene gewoonte in de pc wereld om gebruikers bij meerdere opties selectievakjes aan te bieden, en bij één keuze uit een aantal Optierondjes.

Welke optie je ook gebruikt, je moet wel een waarde uitlezen uit de aangeboden mogelijkheden. En dat doe je dus niet. Sterker nog: je hebt op de optierondjes geen waarde ingesteld... je kunt ze dus ook niet uitlezen! En daarom doet de query het dus o.a. niet.
Een tweede reden dat je structuur niet werkt, is dat de knop elke macro maar één keer uitvoert. Dat moet echter afhankelijk worden gemaakt van de gekozen opties.
De aanpassing die ik nu aan het maken ben, is dus de volgende:
1. Ik zet alle Optierondjes om naar Selectievakjes
2. Achter de knop Opslaan komt een routine die alle selectievakjes uitleest, en afhankelijk daarvan de query uitvoert (met de gekozen waarde uiteraard)
3. Ik heb je Wis knop aangepast, zodat hij nu met één commando alle (tekst)vakken wist.

Als de db klaar is, zet ik hem hier uiteraard weer terug!

Kun je nog aangeven hoe de selectievakjes worden gebruikt? Want ik zie ze niet terug in de queries...
 
Laatst bewerkt:
Voor de selectievakjes had ik nog geen query ofzo gemaakt.
bedoeling is dat voor elk gekozen vakje, een nieuw record gemaakt wordt.
Voor "complicaties" komt dat in de tabel "complicatie"
Voor "extra-intestinale aandoeningen", in de gelijknamige tabel.
In die tabellen worden enkel de unieke nummer en de complicaties opgeslagen, maar aangezien ik tot nu toe nog niet wist hoe ik dit moest klaar krijgen... :-)

alvast heeeeel erg bedankt voor de hulp!!!
 
Ik denk dat het wel duidelijk is... Zal er vanavond weer verder mee stoeien!
 
Als je me zegt hoe ik dit kan verwezelijken, wil ik het gerust zelf even proberen :-)
 
Je moet met een loopje door je keuzevakjes heenlopen, en steeds bij de juiste waarde de query uit laten voeren. Al zou ik er zelf geen query aan opofferen, maar de hele code via een Recordset doen.
Beetje vaag, maar ik heb vanavond wel tijd om er een voorbeeldje van te maken!
 
In de tussentijd kun je eens kijken hoe het werkt...
Ik heb twee dingen aangepast, behalve wat ik al eerder heb aangegeven (selectievakjes i.p.v. optierondjes)
Ten eerste natuurlijk de code om de gekozen keuzes op te slaan in de tabel. Ten tweede: een andere manier om het formulier leeg te maken. I.p.v. alle vakjes, keuzelijsten etc. met name te noemen en leeg te maken, kun je ook met een loopje door alle controls heenlopen, en de juiste controls leeg maken. Dat scheelt ook een hoop code...
 

Bijlagen

Dank je wel!
Ik ga het morgen eens op mijn gemakje bekijken :)

alvast heeeeel erg bedankt!!
 
Beste Michel

Ik heb eens op mijn gemakje naar je aanpassingen gekeken, alvast heel erg bedankt!
De code om te wissen is inderdaad een heel pak korter (niet moeilijk met zo'n beginnerscode die ik gemaakt had... ) Ik heb deze uiteraard ook toegepast in mijn databank met gegevens.

Wat ik niet gedaan heb, is je aanpassing van de unieke code, naam en voornaam;
het is namelijk zo, dat het hier over de invoer gaat :) en dat ze in dit scherm niks kunnen kiezen / aanpassen. Dat komt later nog :)

De code voor de selectievakjes, hmm, dat vind ik precies wat moeilijkere materie :)
(zo'n leek als ik... )

kan je me mss n beetje uitleg geven hierover?

Code:
Private Sub Knop233_Click()
Dim sTabel As String
Dim sAandoening As String

    For Each ctl In Controls
        With ctl
            Select Case .ControlType
                Case acCheckBox
                    If .Value = -1 Then
                        sTabel = .Tag
                        sAandoening = Mid(.Name, 6, Len(.Name) - 5)
                        On Error Resume Next
                        With CurrentDb.OpenRecordset(sTabel)
                            .AddNew
                            .Fields(1) = Me.[Unieke Code]
                            .Fields(2) = sAandoening
                            .Update
                            .Close
                        End With
                    End If
                Case Else
            End Select
        End With
    Next ctl

''GegevensComplicaties
''GegevensEIAandoeningen
End Sub

mijn vraagjes hier:
1. die sAandoening, voor wat staat die precies?
2. deze regel zegt me niks: sAandoening = Mid(.Name, 6, Len(.Name) - 5)
wat voor functie heeft deze?
3. ' ' staat vast voor het feit dat hier hetzelfde moet gebeuren als in de hogere code?

Sorry voor de vele vragen, het is maar zo dat ik uiteindelijk wel moet kunnen uitleggen wat ik gedaan heb, aangezien niemand anders er mee bezig geweest is :)


alvast heel erg bedankt voor je hulp! ik ben er echt blij mee!
 
Hoi Tamara,

Vraagje drie snap ik niet helemaal, want ik heb in de code volgens mij nergens " " staan... Wel staan er boven de End Sub twee regels die gemarkeerd zijn als commentaar (groene regels) die weg mogen. Die heb ik tijdelijk gebruikt om de namen van de tabellen te lezen.

Wat er verder gebeurt, is op zich niet moeilijk, al moet je het natuurlijk wel bedenken ;)
Puntje 1:
Ik werk vaak met Variabelen, waar je bepaalde gegevens in kunt stoppen. In dit geval zijn er twee: sTabel en sAandoening. Met de beginletter s geef ik dan aan dat het om tekstvariabelen gaat, maar dat blijkt ook al uit de Declaratieregel aan het begin.

Het moeilijkste stuk zit 'm in de rest van de constructie, denk ik.
Allereerst heb ik ook een variabel voor de Controls gemaakt. Die staat in het algemene deel, omdat deze variabel vaker terug komt. (Dim ctl As Control)
Vervolgens loop ik door de hele range aan controls heen met een loopje.
For Each ctl in Controls.
Daarna wordt van elke control gecontroleerd wat het is, en eventueel de waarde:
With ctl
Select Case .ControlType

Omdat ik alleen de Checkboxen wil opslaan, staat de uit te voeren code bij de Case acCheckBox:
Eerst wordt de Veldnaam opgehaald uit de naam van de checkbox. Dat gebeurt met die variabele sAandoening. Omdat de naam van de keuzelijst bestaat uit de tekst 'keuze' en de veldnaam, moet het woord 'keuze' uiteraard worden gestript. Dat doe je met de functie Mid.

sAandoening = Mid(.Name, 6, Len(.Name) - 5)
Oftwel: haal uit de veldnaam de tekst op vanaf positie 6. (keuze i 5 tekens).

In een eerder stadium is de Tabelnaam al opgehaald, en toegevoegd aan de variabele sTabel. Vreemd genoeg vraag je daar niks over; was dat wel duidelijk? Zo niet: als je naar de checkboxen kijkt, dan zie je dat elke checkbox bij de eigenschap <Extra info> op het tabblad <Overig> de tabelnaam staat. Die tabelnaam wordt opgehaald met de opdracht
sTabel = .Tag
Dus nu hebben we de tabelnaam, en we hebben de veldnaam. Kortom: we kunnen en record gaan toevoegen! En dat gebeurt in het volgende stuk: de tabel wordt geopend, er wordt met AddNew een record toegevoegd, en aan de betreffende velden (hier genummerd, maar je mag uiteraard ook de veldnamen gebruiken) wordt de juiste waarde toegevoegd.
En vervolgens wordt alles netjes gesloten, en begint de lus van voren af aan, tot alle controls zijn langsgeweest.
Duidelijker zo?
 
voorlopig wel!
Ik ga het meteen eventjes uitproberen.
ik heb namelijk nog hier en daar wat toepassingen bijgevoegd, als ik het aan het draaien krijg, heb ik het dus begrepen :)

ik veronderstel dat ik op ongeveer dezeflde manier (mits hier en daar wat wijzingen) dit ook kan toepassen voor het opslaan van meerdere comboboxen in een veldje (zie bijv tab behandelingen?)

fel bedankt!!!
 
Ik vrees dat ik te hard geroepe heb :)
het stukje van de selectieknopjes werkt, waarvoor al veel dank :)
maar de unieke code zelf wordt niet opgeslagen in de tabellen.

Code:
With CurrentDb.OpenRecordset(sTabel)
                            .AddNew
                            .Fields(1) = Me.[Unieke Code]
                            .Fields(2) = sAantasting
                            .Update
                            .Close
                        End With

ik dacht dat hiermee ook de unieke code opgeslagen zou worden... bij mij dus niet het geval.

sorry voor de last hoor ...
ik vrees dat dit echt te hoog gegrepe was voor mij :-)
maar 1 x ik er aan bezig ben... ben ik wel gefascineerd, en wil ik weten hoe dit wél kan...
 
Is uiteraard geen last...
Het opslaan met behulp van de code die ik heb aangeleverd, zou bij jouw voorbeeld niet kunnen werken als de velden niet kloppen. Als je namelijk uit een recordset een veld toewijst, begint de telling met 0. Dus een code als: .Fields(1)=Me.[Unieke code] zet de formulierwaarde [Unieke code] in het tweede veld van de tabel, niet de eerste... Misschien dat het probleem daar zit?
 
Neen, dit klopt wel. Want de aantasting en complicatie gaat ook in de juiste kolom. Geen fout daar dus.
ik had al gedacht dat het misschien aan de naamgeving lag?
bij mij noemt het tekstveld van de unieke code gwn txtUniekeCode
dit heb ik dan eens ingegeven, geen verandering.

het is wel zo, dat bij de extra info (bij eigenschappen - overige) bij de complicaties en aandoeningen, verwezen wordt naar de tabellen waar de gegevens inkomen.
De unieke code, staat enkel op het tabblad Persoonlijke gegevens en hier staat geen extra info bij, aangezien deze in meerdere tabellen opgeslagen moet worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan