Neuigkeiten:

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

Mobiles Hauptmenü

Datentypen Fehler - Syntaxfehler

Begonnen von virility, Juli 09, 2012, 11:16:41

⏪ vorheriges - nächstes ⏩

virility

Moin zusammen!
Dies ist mein erster Beitrag hier ... gleich mit einer Frage.

Ich habe eine Datenbank vor die Nase gesetzt bekommen, welche einen Fehler hat.

Es geht um folgendes:

Sub send_repots()


Dim frage  As String

frage = InputBox("Bitte geben Sie den Monat ein", "Abfrage", , 200, 200)

If frage = "" Then
Exit Sub
End If

Dim db As Database
Dim rs As Recordset
Dim sql As String

Set db = CurrentDb()

sql = "UPDATE daten SET daten.status = Null"
db.Execute (sql)

sql = "UPDATE daten SET daten.status = 'A' WHERE lettercode in (Select distinct([durchf station]) from [Reporting - Abgerechnete Daten] where [Abge-rechnet] ='" & frage & "')"
db.Execute (sql)


Call Modul1.sendmails(frage)

Set db = Nothing

End Sub


Der Fettmarkierte Bereich wirft immer den Fehler aus: Datentypen in Kriterienausdruck unverträglich

Startet man die Funktion soll nach dem "Monat" gefragt werden, man muss eingeben: 01.06.2012
Mit diesem Datum wird in einer Tabelle eine "Stationsbezeichnung" rausgesucht, bei welcher in einer weiteren Tabelle (Daten.status) ein A eingetragen werden soll. A für Abgerechnet.

Ich habe KEINE AHNUNG, warum die Datentypen unverträglich sind?! Kann mir irgendwer BITTE BITTE helfen? Falls noch Infos benötigt werden, liefere ich gerna nach.

Gruß
virility

DF6GL

#1
Hallo,

das Ganze sieht ziemlich wüst aus....


-- Die Verwendung der Inputbox ist fehlerträchtig.
-- Wieso muss man ein Datum eingeben, wenn nach einem Monat gefragt wird?
-- Sonderzeichen (und Leerzeichen)  in Namen dringend vermeiden!
-- Welchen Datentyp hat "Abge-rechnet"  in der Tabelle?


Wenn dieses Feld den Datentyp  Datum/Uhrzeit hat, dann muss das so lauten:

<<edit>>
sql = "UPDATE daten SET daten.status = 'A' WHERE lettercode in (Select distinct [durchf station]  from [Reporting - Abgerechnete Daten] where [Abge-rechnet] =" & Format(frage,"\#yyyy-mm-dd\#")  & ")"
<</edit>>


Sorry für das fehlende "#"   8)

Jonny

