syntax error

Status
Niet open voor verdere reacties.

VB noob

Gebruiker
Lid geworden
11 feb 2009
Berichten
78
Hoi allen,

Ik probeer via een unbound selectievakje wat data van een formulier weg te schrijven naar een andere tabel dan de brontabel van het formulier.
Heb de volgende code geschreven:
Code:
If Me!SelectionButton = True Then
strCriteria = "((frmCollaring.DogID = '" & Me!DogID & "') " & _
"AND (frmCollaring.CollaringID = " & Me!CollaringID & ") " & _
"AND (frmCollaring.CollarDate = #" & Me!CollarDate & "#) " & _
"AND (frmCollaring.SampleType] = '" & Me!SampleType & "' ))"
' Build the new SQL statement incorporating the string
strSQL = "INSERT INTO tblSamples ( DogID, CollaringID, SampleDate, SampleType ) " & _
"SELECT tblCollaring.DogID, tblCollaring.CollaringID, tblCollaring.CollarDate, [Sample Types].[Sample Type] " & _
"FROM tblCollaring, [Sample Types] " & _
"WHERE " & strCriteria
DoCmd.RunSQL strSQL

Dit geeft de volgende foutmelding
Syntaxisfout. in query-express ((frmCollaring.CollaringID = 1) AND (frmCollaring.DogID = 'M003') AND (frmCollaring.CollaringDate = #03-02-2009#) AND (frmCollaring.SampleType = 'Tissue'))

Heb al verschillende dingen geprobeerd maar heb ook niet helemaal duidelijk in mijn hoofd wat nou moet verwijzen naar het formulier waar de data in staat en wat naar de tabel waar het in moet.
De foutmelding deed me eerst vermoeden dat ik een typefout of iets dergelijks maakte maar ik zie hem niet...CollarID is een nr, DogID en SampleType zijn tekst en staan dus tussen ' ' , CollarDate is een datum en staat dus tussen # #. Maar toch gaat het mis.

Iemand een idee?
 
VB noob,

Je wilt een INSERT doen van de data van je formulier in de tabel.
De "Me!" aanduidingen zijn verwijziggen naar je formulier.
In principe gebruik je:
Tablenaam.Rubriek=Form.Rubriek

De "frmCollaring." lijken op table verwijzingen, maar je tabelnaam is anders dan je hier gebruikt.
Volgens mij moeten alle "frmCollaring." worden vervangen door "tblCollaring.".
Dat kan ook een syntaxfout opleveren.

Probeer het maar eens

Succes
Wim
 
Heb hier al een poosje mee zitten klooien. Heb ook een andere manier bedacht om het te doen, met een multiselect listbox (net als in m'n andere topic) maar daar loop ik ook vast (net gepost daar).

Heb ook jouw suggesties van deze manier geprobeert.
De code is nu als volgt:
Code:
Private Sub TissueSelection_AfterUpdate()
If Me!TissueSelection = True Then
strCriteria = "((tblCollaring.DogID = '" & Me!DogID & "') " & _
"AND (tblCollaring.CollaringID = " & Me!CollaringID & ") " & _
"AND (tblCollaring.CollarDate = #" & Me!CollarDate & "#) " & _
"AND (SampleTypes.SampleType] = '" & Me!Tissue & "' ))"
' Build the new SQL statement incorporating the string
strSQL = "INSERT INTO tblSamples ( DogID, CollaringID, SampleDate, SampleType ) " & _
"SELECT tblCollaring.DogID, tblCollaring.CollaringID, tblCollaring.CollarDate, SampleTypes.SampleType " & _
"FROM tblCollaring, SampleTypes " & _
"WHERE " & strCriteria
DoCmd.RunSQL strSQL
End If
End Sub

Access gaf eerst aan dat hij nog een 'end if' verwachtte dus die ingevoegd maar nu krijg ik nog steeds een foutmelding.
Een syntaxisfout, en als ik via foutopsporing VB open dan wordt aangegeven dat de fout zit in:
DoCmd.RunSQL strSQL

Moet er een andere code dan DoCmd worden gebruikt?
 
Heb hier al een poosje mee zitten klooien. Heb ook een andere manier bedacht om het te doen, met een multiselect listbox (net als in m'n andere topic) maar daar loop ik ook vast (net gepost daar).

Heb ook jouw suggesties van deze manier geprobeert.
De code is nu als volgt:
Code:
Private Sub TissueSelection_AfterUpdate()
If Me!TissueSelection = True Then
strCriteria = "((tblCollaring.DogID = '" & Me!DogID & "') " & _
"AND (tblCollaring.CollaringID = " & Me!CollaringID & ") " & _
"AND (tblCollaring.CollarDate = #" & Me!CollarDate & "#) " & _
"AND (SampleTypes.SampleType] = '" & Me!Tissue & "' ))"
' Build the new SQL statement incorporating the string
strSQL = "INSERT INTO tblSamples ( DogID, CollaringID, SampleDate, SampleType ) " & _
"SELECT tblCollaring.DogID, tblCollaring.CollaringID, tblCollaring.CollarDate, SampleTypes.SampleType " & _
"FROM tblCollaring, SampleTypes " & _
"WHERE " & strCriteria
DoCmd.RunSQL strSQL
End If
End Sub

Access gaf eerst aan dat hij nog een 'end if' verwachtte dus die ingevoegd maar nu krijg ik nog steeds een foutmelding.
Een syntaxisfout, en als ik via foutopsporing VB open dan wordt aangegeven dat de fout zit in:
DoCmd.RunSQL strSQL

Moet er een andere code dan DoCmd worden gebruikt?

Nee de DoCmd is de juist code die je moet gebruiken.
Voeg en voor de DoCmd het volgende toe en kij goed naar het statement voor de SqL query die dan wordt weergegeven.
Code:
MsgBox strSQL

Succes
Wim
 
Hardstikke bedankt voor de tip met de MsgBox.
Het lag aan de datum waarmee ik testte 12-2-2009.
Er is iets 'raars' aan de hand met de datums.
Alle betrokken datumvelden waren ingesteld op 'korte datumnotatie' en ik heb nu ook bij alle velden een invoermasker ingesteld. Overal hetzelfde masker (99-99-0000;0;_).
Datums worden dus als dd/mm/yyyy ingevoerd.

Zolang de dag boven de 12 ligt is er niks aan de hand. 15-03-2009 bijvoorbeeld wordt aan de tabel toegevoegd.
Maar als ik 03-03-2009 (zo wordt het ingevoerd, het formulier laat het zien als 3-3-2009) krijg ik de melding: U staat op het punt om 0 rijen toe te voegen.
Dit is het geval met alle datums onder de twaalf.

Vul ik bijvoorbeeld 03-13-2009 (is foutief want moet dd/mm/yyyy zijn) dan 'vertaald' het formulier dat gelijk naar 13-3-2009.
 
Heb even gezocht maar dit is dus een bekend probleem waar wel wat oplossingen voor zijn.
Ik denk dat de region/country van de computer waar deze database op komt te zijn op amerikaans gezet zal worden.
Mijn baas is amerikaan en wilde dat sowieso al, maar ik en m'n collega nog niet. Maar nu toch maar wel denk ik...
Ontzettend bedankt voor de hulp WimenBeer!
 
Aangezien je al bijna bij de oplossing bent, heb je hier misschien niets aan, maar toch maar gepost:
Tip 1: de tip van Wim met de msgbox gebruik ik zelf tegenwoordig niet meer; ik check mijn gegenereerde sql code met een inputbox, bijv. tmp=inputbox("","",strSQL). Het voordeel hiervan is, dat je de code die je genereert kunt kopieren, en in bijv. Notepad kunt plakken. Na de foutmelding die je krijgt, als de code niet werkt tenminste, kun je een nieuwe query maken, waarin je dan geen tabel kiest, maar waar je via de knop SQL de code plakt die je uit de inputbox hebt gehaald. Vervolgens kun je dan de query op je gemakje bekijken. Vaak zie je dan veel sneller waar een fout zit!

Tip 2: Het gedoe met datums is inderdaad heel vervelend. Ik werk tegenwoordig alle datums om naar een getal, en gebruik in de query dan de opdracht CDate om het getal om te zetten naar een datum. Dit werkt feilloos, en je hebt geen last meer van Europese of Amerikaanse datums. Het werkt als volgt:

a. definieer een aantal variabelen: Datum as Date, iDatum as long.
b. Datum=cDate(me.Collardate.Value)
iDatum=Clng(Datum)
c. In de Insert statement zet je i.p.v. het datumveld SampleDate: CDate(" & iDatum & ")

De SQL string moet dus het commando Cdate(35863) laten zien in de inputbox of msgbox, als je het goed hebt gedaan.

Kijk maar of je hier wat aan hebt!

Michel
 
Laatst bewerkt:
Bedankt voor de tips Michel!
De eerste heb ik inmiddels al toegepast, stuk handiger inderdaad dat het kopieerbaar is.
Het omwerken naar een getal laat ik nog even voor wat het is. Iets te ingewikkeld voor mij om 'eventjes' te doen.
De computer waar de database opkomt staat op amerikaans dus dat gaat wel goed. Mogelijk dat ik het op mijn eigen laptop wel aanpas en dan de database op de andere comp een keer vervang.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan