Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL Select mit Datum

Begonnen von hello_world, Juni 25, 2012, 03:00:39

⏪ vorheriges - nächstes ⏩

hello_world

Hallo,

ich verzweifle bei VBA mehr und mehr...

Ich habe ein einfaches Statement, aber es gibt Fehler 3061 beim Öffnen des Recordsets, dass nicht genügend Parameter übergeben wurden:

sql = "SELECT *  FROM Zahlungen WHERE Zahlungen.Datum = Datum_neu ;"
Set rs = db.OpenRecordset(sql)

Datum_neu ist ein Datumsfeld, nicht überraschend... und Zahlungen.Datum auch... :-)
Datum ist auch das einzige Schlüsselfeld in der Tabelle...

Warum funktioniert es nicht?
Ich habe sehr lange unter SAP entwickelt und es mag jeder seine Meinung dazu haben. Aber die Entwicklungsumgebung ist super, weil sie einem sagt, wenn etwas nicht stimmt und vor allem WAS nicht stimmt... Das ist bei VBA definitiv nicht so ausgeprägt...

DF6GL

Hallo,


Ganz einfach:  ;)   "Datum_neu ist ein Datumsfeld"   vielleicht im VBA-Code, aber nicht im SQL-String, sobald er bei/mit Openrecordset ausgeführt wird.. Zu diesem Zeitpunkt wird "Datum_neu"  vom SQL-Interpreter als irgendein Name interpretiert, der keinen Wert hat und die Where-Condition vergeblich den Kriteriumswert "sucht" ...

Insofern baue den SQL-String zunächst VBA-und Datentyp-mäßig richtig zusammen und führe ihn dann aus. Das Semilokolon am Ende ist in Access (Jet) hier auch überflüssig) :

sql = "SELECT *  FROM Zahlungen WHERE Zahlungen.Datum =" & Format( Datum_neu,"\#yyyy-mm-dd\#")


Weiterhin rate ich zu:

--eindeutige und aussagekräftige Benamsung verwenden (Datentyp-Prefixe bei VBA-Variablen und auch Objekten: "Zahlungen" ---> "tblZahlungen" , speziellere Namensgebung, z. B. "Datum" --> "ZahlDatum")
-- keine Verwendung von reservierten Wörtern ("Datum" kann leicht mit der Datum()-Funktion verwechselt werden)
-- auch wenn hier nicht der Fall: Keine Verwendung von Leer- und Sonderzeichen



Auch fragwürdig:  "Datum ist auch das einzige Schlüsselfeld in der Tabelle..."   

-- Ein Datum wird intern vom Datentyp Double geführt. Dieser Datentyp ist eher nur in Ausnahmen, bzw. wo es nicht anders geht , als Primärschlüssel vorzuziehen. M. E. sollten in der Tabelle andere Felder (ZahlungID, Rechnr, AuftragsNr, MatNr, etc. ) als indizierte Schlüsselfelder herhalten).