Query werkt wel in Access maar niet met VBA

Status
Niet open voor verdere reacties.

Kuifje1966

Nieuwe gebruiker
Lid geworden
24 jul 2015
Berichten
3
Hallo,

Ik ben een database voor de judoclub aan het knutselen en will met een query met een click-gebeurtenis uit een formulier uit laten voeren. Deze query moet een tabel met bepaalde gegevens vullen. Deze gegevens staan wederom in verschillende andere tabellen. Doel is uiteindelijk, dat ik een bericht will laten maken, waarin de weegtijden van de judoka's voor een bepaald toernooi op een bepaalde dag staan. Verdere informatie op de "weegbrieven" is de plaats van het toernooi en de coach, die de judoka's begeleid.

Nu heb ik een query aangemaakt, waar ik een bepaald toernooi en een bepaalde Datum kies. Dat werkt allemaal perfect. De query vuld de tabel zoals het hoord.

In VBA heb ik een SQL-string geschreven, waarvan ik dacht, dat'ie zal werken (een soortgelijke heb ik op een online-cursus gevonden). Vantevoren had ik in de SQL-string ook maar een bepaald toernooi en een bepaalde datum staan. Maar omdat ik deze twee gegevens dynamisch will hebben en de gebruiker de codering niet steeds moet wijzigen, probeer ik dat via een formulier te doen. Daarbij wordt het toernooi uit een combinatieveld gekozen (cboToernooi) en de datum in een textveld ingevoerd (txtDatum). Daarna moet de gebruiker op een knop drukken en de toevoegquery zal moeten worden uitgevoerd. En dat werkt dus niet. De lijst blijft leeg. Wat doe ik fout?

Dit is de code, zoals ik die nu heb:
Code:
Private Sub cmdWeegbrieven_Click()

Dim strSQL As String

'Heeft de gebruiker alle gegevens ingevoerd?
If Nz(Me.cboToernooi) = "" Then
    MsgBox "Kies a.u.b. een toernooi!", vbInformation
    Me.cboToernooi.SetFocus
    Exit Sub
    End If
If Nz(Me.txtDatum) = "" Then
    MsgBox "Voer a.u.b. een datum in!", vbInformation
    Me.txtDatum.SetFocus
    Exit Sub
    End If

DoCmd.SetWarnings False
DoCmd.Close acTable, "tblWeegbrieven"
DoCmd.OpenQuery "qryWeegbrievenLeeg"
strSQL = "INSERT INTO tblWeegbrieven ( toe_id_f, toe_naam, toe_club, toe_zaal, toe_straat, toe_postcode, toe_plaats, jud_voornaam, jud_tussenvoegsel, jud_naam, wee_datum, wee_begin, wee_einde, coa_voornaam, coa_naam, coa_telefoon ) " & _
         "SELECT tblToernooi.toe_naam, tblWeegtijd.toe_id_f, tblToernooi.toe_club, tblToernooi.toe_zaal, tblToernooi.toe_straat, tblToernooi.toe_postcode, tblToernooi.toe_plaats, tblJudoka.jud_voornaam, tblJudoka.jud_tussenvoegsel, tblJudoka.jud_naam, tblWeegtijd.wee_datum, tblWeegtijd.wee_begin, tblWeegtijd.wee_einde, tblCoach.coa_naam, tblCoach.coa_voornaam, tblCoach.coa_telefoon " & _
         "FROM (tblToernooi INNER JOIN tblCoach ON tblToernooi.toe_id = tblCoach.toe_id_f) INNER JOIN (tblJudoka INNER JOIN tblWeegtijd ON tblJudoka.jud_id = tblWeegtijd.jud_id_f) ON tblToernooi.toe_id = tblWeegtijd.toe_id_f " & _
         "WHERE (((tblWeegtijd.wee_datum) = " & fcDatSQL(Me!txtDatum) & ") AND ((tblToernooi.toe_naam) = '" & Me.cboToernooi & "'));"
DoCmd.RunSQL strSQL
DoCmd.OpenTable "tblWeegbrieven"
End Sub

Ik moet zeggen, dat ik nog aan het begin van mijn "programmeercarriëre" sta en dit mijn eerste uitdaging is. Ik heb wat boeken en informatie op het WWW vergaard maar het lukt me niet, het probleem op te lossen. :confused:

Groetjes,

Peter
 
Laat ik beginnen met zeggen dat je een totaal overbodige actie uitvoert. Selecties hoef (nee: moet) je niet apart op te slaan. Daar zijn het queries voor. Wat jij nu doet is dus dubbelop. En in database begrippen is dat een grote NoNo. Dus je doet dit puur op grond van het leermoment, vermoed ik :).
Aan je query zie ik niet zo heel veel spannends, behalve dit: fcDatSQL(Me!txtDatum). Dat zal vast een eigen functie zijn om een datum te converteren. En wellicht gaat het daarop fout. Moeilijk te zeggen zonder dat ik de database zie.
Wat je kunt proberen is de query af te vangen in een string, en die in een nieuwe query te plakken. Dan zie je gelijk waar het fout gaat.
Code:
Dim tmp
tmp=inputbox("","",strSQL
 
Hallo OctaFish,

Heel hartelijk bedankt voor de tip met de MsgBox. Hierdoor heb ik idd. snel gezien, waar het fout liep. Ik heb enkel de WHERE-regel een beetje aangepast en bij he combinatieveld een colom-verwijzing toegevoegd:

Code:
... AND ((tblToernooi.toe_naam) = '" & (Me!cboToernooi.Column(1)) & "'));"

Het volgende probleem was dan, dat in het veld [tblWeegbrieven.toe_naam] de waarde van de foreign key [toe_id_f] stond. Dat lag simpelweg aan de verkeerde volgorde van deze velden in de INSERT INTO-regel. Naardat ik dat had veranderd, kreeg ik eindelijk datgene, wat ik had verwacht.

Ik begrijp heel goed, dat ik volgens jou met mijn codering een NoNo heb gefabriceerd (was me niet bewust). Zoals geschreven, ben ik aan het begin van mijn "programmeursloopbaan" en gebruik ik onze judoclub als "proefkonijn". Alles wat ik tot nu toe heb geschreven is autodidactisch gebeurd. Ik had de codering bij een internet-cursus opgepikt en toegepast. Het leek me logisch om op deze manier data uit verschillende tabellen in een nieuwe tabel (die elke keer leeg gemaakt en met de nieuwe gegevens gevuld wordt) op te slagen en ter controle in een subformulier te pakken alvorens via een bericht de weegbrieven te printen. Ik wist het dus niet anders. Als dat anders kan, wat ik nu wel begrepen heb, zou ik graag willen weten hoe.

Door de fouten die je maakt, leer je het meeste omdat dat immers in je geheugen blijft hangen. :)

Nogmals heel hartelijk bedankt! :d

Groetjes,

Peter
 
Je hebt al wat je nodig hebt; de query die je nu gebruikt om de tabel te maken bevat namelijk, als je er een gewone selectiequery van maakt, exact dezelfde informatie als je tabel. En dát is dus een klassiek voorbeeld van dataredundantie! Ook dat je aangeeft dat de tabel elke keer weer leeggemaakt wordt en opnieuw gevuld geeft al aan dat hij niet nodig is.
Kijk eens naar de cursus Access in de handleidingen sectie; die behandelt hoe je een database op moet zetten. Inclusief normaliseren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan