MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 22.05.2019, 00:22   #1
NinoA
Neuer Benutzer
Neuer Benutzer
Standard Acc2016 - SQL Datum fehlender Operator im Abfrageausdruck '"19.04.2019"'

Hallo, möchte gern bei Update als Eventhandler eines ungebundenen Steuerelements vom Typ "Datum kurz" eine Änderung in tblLagerbewegung auslösen, aber ich bekomm immer Fehlermeldungen, bei dem Code:

DoCmd.RunSQL ("UPDATE [tblLagerbewegung]" & _
"SET tblLagerbewegung.lagbew_datum = '" & "'" & kanister_eingangsdatum & "'" & "'" & _
"WHERE tblLagerbewegung.kanister_id_f = '" & kanister_id & "'")

Kommt: "fehlender Operator im Abfrageausdruck '"19.04.2019"' "
PS: 19.04.2019 nur als Beispiel


Auch wenn ich das verwende:
.... & "SET tblLagerbewegung.lagbew_datum = '" & "#" & Format(kanister_eingangsdatum, "yyyy-mm-dd") & "#" & "'" .....
kommt "Datentypenkonflikt im Kriterienausdruck"

Bitte um Hilfe,
Danke
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 05:34   #2
drambeldier
MOF Koryphäe
MOF Koryphäe
Standard

Moin,

Empfehlung: Updatestring einer String-Variablen X zuweisen und diese mit debug.print X ins Direktfenster stellen, dann sollte ein Licht aufgehen.

__________________

Gruß
Ralf
drambeldier ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 16:14   #3
NinoA
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Leider komm ich nicht wirklich weiter, da mir die Syntax im Debug Print von SQL jetzt auch nicht viel sagt. :/ hab die Anführungszeichen jetzt auf jeweils ein einzelnes reduzieren können '19.04.2019' , das hat aber auch keine Wirkung.
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 16:24   #4
ebs17
MOF Guru
MOF Guru
Standard

Datum an SQL-String übergeben
Die Quotes rundherum entfallen, das ist hier keine Übergabe eines Textparameters.
Code:

"SET tblLagerbewegung.lagbew_datum = '" & "'" & kanister_eingangsdatum & "'" & "'" & _
Nach welchen Regeln mischst Du das zusammen?
Eine solche Inflation finde ich schon mal schwer zu lesen, am Ende soll man das auch verstehen ...?
Wirf die Würfel weg.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}:{12} <= geklammerte Zahlen sind Einzelthemen
Dein Dankeschön: DBWiki => Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 16:59   #5
drambeldier
MOF Koryphäe
MOF Koryphäe
Standard

Syntax?! Debug.print Variable

Wenn schon Leute mit draufschauen, dann zeig ihnen wenigstens den von Deinem Code produzierten String, sonst schauen sie irgendwann nicht mehr drauf.

__________________

Gruß
Ralf
drambeldier ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 17:08   #6
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

da mir die Syntax im Debug Print von SQL jetzt auch nicht viel sagt

Lösbar etwas fortgeschrittener: Add-In als Ersatz für Debug.Print

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}:{12} <= geklammerte Zahlen sind Einzelthemen
Dein Dankeschön: DBWiki => Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 20:08   #7
NinoA
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

UPDATE [tblLagerbewegung]SET tblLagerbewegung.lagbew_datum = '19.04.2019'WHERE tblLagerbewegung.kanister_id_f = '48'

Drambeldier, danke, das hab ich aber nicht gemeint, Debug.print x schaff ich grad noch

ich meine generell die Struktur von einem SQL String in einem VBA Modul bzw debug.

Was ja auch ebs17 selbst in seinem verlinkten Thread schreibt:

"Das Erstellen von funktionierenden SQL-Anweisungen und Filtern ist für viele an sich schon ein Problem. Dies dann zusätzlich in VBA zu tun unter Einbindung von Accessobjekten (Textfelder, Kombinationsfelder & Co.) und VBA-Variablen - das ist eine immersprudelnde Fehlerquelle, die nicht nur Neulinge betrifft. Diese aber besonders."

Danke ebs17 für das Add-In, vllt hilft mir das weiter.

Geändert von NinoA (22.05.2019 um 20:12 Uhr).
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 20:22   #8
ebs17
MOF Guru
MOF Guru
Standard

Code:

UPDATE tblLagerbewegung SET lagbew_datum = #2019-04-19# WHERE kanister_id_f = 48
So sieht die funktionsfähige SQL-Anweisung aus - vorbehaltlich, dass die verwendete ID eine Zahl (Long) ist.
Bemerkst Du Unterschiede?

