Dynamische vragen stellen

  • Onderwerp starter Onderwerp starter btl
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

btl

Gebruiker
Lid geworden
9 dec 2004
Berichten
32
Dag,

Voor het ophalen van maatwerk gegevens heb ik een "slimme" vragenlijst gemaakt. Afhankelijk van het antwoord ga ik dieper in op een onderwerp of juist door naar een ander.
Bijvoorbeeld:
vraag 1. eet je iedere dag fruit
bij nee: vraag 2. vind je fruit niet lekker etc.
bij ja: naar vraag 5. eet je iedere dag groente

De vragen en volgorde heb ik al ontworpen. De vragen, de antwoorden en de "route" staan nu in separate tabellen. Tevens heb ik 1 tabel waarin ik alle gegevens wil wegschrijven. Dus per vraag ja, nee of niks invullen (want bij vraag 1 "Ja" leidt tot niet invullen 2, 3 en 4).

Dit alles moet in een overzichtelijk formulier komen, waarbij alleen relevante vragen getoond worden. In een andere aanpak (waarbij ook informatie-afhankelijk vervolgvragen worden gesteld) heb ik gebruik gemaakt van niet-afhankelijke keuzelijsten met daaronder een gebeurtenisprocedure als volgt:
Private Sub Keuzelijst4_Click()
Me.Keuzelijst6.Requery
Me.Keuzelijst6.Value = ""
Me.Keuzelijst8.Requery
Me.Keuzelijst8.Value = ""
Me.Keuzelijst89.Requery
Me.Keuzelijst89.Value = ""
Me.Keuzelijst91.Requery
Me.Keuzelijst91.Value = ""
Me.Keuzelijst93.Requery
Me.Keuzelijst93.Value = ""
Me.Keuzelijst95.Requery
Me.Keuzelijst95.Value = ""
End Sub

Nu werkt dit niet (meer) voor de huidige toepassing...iemand ideeën hiervoor? Wellicht is er vanuit een ander onderwerp (nog niet kunnen vinden na enkel uren zoeken) een oplossing/idee voor.

Alvast bedankt!
 
Het helpt met zoeken als je zelf iets hebt bijgedragen aan een eerder topic; ik vond in ieder geval met een paar minuten een db die ik vorig jaar voor iemand heb gemaakt ;) Al was die, nu ik er een jaar later op terugkijk, niet helemaal jofel gemaakt. Dus ik heb er vanavond nog even aan gesleuteld :)

Deze enquête gebruikt één tabel voor de vragen en antwoorden; op basis van het gekozen antwoord wordt de volgende vraag in de tabel opgezocht. Op die manier kun je een oneindig aantal vragen verzinnen, en die via de antwoorden routeren. De antwoorden worden bij elke vraag opgeslagen in een daarvoor bedoelde tabel. Tevens wordt er gecontroleerd of de geênqueteerde de vragenlijst al heeft ingevuld of niet.

Kijk maar eens of je er wat aan hebt...
 

Bijlagen

bijna goed...

Bedankt voor deze voorbeeld dbase, daar ben ik een heel eind verder mee gekomen. Ik heb de vba behoorlijk kunnen aanpassen aan mijn doel en benamingen, maar natuurlijk lukt 1 onderdeeltje niet.

Ik wil (moet) de benaming aanpassen in onderstaande code. Normaal gesproken zou ik proberen een work-around te vinden en jouw namen gebruiken, maar we hebben straks meerdere vragenlijsten naast elkaar draaien... Ik snap niet helemaal hoe deze code werkt en in verschillende tabellen en kolommen "kijkt" en wegschrijft...

De code heb ik als volgt (natuurlijk foutief) aangepast:

OpnamenummerID = Opnamenummer.Value
strSQL = "SELECT * FROM tbl_Antwoorden WHERE Opnamenummerantw = " & OpnamenummerID
With CurrentDb.OpenRecordset(strSQL)
If .RecordCount > 0 Then
msg = "Eerdere antwoorden op deze Enquête met ID " & OpnamenummerID & " worden gewist; doorgaan?"
If MsgBox(msg, vbYesNo, "Opname") = vbNo Then Exit Sub
strSQL = "DELETE FROM tbl_Antwoorden where Opnamenummerantw = " & OpnamenummerID
CurrentDb.Execute strSQL
End If
.Close
End With
Form_frm_Vragen.Visible = True
Form_frm_Vragen.Opnamenummer = OpnamenummerID
Form_frm_Vragen.SetFocus

Opnamenummer wordt aangemaakt in de tabel Locatie (bij jou Survey) en weggeschreven in de tabel Antwoorden (Survey_answers bij jou)...

is dit duidelijk genoeg of maak ik het alleen erger!?!? alvast bedankt!
 
Waar loopt hij spaak? Gebeurt er niks, of krijg je bij Foutopsporing een gele regel? Maak overigens je code op de met de CODE tag (knop #), dan is-tie leesbaarder...
 
Bij foutopsporing geeft hij een "Compileerfout: ongeldige kwalificatie". Opnamenummer in het deel Opnamenummer.Value wordt dan (blauw) geselecteerd. Er is inderdaad ook een gele regel en wel deze:

Private Sub Knop11_Click()


Begrijp eerlijk gezegd ook niet direct waar deze regel (OpnamenummerID = Opnamenummer.Value) voor dient. Waarom wordt er een ID toegevoegd aan Opnamenummer? Om het uniek te maken in de formule?
 
Laatst bewerkt:
OpnamenummerID is een variabele. Misschien heb je de regel Option Explicit helemaal bovenin je module staan, en heb je de variabele niet gedeclareerd. In dat geval moet je in de procedure nog deze regel opnemen:

Code:
Dim OpnamenummerID As Long
 
Genoemde regel komt niet voor....

Heb net mijn vorige reactie nog iets aangepast.
De regel OpnamenummerID = Opnamenummerantw.Value werd geel.
Wanneer ik daar "antw" tussenuit haal (antw had ik toegevoegd aan de kolomnaam in de tabel tbl_Antwoorden) krijg je de Compileerfout genoemd in mijn vorige reactie.
 
Ik raad je aan om altijd je variabelen te declareren; dat werkt uiteindelijk een stuk prettiger, omdat je dan ook beter in de hand hebt welke waarden in welk soort variabele worden opgeslagen.
Ik vermoed dat je met Opnamenummer.Value naar een niet-bestaand element op je formulier kijkt. Omdat ik deze db ook niet zelf heb gemaakt, heb ik de code maar marginaal aangepast; daar waar hij werkte heb ik het zo gelaten, vandaar ook de variabelen zoals ze in het voorbeeld staan; zelf zou ik ze heel anders noemen.

Maar om een waarde uit een formulier te lezen, begin ik altijd met Me. (inclusief de punt dus) en daarna typ ik de naam van het (object)veld dat ik verwacht. Bij een keuzelijst, die ik altijd met cbo laat beginnen, typ ik dus: Me.cbo, waarna ik netjes de lijst met alle keuzelijsten zie. Op die manier werkend maak je nooit meer een typfout als je een formulier opbject nodig hebt. Kijk dus op deze manier of je wel het goede opbject uitleest en aan de variabele toewijst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan