Berekening uitvoeren met waarde in een tabel

Status
Niet open voor verdere reacties.

Woodshoe

Gebruiker
Lid geworden
2 feb 2011
Berichten
13
Hallo kenners,

na van alles geprobeerd te hebben blijf ik met het volgende probleem zitten:

Ik heb een formulier gemaakt t.b.v. een interne enquete. In dit formulier wordt antwoord gegeven op een aantal vragen met 'Ja' of 'Nee': Een 'Ja'-antwoord geeft waarde 0 en een 'Nee'-antwoord geeft waarde 1.
Deze resultaten moet ik vermenigvuldigen met een 'wegingsfactor' die ik in een verder ongerelateerde tabel heb gezet: velden zijn [vraag] en [wegingsfactor] Ik heb ze in een tabel gezet i.v.m. mogelijke toekomstige aanpassing van de wegingsfactoren.

Het lukt mij niet om dit voor elkaar te krijgen. Ik weet niet hoe ik de juiste wegingsfactor (record in de tabel) met het overeenkomstige antwoord kan koppelen.
Het lukt me wel in een query maar dan kan ik niet het gegroepeerde rapport maken dat moet volgen. Dat schijnt niet te kunnen met subqueries.

Wie weet een antwoord?
 
Ik snap het probleem niet helemaal; hoe heb je de berekening dan gemaakt? En hoeveel records heb je in je wegingstabel?
 
In het formulier staan 6 vragen waarop Ja (=0) of Nee (=1) geantwoord kan worden. De resultaten worden via een toevoegquery in een Resultatentabel gezet, hoofdbron voor de rapportages.
In mijn tblWegingsfactoren staan ook 6 records;
vraag wegingsfactor
vraag8 4
vraag9 5
vraag10 3
vraag11 2
vraag12 3
vraag13 3

De veldnamen van de verschillende vragen zijn dezelfde als de namen in de records van de tblWegingsfactoren.
Het is dus de bedoeling dat het antwoord op vraag8 wordt vermenigvuldigd met de bijbehorende wegingsfactor (4 dus). [vraag8] * [wegingsfactor] Dàt lukt mij niet. Niet in Formulier of Rapport.
 
Ik zie niet hoe je de berekening met een subquery maakt; dat is namelijk helemaal niet nodig... En me een normale selectiequery kun je ook je rapport normaal opmaken.
 
Als ik de berekening in een query uitvoer en die vervolgens als bron gebruik voor mijn rapportage krijg ik een foutmelding in de trant van: " meer dan één GROUP BY-component is niet mogelijk met een subquery" De berekening wordt uitgevoerd middels een SELECT, FROM, WHERE regel, waardoor dit probleem ontstaat.
Ik heb het ook middels DLookup geprobeerd, maar ook dat lukt niet terwijl ik precies te werk ga zoals volgens de help-functie zou moeten.

Als je een concreet antwoord hebt, graag!

André
 
ALs je een voorbeeldje kunt posten in 2003 format, kijk ik er wel even naar.
 
Michel,

ik weet niet hoe ik een voorbeeldje moet posten, maar onderstaande code heb ik geschreven om een tekstvak te vullen.
De eerste Private Sub werkt prima, maar de andere tekstvelden, met allemaal hun eigen gebeurtenisprocedure, worden toch gevuld met dezelfde waarde. Als voorbeeld heb ik de tweede gebeurtenis toegevoegd. Hij lijkt alsof de string 'vraag' altijd "vraag8" blijft.

Private Sub cbxOntvangst_AfterUpdate()
Dim Factor As Integer
Dim vraag As String

vraag = vraag8
Factor = DLookup("[tblWegingsfactor.wegingsfactor]", "[tblWegingsfactor]", "[tblWegingsfactor.vraag] = vraag")
[txtScore8] = [cbxOntvangst] * Factor

End Sub

Private Sub cbxAfspraak_AfterUpdate()
Dim Factor As Integer
Dim vraag As String

vraag = vraag12
Factor = DLookup("[tblWegingsfactor.wegingsfactor]", "[tblWegingsfactor]", "[tblWegingsfactor.vraag] = vraag")
[txtScore12] = [cbxAfspraak] * Factor
End Sub
 
Ik begin zo langzamerhand te geloven dat ik de enige ben op aarde die met een grote boog om DLoopup heenloopt....
Probeer dit eens?

Code:
Option Compare Database
Option Explicit
Dim Factor As Integer
Dim vraag As String
Dim strSQL As String

Code:
Private Sub cbxOntvangst_AfterUpdate()
    vraag = Me.Vraag8
    strSQL = "SELECT wegingsfactor FROM tblWegingsfactor WHERE vraag ='" & vraag & "'"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 1 Then
            Me.Factor = .Fields(0).Value
        End If
        .Close
    End With
    Me.txtScore8 = Me.cbxOntvangst * Factor
End Sub

Code:
Private Sub cbxAfspraak_AfterUpdate()
    vraag = Me.vraag12
    strSQL = "SELECT wegingsfactor FROM tblWegingsfactor WHERE vraag ='" & vraag & "'"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 1 Then
            Me.Factor = .Fields(0).Value
        End If
        .Close
    End With
    Me.txtScore12 = Me.cbxAfspraak * Factor
End Sub
 
Michel,

"Ik begin zo langzamerhand te geloven dat ik de enige ben op aarde die met een grote boog om DLoopup heenloopt...."
Vandaar deze 'typo' (Dloopup) LOL!

Ik snap nog niet veel van de code, maar hij werkt wel! En uiteraard ga ik verder met studeren.
Voor jou informatie: ik heb Me. in zowel Me.vraag als Me.Factor weg moeten laten en vraag8 moeten voorzien van aanhalingstekens (")

Code:
Private Sub cbxOntvangst_AfterUpdate()
vraag = "Vraag8"
strSQL = "SELECT wegingsfactor FROM tblWegingsfactor WHERE vraag ='" & vraag & "'"
With CurrentDb.OpenRecordset(strSQL)
If .RecordCount = 1 Then
Factor = .Fields(0).Value
End If
.Close
End With
Me.txtScore8 = Me.cbxOntvangst * Factor
End Sub

Nietemin hartelijk dank natuurlijk; je hebt me op het goede spoor geholpen.
 
Dan heet je formulierveld anders.... Als vraag8 de feitelijke veldnaam is, dan kan de sql nog wat simpeler:

Code:
strSQL = "SELECT wegingsfactor FROM tblWegingsfactor WHERE vraag ='vraag8'"

Ik ging er vanuit dat je een waarde uit formuliervelden ophaalde. Meestal haal je in je vba een waarde op uit een tekstvak, en daar gebruik ik dan meestal een variabele voor (al hoeft dat niet). Vandaar mijn aanpak. Overigens hoeft dat inderdaad niet.... En blijkbaar gebeurt ook het terugzetten naar een teksvak met een andere naam ;)

Jaja, die LoepdieloepUp!!!! Ik word er zowaar vrolijk van :P

Als je veel berekeningen hebt, kun je er beter een functie van maken, dat houdt e.e.a. wat overzichtelijker. Dan ziet het er zo uit:

Code:
Private Sub cbxOntvangst_AfterUpdate()
    vraag = "Vraag8"
    Me.txtScore8 = Me.cbxOntvangst * WaardeScore(vraag)
End Sub

En de berekening:

Code:
Function WaardeScore(Veld As String) As Integer
    strSQL = "SELECT wegingsfactor FROM tblWegingsfactor WHERE vraag ='" & Veld & "'"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 1 Then
            WaardeScore = .Fields(0).Value
        End If
        .Close
    End With
End Function

Mocht je je afvragen waarom mijn code er zoveel mooier uitziet: gebruik de CODE tag (knop #)
 
Laatst bewerkt:
Bedankt voor alle info. Heb de knop "geavanceerd" ook gevonden.
Gaat van nut zijn.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan