Update query

Status
Niet open voor verdere reacties.

john64

Gebruiker
Lid geworden
12 jun 2011
Berichten
268
Goedemiddag forum,

Ik probeer via een SQL statement een bepaald veld te veranderen in visual basic. Dit veld mag niet door de gebruiker gewijzigd worden, maar wordt gewijzigd als gevolg een print-actie (een diploma mag maar één keer geprint worden; als er nog een keer geprint wordt, krijgt gebruiker een "Weet u het zeker vraag")
De basiscode heb ik laten maken door de query builder van access 2007
Code:
Public Sub WijzigPrintStatus(lngPersoonID As Long, lngRichtingID As Long, _
                    lngOnderdeelID As Long, blnGeprint As Boolean)
Dim strSQL As String
    strSQL = "UPDATE tblDiploma SET Geprint = " & blnGeprint
    strSQL = strSQL & "WHERE "
    strSQL = strSQL & "((([PersoonID]) = " & lngPersoonID & ")" & _
            " And (([RichtingID]) = " & lngRichtingID & ")" & _
            " And (([OnderdeelID]) = " & lngOnderdeelID & "));"
    CurrentDb.Execute strSQL

End Sub

Ik krijg echter een fout: De instructie UPDATE bevat een syntaxisfout

Kan iemand vertellen waar de fout zit ?

mvg
John
 
Laatst bewerkt:
Waarschijnlijk is dit beter : strSQL= strSQL & " WHERE" Dus een spatie voor where
Jan
 
Dat is niet alleen beter, dat is noodzakelijk ;)
Nu plak je twee tekstblokken tegen elkaar aan, waardoor WHERE er uitziet als TRUEWHERE of FALSEWHERE i.p.v. TRUE WHERE.
 
Hoi Jan en Michel
Bedankt voor de reactie. Deze had ik inderdaad zelf ook gezien.
Ik zag nog een foutje
Code:
    strSQL = strSQL & "SET [Geprint] = " & blnGeprint & ", "
    strSQL = strSQL & "WHERE "
De ", " achter blnGeprint was ik ook nog vergeten.

Maar ook dat geeft helaas niet het gewenste resultaat.
Ik heb ook nog blokhaken rond Geprint gezet. Ik probeer maar wat. Ik moet bekennen dat ik niet zeker weet of die blokhaken nodig zijn.
Ik zie regelmatig voorbeelden waar de blokhaken niet gezet zijn, en bij sommige weer wel. Dus wanneer ze echt nodig zijn weet ik niet.

Moet de tabelnaam misschien ook nog gemeld worden voor de diverse velden ? Dit gebeurt namelijk wel in de query builder (dus SET tblDiploma.Geprint = ...).
Ik dacht dat het niet nodig was omdat je met UPDATE-statement al naar de juiste tabel verwijst.
John
 
Laatst bewerkt:
Er hoort geen komma achter, tenzij je nog meer velden wilt instellen. Ik neem aan dat je veld Geprint een Ja/Nee veld is? Je kunt de code nog veranderen in:
Code:
    strSQL = strSQL & "SET [Geprint] = TRUE "
 
Mijn totale functie ziet er nu zo uit:
Code:
Public Sub WijzigPrintStatus(lngPersoonID As Long, lngRichtingID As Long, _
                    lngOnderdeelID As Long, blnGeprint As Boolean)
Dim strSQL As String
    On Error Resume Next
    
    strSQL = "UPDATE tblCertificaat "
    strSQL = strSQL & "SET [Geprint] = " & blnGeprint
    strSQL = strSQL & " WHERE "
    strSQL = strSQL & "[PersoonID] = " & lngPersoonID & _
            " And [RichtingID] = " & lngRichtingID & _
            " And [OnderdeelID] = " & lngOnderdeelID 
    CurrentDb.Execute strSQL
    
End Sub

De code in lokale variabelen venster ziet er na samenstelling van strSQL als volgt uit:
Code:
  : strSQL : "UPDATE tblCertificaat SET [Geprint] = Onwaar WHERE [CertificaathouderID] = 1 And [CertificatieschemaID] = 1 And [ScopeID] = 1"

Ik heb het idee dat er niets gebeurt met dit SQL statement.
Ik heb de code On Error Resume Next er bewust ingezet. Als ik deze uitcommentarieer, dan blijft het systeem hangen met melding : Er zijn te weinig parameters. Het verwachte aantal is: 1.
Er is alleen een OK button. Ik kan klikken wat ik wil, maar er gebeurt niets meer.
Ik moet dan Access afsluiten en opnieuw openen.

Er zit dus nog ergens een fout in het SQL statement, maar waar ?

Er ben er inmiddels achter dat het moet liggen in het toekennen van de variabel blnGeprint aan veld_Geprint. Als ik hardcoded TRUE of FALSE in het SQL statement zet gaat het goed. Maar als ik de blnGeprint gebruik dan blijft hij hangen. (de boolean heeft wel de juiste waarde bij binnenkomen in de functie - te zien lokale variabelen venster)

Moet er iets speciaals gebeuren met het toekennen van boolean aan een veld ?

Of heeft het iets te maken met definitie van veld Geprint als ja/nee veld en gebruik van de variabele blnGeprint als boolean? Moet een ja/nee veld als iets andere gedeclared worden ?

mvg
John
 
Laatst bewerkt:
Ik heb het tijdelijk opgelost met
Code:
    strSQL = "UPDATE tblCertificaat "
    If blnGeprint = False Then
        strSQL = strSQL & "SET [Geprint] = FALSE"
    Else
        strSQL = strSQL & "SET [Geprint] = TRUE"
    End If
    ...
maar er is vast wel een mooiere oplossing. Dit werkt in ieder geval wel
 
Het probleem ligt vermoedelijk in de manier waarop je de functie aanroept. Je hebt vier parameters die je moet invullen bij de klik op de knop: lngPersoonID , lngRichtingID , lngOnderdeelID en blnGeprint. Als je één van die parameters niet meegeeft, wordt de standaardwaarde gebruikt, en die is 0. en 0 bij een Boolean is FALSE. De query werkt dus prima alleen laat je steeds het veld op FALSE zetten. Uiteraard zie je dan niks als de waarde al FALSE is.
 
Goedemorgen Michel,
Ik heb gecontroleerd of alle aanroepen van de betrokken functie met 4 parameters gebeurd, en dat was zo, dus daar ligt het niet aan.
Ik zag ook bij de lokale variabelen dat de waarde van blnGeprint de juiste waarde had, alleen bij toewijzing aan het SQL statement ging het fout.
Het werkt in ieder geval zoals ik nu geïmplementeerd heb, ik zal er later nog eens naar kijken. Weet niet of er iets speciaals moet gebeuren met booleans, beetje in vergelijking met de aanpak van data (met CData en CDbl ).

In ieder geval bedankt weer.

mvg
John
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan