Mai 17, 2021, 10:59:53

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Syntaxfehler in SQL Insert Into

Begonnen von TerraAOC, Mai 04, 2021, 15:02:57

⏪ vorheriges - nächstes ⏩

TerraAOC

Mai 04, 2021, 15:02:57 Letzte Bearbeitung: Mai 04, 2021, 15:11:31 von TerraAOC
Guten Tag alle zusammen!
Ich habe das in meinem Formular stehen
Private Sub btnTestSQLInsert_Click()
    Dim TestSQL As String
    Dim db   As DAO.Database
   
    Set db = CurrentDb
    TestSQL = "INSERT INTO tblAuftragsdokumentation (Bestellnummer, Fertig-Nr_, Roh-Nr_, pID, aID, EntnahmeMenge, Datum) " _
         & " VALUES ( " & Me.txtBestellnummerInfo & " , " & Me.txtEndproduktInfo & " , " & Me.cboArt & " , " & Forms.Personen!cboBenutzer & " , " & Forms.Personen!cboAbt & " , " & Me.Entnahme & "  , " & Now & " ) "

    Debug.Print TestSQL
    CurrentDb.Execute TestSQL, dbFailOnError
   
   
   
End Sub

Debug.Print zeigt das Insert Into korrekt an, genauso wie ich es mir vorstelle. Aber Access sagt trotzdem das es bei INSERT INTO einen Syntaxfehler gibt, und der Debugger markiert mir CurrentDb.Execute TestSQL, dbFailOnError. Kann jemand helfen?

Und ja, alle Textfelder und Kombifelder sind gefüllt und offen

DF6GL

Hallo,

bei "Now" fehlt das Klammerpaar  --> Now()

Wenn die Uhrzeit nicht erforderlich ist, wäre Date  (ohne Klammer in VBA , mit Klammer in SQL ) sinnvoller.

Wenn ein VBA-Datum in einen SQL-String eingebaut wird, muss es entspr. USA- oder ISO-Format  umgestellt werden:

... & Format(Date,"\#yyyy-mm-dd\#") & ....
Setze Eckklammern um die Feldnamen, die ein Sonderzeichen ("-") beinhalten.

"Datum" als Feldname ist zwar kein reserviertes Wort in SQL, aber es wäre nicht verkehrt, darauf zu verzichten, bzw. das Feld umzubenennen.

Warum schreibst Du einmal "Me" und andermal "Forms"?

Warum schreibst Du CurrentDb.Execute , wenn am Anfang Set db = CurrentDb geschrieben steht?


Ich unterstelle jetzt, dass alle Tabellenfelder (außer "Datum") den Datentyp Long besitzen

Zudem ist die Benamsung allgemein suboptimal.

TerraAOC

Mai 04, 2021, 15:37:27 #2 Letzte Bearbeitung: Mai 04, 2021, 15:48:16 von TerraAOC
Zitat von: DF6GL am Mai 04, 2021, 15:28:17bei "Now" fehlt das Klammerpaar  --> Now()

Hab ich jetzt behoben. Danke

Zitat von: DF6GL am Mai 04, 2021, 15:28:17Wenn die Uhrzeit nicht erforderlich ist, wäre Date  (ohne Klammer in VBA , mit Klammer in SQL ) sinnvoller.
Uhrzeit brauch ich.

Zitat von: DF6GL am Mai 04, 2021, 15:28:17Setze Eckklammern um die Feldnamen, die ein Sonderzeichen ("-") beinhalten.

Ebenfalls erledigt. Danke

Zitat von: DF6GL am Mai 04, 2021, 15:28:17"Datum" als Feldname ist zwar kein reserviertes Wort in SQL, aber es wäre nicht verkehrt, darauf zu verzichten, bzw. das Feld umzubenennen.


Was würdest du als Alternative empfehlen?

Zitat von: DF6GL am Mai 04, 2021, 15:28:17Warum schreibst Du einmal "Me" und andermal "Forms"?

Das mit Forms. bezieht sich auf Kombofelder in einem anderen Formular als das in dem der Code ausgeführt wird.

Zitat von: DF6GL am Mai 04, 2021, 15:28:17Warum schreibst Du CurrentDb.Execute , wenn am Anfang Set db = CurrentDb geschrieben steht?


Weil ich es nicht besser weiss, wie soll ich das sonst machen?

Zitat von: DF6GL am Mai 04, 2021, 15:28:17Ich unterstelle jetzt, dass alle Tabellenfelder (außer "Datum") den Datentyp Long besitzen
alles vom Datentyp Text, außer Menge und Datum. Menge ist vom Typ Zahl und Datum vom Typ Date/Time


Jetzt sagt er mir das Now() ein ungültiges format hat, habe daraufhin versucht dein Vorschlag mit & Format(Date,"\#yyyy-mm-dd\#") & zu integrieren, allerdings weiss ich nicht wie.
Muss ich dafür das Now() ersetzen?
Wenn ich das mache sagt mir Access das ein Parameter fehlt

PhilS

Zitat von: TerraAOC am Mai 04, 2021, 15:02:57Debug.Print zeigt das Insert Into korrekt an, genauso wie ich es mir vorstelle.
Vielleicht solltest du mal überprüfen, ob deine Vorstellung mit der von Access übereinstimmt. Siehe: VBA-(SQL)-String Video-Tutorial
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

DF6GL

Hallo,

 Phils zeigt Dir in seinem Blog, wie es prinzipiell geht.



Bist Du Dir mit den Datentypen sicher? Sind "pID" und "aID" wirklich vom Datenty TEXT?  Wenn so, solltest Du den Tabellenaufbau prüfen/ändern und die ID-, bzw. Schlüssel-Felder mit Datentyp LONG aufbauen.

ZitatMenge ist vom Typ Zahl

Welche Art von Zahl: Long, Single, Double??

Access geht streng mit Datentypen um und es sollte darauf bei allen Situationen geachtet werden.


Wenn

Zitatalles vom Datentyp Text, außer Menge und Datum. Menge ist vom Typ Zahl und Datum vom Typ Date/Time

tatsächlich korrekt ist (und Menge evtl. Double ist) , dann etwa so:



ZitatPrivate Sub btnTestSQLInsert_Click()
    Dim TestSQL As String
    Dim db   As DAO.Database
   
    Set db = CurrentDb
    TestSQL = "INSERT INTO tblAuftragsdokumentation (Bestellnummer, Fertig-Nr_, Roh-Nr_, pID, aID, EntnahmeMenge, Datum) " _
         & " VALUES ( '" & Me.txtBestellnummerInfo & "' , '" & Me.txtEndproduktInfo & "' , '" & Me.cboArt & "' , '" & Forms.Personen!cboBenutzer & "' , '" & Forms.Personen!cboAbt & "' , " & Str(Me.Entnahme) & "  , " & Format (Now(),"\#yyyy-mm-dd hh:nn:ss\#") & " ) "

    Debug.Print TestSQL
    db.Execute TestSQL, dbFailOnError
   
   
   
End Sub

Die Referenz auf andere Formulare ist eine beträchtliche latente Fehlerquelle. Sobald das andere Form nicht geladen ist, kracht es im Gebälk.

Zudem sollte geprüft werden, ob die Textfelder allesamt nicht leer (NULL) sind, ansonsten kommt es unweigerlich zu Laufzeitfehlern.


TerraAOC

Mai 05, 2021, 07:44:50 #5 Letzte Bearbeitung: Mai 05, 2021, 08:03:26 von TerraAOC
Zitat von: DF6GL am Mai 04, 2021, 17:15:13Bist Du Dir mit den Datentypen sicher? Sind "pID" und "aID" wirklich vom Datenty TEXT?  Wenn so, solltest Du den Tabellenaufbau prüfen/ändern und die ID-, bzw. Schlüssel-Felder mit Datentyp LONG aufbauen.

Natürlich sind pID und aID auch vom Typ Zahl. Genauer zeigt mir Access an das beides LONG ist, genauso wie auch Menge

Zitat von: DF6GL am Mai 04, 2021, 17:15:13dann etwa so:

Das muss ich natürlich für die Felder pID, aID und Menge jetzt wieder abändern, da dein Beispiel ja für Double ist.
Edit: Habe die Hochkomma entfernt bei pID und aID und dein Beispiel so übernommen, es funktioniert, VIELEN DANK!


Long wurde mir von Access automatisch eingestellt, als ich Zahl in der Entwurfsansicht der Tabelle gewählt habe

TerraAOC

Zitat von: PhilS am Mai 04, 2021, 16:32:57Siehe: VBA-(SQL)-String Video-Tutorial

Danke für den Link zu deinem Blog, ich werde mir das Video mal ansehen, wenn ich Zeit finde. Ich war schon öfter auf deinem Block und habe mir auch gestern Abend den Text zum Thema Datum und Uhrzeit durchgelesen.

DF6GL

Hallo,

ZitatDas muss ich natürlich für die Felder pID, aID und Menge jetzt wieder abändern, da dein Beispiel ja für Double ist.


Du solltest den Datentyp nicht nach meinem Beispiel ändern/anpassen, sondern einen Datentyp verwenden, der  Deiner Umgebung gerecht wird und daran die Abfrage anpassen.

Ich kenne Deine Tabellen nicht, und auch nicht, welche Zahl-Typen für die Menge bei Euch erforderlich sind.