Neuigkeiten:

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

Mobiles Hauptmenü

Datentyp in Kriterienausdruck unverträglich - Datum

Begonnen von -Tom-, Dezember 13, 2011, 01:41:46

⏪ vorheriges - nächstes ⏩

-Tom-

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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen

bahasu

#1
Moin Tom,

format ([Vorgangsdatum], 'yyyy.mm.dd') > '2010.10.12'

oder
format ([Vorgangsdatum], '\#yyyy\/mm\/dd\#') > '#2010/10/12#'

Harald
Servus

DF6GL

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.

-Tom-

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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen

bahasu

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
Servus

DF6GL

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.

-Tom-

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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen


-Tom-

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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen

bahasu

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
Servus

-Tom-

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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen

DF6GL

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..

-Tom-


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
Computerprobleme??? -> http//www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen

bahasu

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
Servus

DF6GL

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
.