Hallo,
Ich habe folgenden Code
If DCount("*", "tbl_VorgaengeZumMotor", "[MotorGrunddatenID_F]= '" & MotGrunddatenID & "' And [VorgangsArtID_F]= 1 And [Vorgangsdatum]> #12/10/2010# ") = 0 Then
erhalte hier aber immer die obengenannte Fehlermeldung.
Die Fehlermeldung verursacht das Datum!
Habe schon folgende schreibweise versucht
#10/12/2010#
#12-10-2010#
#10-12-2010#
Wie muss denn das Datum aussehen? in Meiner Tabelle stehts ja so drin 13.12.2010 (Datum/Uhrzeit, Format: Datum, kurz)
Tom
Moin Tom,
format ([Vorgangsdatum], 'yyyy.mm.dd') > '2010.10.12'
oder
format ([Vorgangsdatum], '\#yyyy\/mm\/dd\#') > '#2010/10/12#'
Harald
Hallo,
If DCount("*", "tbl_VorgaengeZumMotor", "[MotorGrunddatenID_F]= '" & ME!MotGrunddatenID & "' And [VorgangsArtID_F]= 1 And [Vorgangsdatum]> #12/10/2010# ") = 0 Then
ich sehe hier aber keine Fehlersituation bzgl. des Datums, eher die Benutzung eines ID-Wertes (MotorGrunddatenID_F , vermutlich Zahl,Long) als String. Lass also die Hochkommata um ME!MotGrunddatenID weg...
Des Weiteren würde ich an den "Magic-Numbers" ( 1 und #12/10/2010# ) herummeckern wollen ... ;). Ich nehme nicht an, dass Du bei jeder DAtenänderung auch den Code ändern willst... Und auch auf das Me als Referenez auf das akt. Form sollte nicht verzichtet werden.
Zitat von: DF6GL am Dezember 13, 2011, 09:41:12
Hallo,
ich sehe hier aber keine Fehlersituation bzgl. des Datums, eher die Benutzung eines ID-Wertes (MotorGrunddatenID_F , vermutlich Zahl,Long) als String. Lass also die Hochkommata um ME!MotGrunddatenID weg...
Es lag wirklich an den Hochkommas, ich hab den Befehl eigentlich von einer anderen Stelle kopiert, drum dachte ich nicht an die Hochkommas. Dort sind die aber auch net komisch
Zitat von: DF6GL am Dezember 13, 2011, 09:41:12
Des Weiteren würde ich an den "Magic-Numbers" ( 1 und #12/10/2010# ) herummeckern wollen ... ;). Ich nehme nicht an, dass Du bei jeder DAtenänderung auch den Code ändern willst... Und auch auf das Me als Referenez auf das akt. Form sollte nicht verzichtet werden.
Ne ist schon ein Wert aus einem Feld! War nur zum leichteren Verständnis.
So funkioniert es nun
If DCount("*", "tbl_VorgaengeZumMotor", "[MotorGrunddatenID_F]= " & MotGrunddatenID & " And [VorgangsArtID_F]= 1 And format([Vorgangsdatum], '\#dd\/mm\/yyyy\#') > 'Me!Datum'") = 0 Then
Tom
Moin,
bist Du Dir sicher dass die Reihenfolge '\#dd\/mm\/yyyy\#') für die Abfrage auf ">" die richtigen Ergebnisse liefert?
Der 31.01.2011 sollte dann größer als der 01.02.2011 sein.
Harald
Hallo,
in der Tat ist es Quatsch/Unsinn, einen internen numerischen Datumswert erst in einen String zu verwandeln und diesen mit einem anderen String alphanumerisch (Textvergleich) vergleichen zu wollen,
wobei der Code (bzw. die Where-Condition) eh nicht das ausführt, was eigentlich gedacht ist.
Die resultierende Where-Condition-Ausdruck (benutzt in einer VBA-IF-Bedingung zur Demonstration) dürfte so lauten, wenn in Vorgangsdatum das heutige Datum drinsteht:
If "#14/12/2011#" = "Me!Datum" Then
Das "Datum" ist kein Datum, nur eine Zeichenfolge, die wie ein Datum lesbar ist, und auch nicht mal ein gültiges Datum darstellt (Zwölfter Vierzehnter 2011 ??????? )"
Me!Datum" ist hier KEIN Verweis auf ein Formularfeld, sondern wird selber lediglich auch als Zeichenfolge interpretiert.
Insofern bezweifle ich auch stark, dass der Code das tut, was von ihm erwartet wird.
Ihr habt natürlich recht geht nicht :( habe das nur mit einem Datum probiert und da hat es halt zufällig funktioniert.
Habt Ihr vielleicht ne Lösung für mich wie es gehen könnte?
Tom
Hallo,
ja mei, das hab ich Dir doch schon anfänglich gesagt... ::)
Habs jetzt ohne DCount hinbekommen.
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F = " & MotGrunddatenID & ""
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
If rs.RecordCount > 0 Then
rs.MoveLast
lastdate = rs(0)
End If
If lastdate > Me!Datum Then
MsgBox "Der Vorgang muss nach dem letzten Vorgang liegen!", vbInformation + vbOKOnly, "Hinweis"
Exit Sub
End If
Tom
N'abend,
ich halte den Teil & "" in der sql-Formulierung für überflüssig.
Zu Deinem Exit Sub noch eine Bemerkung von jemanden, der mal mit Pascal angefangen hat und dem es ein Greuel ist, mitten in einer Procedure aus dieser herauszuspringen. Konkret bedeutet das, dass das Programm in diesem Fall nicht zu den - hoffentlich weiter unten vorhandenen - Zeilen rs.close und set rs = nothing hinkommen wird.
Harald
Zitat von: bahasu am Dezember 16, 2011, 18:30:00
N'abend,
ich halte den Teil & "" in der sql-Formulierung für überflüssig.
Dann erhalte ich aber die Fehlermeldung "1 Parameter wurde erwartet, aber es wurden zuwenig Parameter übergeben
Zitat von: bahasu am Dezember 16, 2011, 18:30:00
Zu Deinem Exit Sub noch eine Bemerkung von jemanden, der mal mit Pascal angefangen hat und dem es ein Greuel ist, mitten in einer Procedure aus dieser herauszuspringen. Konkret bedeutet das, dass das Programm in diesem Fall nicht zu den - hoffentlich weiter unten vorhandenen - Zeilen rs.close und set rs = nothing hinkommen wird.
Harald
Das rs.close und set rs = nothing hatte ich natürlich nicht in meinem Code, habe es vor das Exit Sub hinzugefügt
Danke
Tom
Hallo,
das & "" IST überflüssig...
Der Hund (oder heißt es Hase ;) ) liegt woanders im Pfeffer...
Poste mal den ganzen Code, sonst stochert man bezgl. MotGrunddatenID und lastdate und dergleichen im Nebel herum..
Private Sub SaveMotVorgang_Click()
Dim ctl As Object
Dim rs As DAO.Recordset
Dim strSQL As String
Dim lastdate As Date
...
'Prüfen ob Motor schon angeschafft wurde bzw. ob das Datum des Vorgangs nach dem letzten Vorgang liegt.
If Vorgangsart.Value > 1 Then
If DCount("*", "tbl_VorgaengeZumMotor", "[MotorGrunddatenID_F]= " & MotGrunddatenID & " And [VorgangsArtID_F]= 1") = 0 Then
MsgBox "Der Motor muss erst beschafft werden bevor ein anderer Vorgang durchgeführt werden kann!", vbInformation + vbOKOnly, "Hinweis"
Exit Sub
End If
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F = " & MotGrunddatenID & ""
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
If rs.RecordCount > 0 Then
rs.MoveLast
lastdate = rs(0)
End If
If lastdate > Me!Datum Then
MsgBox "Der Vorgang muss nach dem letzten Vorgang liegen!", vbInformation + vbOKOnly, "Hinweis"
rs.Close
Set rs = Nothing
Exit Sub
End If
End If
N'abend Tom,
kann es vielleicht sein, dass die von Dir beschriebene Fehlermeldung beim Weglassen von & "" dann auftritt, wenn in "MotGrunddatenID" nichts enthalten ist?
Harald
Hallo,
vermutlich ist dann "MotGrunddatenID" ein Formular-Textfeld (dann sollte man auf "Me" als Referenz auf das akt. Form nicht verzichten) und ist im Fehlerfall leer.
Deshalb wäre etwa dieses geeignet, den Fehlerzustand syntaktisch, aber nicht logisch, zu vermeiden:
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F = " & nz(Me!MotGrunddatenID,0)
Weiterhin:
für was ist rs.MoveLast gut? Willst Du damit das jüngste Vorgangsdatum (entspr. der Where-Condition) erwischen? Das geht möglicherweise nicht gut... Besser ist in diesem Fall ein Sortierung nach Vorgangsdatum :
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F =" & nz(Me!MotGrunddatenID,0) & "order by Vorgangsdatum "
Weiterhin könnte man sich rs.Movelast sparen, wenn man gleich richtig (absteigend) sortiert und den ersten DS des Recordsets ausliest:
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F =" & nz(Me!MotGrunddatenID,0) & "order by Vorgangsdatum DESC"
Um das Ganze noch weiter zu verkürzen, reicht dann:
.
.
.
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F =" & nz(Me!MotGrunddatenID,0) & " order by Vorgangsdatum DESC"
lastdate= CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)(0)
If lastdate > cdate(Me!Datum) Then
.
Alternativ ginge auch:
.
.
.
strSQL = "SELECT Max(Vorgangsdatum) As LastDate FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F =" & nz(Me!MotGrunddatenID,0)
lastdate= CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)(0)
If lastdate > cdate>(Me!Datum) Then
.
Zitat von: bahasu am Dezember 17, 2011, 20:52:37
kann es vielleicht sein, dass die von Dir beschriebene Fehlermeldung beim Weglassen von & "" dann auftritt, wenn in "MotGrunddatenID" nichts enthalten ist?
Nein, war nicht leer. Ich weiß nicht was ich da gemacht habe denn jetzt geht es komischerweise.
Zitat von: DF6GL am Dezember 17, 2011, 21:11:17
vermutlich ist dann "MotGrunddatenID" ein Formular-Textfeld (dann sollte man auf "Me" als Referenz auf das akt. Form nicht verzichten) und ist im Fehlerfall leer.
Nein ist kein Formular-Textfeld
Zitat von: DF6GL am Dezember 17, 2011, 21:11:17
Weiterhin:
für was ist rs.MoveLast gut? Willst Du damit das jüngste Vorgangsdatum (entspr. der Where-Condition) erwischen? Das geht möglicherweise nicht gut... Besser ist in diesem Fall ein Sortierung nach Vorgangsdatum :
Wollte damit zum letzten Vorgang für diesen Motor springen.
Zitat von: DF6GL am Dezember 17, 2011, 21:11:17
Um das Ganze noch weiter zu verkürzen, reicht dann:
strSQL = "SELECT tbl_VorgaengeZumMotor.Vorgangsdatum FROM tbl_VorgaengeZumMotor WHERE MotorGrunddatenID_F =" & nz(Me!MotGrunddatenID,0) & " order by Vorgangsdatum DESC"
lastdate= CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)(0)
If lastdate > cdate(Me!Datum) Then
So habe ich es jetzt gemacht.
Danke Euch beiden vielmals!!!
Tom
P.S. Schönen Sonntag