Meine Logik sagt mir: Ich sollte erst wissen, wie die Anweisung aussehen muss, ehe ich sie über VBA wie auch immer zusammensetze. Dann habe ich einen Maßstab zum Vergleichen meines Tuns.
Da ist es dann auch nicht verkehrt, sich die funktionierende Abfrage im Abfrageeditor zu erstellen und dann in die SQL-Ansicht umzuschalten und deren Inhalt als Basis zu verwenden und überhaupt erst einmal kennenzulernen. Wenn man dann den Kinderkram wie die überflüssige Klammerinflation und verzichtbare Feldqualifizierungen vermeidet, wird es zudem etwas übersichtlicher.

Als Basis zum Kennenlernen grundlegender Syntax von SQL (beispielhaft): Sql-Tutorial

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}:{12} <= geklammerte Zahlen sind Einzelthemen
Dein Dankeschön: DBWiki => Spende

Geändert von ebs17 (22.05.2019 um 20:33 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 21:54   #9
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

Ich versuch einmal mit dem Ausgangsbeispiel eine Vorgehensweise zu erklären, wie man per VBA einen SQL-Text zusammensetzen kann.

Ausgangslage mit fixen Werten:
Code:

UPDATE tblLagerbewegung
SET tblLagerbewegung.lagbew_datum = #4/19/2019# 
WHERE tblLagerbewegung.kanister_id_f = 48
Diese SQL-Anweisung kann man direkt schreiben und man erzeugt sie über den Access-Abfrageeditor mit der von Eberhard erwähnten Klammernentfernung usw.
Wichtig ist, dass man die Anforderungen des jeweiligen SQL-Dialektes kennt.
Bei Acccess/Jet-SQL ist ein Datum in # zu schreiben.

Variante 1: SQL-Text dynamisch zusammenstellen
1.) den SQL-Ausdruck in einer Textvariablen abzuspeichern.
Code:

Dim SqlText as String
SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = #4/19/2019#" & _
      " WHERE tblLagerbewegung.kanister_id_f = 48"

2.) Den String teilen:
Code:

Dim SqlText as String
SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = " & "#4/19/2019#" & _
      " WHERE tblLagerbewegung.kanister_id_f = " & "48"
3.) String-Variablen einsetzen
Code:

Dim SqlText as String
dim DatumsString as String
dim ZahlenString as String

DatumsString = "#4/19/2019#"
ZahlenString = "48"

SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = " & DatumsString & _
      " WHERE tblLagerbewegung.kanister_id_f = " & ZahlenString
4.) Datentypen richtig in SQL-Text konvertieren
Code:

dim Datumswert as Date
dim Zahlenwert as long

Datumswert  = #4/19/2019#
Zahlenwert = 48

Dim SqlText as String
dim DatumsString as String
dim ZahlenString as String

DatumsString = Format(Datumswert, "#mm/dd/yyyy#") 'Ziel: #4/19/19#
ZahlenString = Str(Zahlenwert)  ' Str passt auch für Dezimalzahlen

SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = " & DatumsString & _
      " WHERE tblLagerbewegung.kanister_id_f = " & ZahlenString

5.) Wenn obiger Code im Schlaf geschrieben werden kann, kann man die Zwischenschritte weg lassen
Code:

dim Datumswert as Date
dim Zahlenwert as long

Datumswert  = #4/19/2019#
Zahlenwert = 48

Dim SqlText as String

SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = " & Format(Datumswert, "#mm/dd/yyyy#") & _
      " WHERE tblLagerbewegung.kanister_id_f = " & Str(Zahlenwert)

Currentdb.Execute SqlText, dbfailonerror
Tipp: Den Formatausdruck durch eine Hilfsfunktion ersetzen, damit der Code besser lesbar wird.
Code:

SqlText = "UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = " & Date2SqlText(Datumswert) & _
      " WHERE tblLagerbewegung.kanister_id_f = " & Str(Zahlenwert)

Variante 2: Auf Stringzusammensetzung verzichten und eine Parameterabfrage verwenden

Code:

dim Datumswert as Date
dim Zahlenwert as long

Datumswert  = #4/19/2019#
Zahlenwert = 48

Dim SqlText as String
dim qdf as DAO.Querydef

SqlText = "Parameters @LagbewDatum datetime, @KanisterID long;" & _
      " UPDATE tblLagerbewegung" & _
      " SET tblLagerbewegung.lagbew_datum = @LagbewDatum" & _
      " WHERE tblLagerbewegung.kanister_id_f = @KanisterID"