Hallo,
und nach der Inputbox sollte man dann prüfen ob Frage wirklich ein Datum beinhaltet.
if not isdate([Frage] then
msgbox("Es wurde kein Datum eingegeben")
exit sub
end if

Gruß

Johann

DF6GL

Hallo,

weiterhin muss bei der Inputbox geprüft werden, ob "Abbruch" geklickt wurde... 

virility

#4
Zitat von: DF6GL am Juli 09, 2012, 11:31:44
Hallo,

das Ganze sieht ziemlich wüst aus....


-- Die Verwendung der Inputbox ist fehlerträchtig.
-- Wieso muss man ein Datum eingeben, wenn nach einem Monat gefragt wird?
-- Sonderzeichen (und Leerzeichen)  in Namen dringend vermeiden!
-- Welchen Datentyp hat "Abge-rechnet"  in der Tabelle?


Wenn dieses Feld den Datentyp  Datum/Uhrzeit hat, dann muss das so lauten:


sql = "UPDATE daten SET daten.status = 'A' WHERE lettercode in (Select distinct [durchf station]  from [Reporting - Abgerechnete Daten] where [Abge-rechnet] =" & Format(frage,"\yyyy-mm-dd\#")  & ")"


Ja, leider ist das alles zusammengeschuster.

Bisher war das so, dass das Datum ein "Jan12" für Januar2012 lautet. Da man damit aber keinen variablen Zeitraum (auch eine Funktion der DB) eingeben konnte, hat man es in dd.mm.yyyy geändert.
Das Eingabefeld ist falsch beschriftet. Habe es schon geändert in "Bitte Datum eingeben [dd.mm.yyyy]"

abge-rechnet ist eine Spalte mit Datumangaben im Format dd.mm.yyyy . Kann man irgendwie einsehen wie die Deklaration ist, wenn es sich um eine Tabelle handelt?


Durch die Änderung ist der Fehler jetzt weg. Danke. Leider wird das A in der Tabelle Daten nicht gesetzt...
Dadurch geht es dann hier nicht weiter : Modul1.sendmails
Hier der Auszug:

Sub sendmails(mon1 As String)





'Report erstellen

Dim rs As Recordset
Dim db As Database
Dim sql, telefon As String
Dim strEmailTo As String
Dim strSubject As String
Dim strMsgTxt As String
Dim strAttachment, strAttachment1, strAttachment2, strAttachment3 As String


'mon = InputBox("Bitte geben Sie den Monat ein", "Abfrage", , 200, 200)
'If (mon = "") Then
'    Exit Sub
'End If

mon = mon1

Set db = CurrentDb
Set rs = db.OpenRecordset("Select * from daten where status = 'A'")

'If DirExists("C:\tempo\") = False Then

'MkDir ("C:\tempo\")
     

'End If


While Not rs.EOF

 
ola = rs!Lettercode
DoCmd.OutputTo acOutputReport, "fax stationen - monat", acFormatRTF, "C:\test\" & rs!Lettercode & ".rtf", False


strEmailTo = rs!fax
strSubject = "Test" & mon & " Satellitenstation: " & rs!Lettercode & ""
strMsgTxt = "Sehr geehrte Damen und Herren," & Chr(13) _
& EMAILTEXT


'strAttachment = "C:\Test\telefax.rtf"
'strAttachment1 = "C:\Test\" & rs!lettercode & ".rtf"

' MsgBox strAttachment1
     


Call Modul2.FnSafeSendEmail(strEmailTo, strSubject, strMsgTxt, "d:\tempo\" & rs!Lettercode & ".rtf")



rs.MoveNext

Wend
Exit Sub
Set rs = Nothing
Set db = Nothing





End Sub



Das ist alles total rumgewurstelt...Unglaublich schlimm. Habe in der Firma aber erst letzte Woche angefangen und kann es mir nicht erlauben rumzumeckern wie ein großer ... Heißt also: klarkommen irgendwie :-/

DF6GL

Hallo,


den Datentyp kannst Du im Tabellen-Entwurfsmodus nachsehen, bzw. ändern.

Irgendwie sollte der ganze Code überarbeitet und korrgiert werden..


Sub sendmails(mon1 As String)

'Report erstellen

Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim sql as String , telefon As String, mon as String
Dim strEmailTo As String
Dim strSubject As String
Dim strMsgTxt As String
Dim strAttachment as String, strAttachment1 as String, strAttachment2 as String, strAttachment3 As String


'mon = InputBox("Bitte geben Sie den Monat ein", "Abfrage", , 200, 200)
'If (mon = "") Then
'    Exit Sub
'End If

mon = mon1   

Set db = CurrentDb
Set rs = db.OpenRecordset("Select * from daten where status = 'A'", dbOpenSnapshot)

'If DirExists("C:\tempo\") = False Then
'MkDir ("C:\tempo\")
'End If


While Not rs.EOF

 
ola = rs!Lettercode    '??

DoCmd.OutputTo acOutputReport, "fax stationen - monat", acFormatRTF, "C:\test\" & rs!Lettercode & ".rtf", False ' Warum werden separate RTF-Files generiert?

strEmailTo = rs!fax
strSubject = "Test" & mon & " Satellitenstation: " & rs!Lettercode & ""

strMsgTxt = "Sehr geehrte Damen und Herren," & Chr(13)  &  EMAILTEXT


'strAttachment = "C:\Test\telefax.rtf"
'strAttachment1 = "C:\Test\" & rs!lettercode & ".rtf"

' MsgBox strAttachment1
     


Call Modul2.FnSafeSendEmail(strEmailTo, strSubject, strMsgTxt, "d:\tempo\" & rs!Lettercode & ".rtf")

rs.MoveNext

Wend
Exit Sub
rs.Close
Set rs = Nothing
Set db = Nothing

End Sub


virility

puuhhh...Danke für deine Mühe!!!!

Hab das alles soweit eingearbeitet. Aber wie man dem obigen Edit erwähnt wird in der Tabelle DATEN leider nicht das 'A' gesetzt, daher wird dann bei sendmails auch nicht weitergearbeitet, da es ja nichts markiertes gibt?
Ach...und die Formatierung ist wirklich Datum/Uhrzeit. !

virility

na toll.

jetzt habe ich die änderungen mal zurück auf den server kopiert und bekomme nach der datumseingabe folgende fehlermeldung vom debugger:

Syntaxfehler in Datum in Abfrgeausdruck 'lettercode in (select distinct [durchf station] from [reporting - abgerechnete daten} where [abge-rechner]-d=d1-06-2012#)'.

hab verschiedene versionen mit dd-mm-yyyy durchspielt.
im der tabelle steht ja: 01.06.2012 also dd.mm.yyyy

hat alles nichts gebracht.

database

Hallo,

da dürfte sich in deinem SQL-String ein Fehler eingeschlichen haben - bzw. wurde das Datum nicht im richtigen Format an den selbigen übergeben.
Sieh dazu ....

http://www.donkarl.com?FAQ6.8

virility

mh. ich checke das nicht.

ich habe versucht in der tabelle das datumfeld als yyyy-mm-dd anzeigen zu lassen. es wird automatisch in dd.mm.yyyy geändert ?!, obwohl
inder der tabellenbearbeitung yyyy-mm-dd steht bei eingabeformat.

wie ich den code mit der "übersetzung" des datums einzugeben habe in meine datenbank verstehe ich nicht.


Jonny

Hallo,
es fehlt ein #
=#" & Format(frage,"\yyyy-mm-dd\#")  & ")"
Datumswerte sind immer Zahlenwert und werden über das Format halt nur Formatiert.
Und mehr nicht.

Gruß

Johann

virility

#11
Tjo....leider nicht. Weiterhin Syntaxfehler. Ich bekomme gleich nen Schreikrampf. Welcher Idiot hat denn die DB erstellt?

Ich hab KEINE AHNUNG wo es hakt :-(

EDIT:

Syntaxfehler in Datum in Abfrageausdruck['abge-rechner]=#111-01-01#'.

hatte 01.01.2011
bzw 2011-01-01
etc eingegeben.

database

#12
Hallo,

Zitatich habe versucht in der tabelle das datumfeld als yyyy-mm-dd anzeigen zu lassen
Nimm an der Darstellung des Datums in der Tabelle KEINE Änderungen vor.
Das Datumsfeld soll auch als solches deklariert sein - dher ist die Darstellung der eingetragenen Datumswerte in der Tabelle von untergeordneter Bedeutung

analog der FAQ...

Dim SQLDatum as String
SQLDatum = Format(frage, "\#yyyy\-mm\-dd\#")

sql = "UPDATE daten SET daten.status = 'A' WHERE lettercode in (Select distinct [durchf station]  from [Reporting - Abgerechnete Daten] where [Abge-rechnet] =" & SQLDatum & ")"

... sollte funktionieren.

p.s.
Wobei zu besachten ist, dass das eingegeben Datum aus einer Inputbox als Text übergeben wird.
Wird bei der Eingabe ein Fehler gemacht und dieser nicht abgefangen kann es wiederum zu Fehlermeldungen kommen.

Ich würde daher vorschlagen den Inhalt der Inputbox zuvor auf einen richtigen Datumswert hin zu prüfen.

In Etwa so:

If IsDate (Inputbox("........) ) Then

....

Else

MsgBox "Es wurde kein gültiges Datum eingegeben!"

End If

virility

juuuheay!

Syntaxfehler ist weg!!

Problem Nummer 1 ist gelöst.

Nur leider wird in der Tabelle Daten immer noch kein A eingetragen. ?!

Das Fenster nach der Datumseingabe schließt sich einfach und es passiert nichts.

database

#14
Hi,

schau mal nach, ob dieser TEil des Strings einen Datensatz liefert....

(Select distinct [durchf station]  from [Reporting - Abgerechnete Daten] where [Abge-rechnet] =" & SQLDatum & ")"

und wenn ja ob es in der zu ändernden Tabelle eine Entsprechung dazu gibt - also der Lettercode existiert.


EDIT:
führe den SQL String so aus ...

db.Execute sql, dbFailOnError

... um etwaige Fehler bei der Ausführung angezeigt zu bekommen