set qdf = currentdb.CreateQueryDef("", Sqltext)
qdf.parameters("@LagbewDatum") = Datumswert  
qdf.parameters("@KanisterID") = Zahlenwert 
qdf.execute dbfailonerror
Bei der Parameterabfrage muss man bei der Wertübergabe auf keine Konvertierung achten. Der Datentyp ist in der Parameterdefinition definiert.
Anm.: Statt der temporären Querydef kann auch eine gespeicherte Parameterabfrage nützlich sein.

mfg
Josef

Geändert von Josef P. (22.05.2019 um 21:56 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 22:58   #10
NinoA
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Vielen Dank Josef P. und ebs17,

ich glaube es jetzt besser verstanden zu haben (v.a. das Aufsplitten des SQL-Strings) (hab auch das Add-in installiert und verwendet) und schlussendlich hat mich das zum Erfolg geführt:


x = ("UPDATE tblLagerbewegung" & _
" SET tblLagerbewegung.lagbew_datum = " & "#" & Format(kanister_eingangsdatum, "yyyy-mm-dd") & "#" & _
" WHERE tblLagerbewegung.kanister_id_f = " & kanister_id & "")

DoCmd.RunSQL x

y = ("UPDATE tblLagerbewegung" & " SET lagbew_menge = " & Str(kanister_liter) & " WHERE kanister_id_f = " & kanister_id & "")

DoCmd.RunSQL y

Die vorerst letzte Frage die ich habe, bei mir funktioniert das nur wenn ich "" ans Ende setze, wie oben ersichtlich (sicher ne banale Antwort), aber woran liegt das? Weil das für mich nicht wirklich zum Muster passt mit der Aufsplittung, aber vllt hab ich mal wieder nen Denkfehler.

OffTopic: Ich würde mich liebend gern viel mehr mit SQL Syntax und generell mit der ganzen VBA Hintergrund Grammatik beschäftigen (was ich auf kurz oder lang auch tun werde) nur wenn man mind. 30h arbeitet, studiert und Access als Arbeitsunterstützung/Hobby entdeckt hat wird's eng mit der intensiven Beschäftigung mit den erwähnten Dingen, so dass man verleitet ist, einfach mal ne Suchmaschine anzuwerfen und sich durch etliche Varianten durch zu probieren. Hab natürlich Literatur und Youtube Guides die weiterhelfen aber manchmal findet man damit einfach nicht das richtige.

Geändert von NinoA (22.05.2019 um 23:04 Uhr).
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 23:06   #11
NinoA
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Anscheinend doppelt gepostet, sorry.

Geändert von NinoA (22.05.2019 um 23:40 Uhr). Grund: Doppelt gepostet
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 00:06   #12
knobbi38
MOF User
MOF User
Standard

Hallo Nino,

zwei kleine Anmerkungen:
Meine Zuweisung würde so aussehen:
Code:

y = "UPDATE tblLagerbewegung SET lagbew_menge = " & Str(kanister_liter) & " WHERE kanister_id_f = " & kanister_id
also ohne Klammern und den letzten Ausdruck kannst du dir auch komplett in Access-SQL sparen.

Für das ISO-Format sollte das Minus Zeichen im Format-Ausdruck maskiert werden und die Hash-Zeichen kann man gleich mit einbeziehen:
Code:

... & Format(kanister_eingangsdatum, "\#yyyy\-mm\-dd\#") & ...
Tip:
Manchmal ist es auch übersichtlicher, für SQL-String-Argumente anstatt des "-Zeichen einfach ein '-Zeichen zu verwenden.

Ulrich
knobbi38 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 00:40   #13
NinoA
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Ulrich,

ok super, danke für die Tipps. Jetzt weiß ich auch warum ich nochmal die "" am Ende dranhängen musste, weil ich noch ein & hatte und das verlangte dann noch nach einem inhaltslosen "".

Vielen Dank!
NinoA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 07:27   #14
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Ich würde mich liebend gern viel mehr mit SQL Syntax und generell mit der ganzen VBA Hintergrund Grammatik beschäftigen

Beginnend dazu sollte man sich bewusst machen, dass SQL und VBA nicht "eine gleiche Suppe" sind, sondern sehr unterschiedliche Sprachen. Da will dann auch das Mischen der Welten sauber angegangen sein.
Vielleicht hilft es: Grundlagen - SQL ist leicht (0) - Vorspiel

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}:{12} <= geklammerte Zahlen sind Einzelthemen
Dein Dankeschön: DBWiki => Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 07:43   #15
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

Noch ein Hinweis zu den 2 Update-Anweisungen.
Du kannst 2 Datenfelder in einer Update-Anweisung setzen. Dann muss die Datenmenge nur einmal gefiltert werden.
Code:

Update Tabelle set X = 1, Y = 2 where ...
mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.