Feld in Recordset auf Datumsformat prüfen

13/06/2009 - 17:08 von Joerg M. | Report spam
Hallo NG,

ich habe eine Tabelle mit einem Feld "GeburtsdatumOrig". Das Feld ist als
TEXT formatiert, daran kann ich nichts àndern.

Jetzt soll in einem Recordset geprüft werden, ob der Wert in dem Feld
"GeburtsdatumOrig" ein Geburtsdatum sein kann. Anschließend soll das
Geburtsdatum, wenn es so interpretierbar ist, im Format dd.mm.yyyy formatiert
werden. Andernfall wird eine Variable mit "False" belegt und in einem anderen
Tabellenfeld "Fehler" ein "True" gesetzt. Spàter werden dann diese Datensàtze
dem Anwender über ein Formular zur manuellen Korrektur angeboten.

Die Werte im Feld "Geburtsdatum" können wie folgt sein, was quasi richtig
wàre (Beispiel immer 23.02.1979):

a) 230279 (sechsstellig, nur Zahlen)
b) 23021979 (achtstellig, nur Zahlen)
c) 23.02.1979 (zehnstellig, an zweiter und sechster Stelle ein ".")
d) 23.02.79 (zehnstellig, an zweiter und sechster Stelle ein ".")
e) 23-02-1979 (achtstellig, an zweiter und sechster Stelle ein ".")
f) 23-02-79 (achtstellig, an zweiter und sechster Stelle ein ".")

Ich denke, ich prüfe erst mal auf Anzahl stellen und richtige Position
Trenner, sofern vorhanden. Wenn der Wert im Feld diese Bedingungen erfüllt,
dann als Datum im Format dd.mm.yyyy ausgeben und nochmal prüfen, ob ein
richtiges Datum, könnte ja ansonsten z.B. 30.02. sein.

Den Beginn eines Code-Auszuges habe ich unten beigefügt.

1.)
Die Idee totaler Blödsinn? Andere Idee?
Entscheidend ist, ich muss damit leben, dass die Daten im Textformat
vorliegen und es eines dieser Formate ist (siehe obige Beispiele). Daran kann
ich nichts àndern.
Wie würdet Ihr a) bis f) prüfen?

2.)
An anderer Stelle muss ich noch prüfen, ob ein Textfeld ausschließlich
Buchstaben oder einen Bindestrich enthàlt. Wenn andere Werte im Feld sind,
wieder variable = false und Fehler.

Wie wàre da die Prüfung im Code?


Besten Dank, Gruß Jörg


Set db = CurrentDb ' Datenbank definieren
strSQL = "SELECT * FROM Daten" ' beliebigen SQL definieren
Set rs = db.OpenRecordset(strSQL) ' Recordset öffnen

varFehlerGeb = False

If Not rs.EOF Then rs.MoveFirst ' Zum ersten Datensatz

Do While Not rs.EOF ' Schleife über die Datensàtze des
Recordsets

varNachname = rs!NachnameOrig
varVorname = rs!VornameOrig
varGebDat = rs!GeburtsdatumOrig ' Wert auslesen

'Datumsformat prüfen
varGebDat = Format(varGebDat, "dd.mm.yyyy")

If Not IsDate(varGebDat) Then

varFehlerGeb = True

Else

varFehlerGeb = False

End If
 

Lesen sie die antworten

#1 Peter Doering
14/06/2009 - 10:17 | Warnen spam
Hallo,

Joerg M. wrote:

ich habe eine Tabelle mit einem Feld "GeburtsdatumOrig". Das Feld ist als
TEXT formatiert, daran kann ich nichts àndern.

Jetzt soll in einem Recordset geprüft werden, ob der Wert in dem Feld
"GeburtsdatumOrig" ein Geburtsdatum sein kann. Anschließend soll das
Geburtsdatum, wenn es so interpretierbar ist, im Format dd.mm.yyyy formatiert
werden. Andernfall wird eine Variable mit "False" belegt und in einem anderen
Tabellenfeld "Fehler" ein "True" gesetzt. Spàter werden dann diese Datensàtze
dem Anwender über ein Formular zur manuellen Korrektur angeboten.

Die Werte im Feld "Geburtsdatum" können wie folgt sein, was quasi richtig
wàre (Beispiel immer 23.02.1979):

a) 230279 (sechsstellig, nur Zahlen)
b) 23021979 (achtstellig, nur Zahlen)
c) 23.02.1979 (zehnstellig, an zweiter und sechster Stelle ein ".")
d) 23.02.79 (zehnstellig, an zweiter und sechster Stelle ein ".")
e) 23-02-1979 (achtstellig, an zweiter und sechster Stelle ein ".")
f) 23-02-79 (achtstellig, an zweiter und sechster Stelle ein ".")
[...]



Wenn dein Code immer unter denselben (dt.) Regionaleinstellungen zum
Einsatz kommt, kannst du davon ausgehen, dass die Varianten c) bis f) von
IsDate bereits als gueltig erkannt werden. Es geht also noch um a) und b).
Dazu wuerde ich vor der Pruefung den String manipulieren, z.B.

Set db = CurrentDb ' Datenbank definieren
strSQL = "SELECT * FROM Daten" ' beliebigen SQL definieren
Set rs = db.OpenRecordset(strSQL) ' Recordset öffnen



Hast du eigentlich keine Deklarationen im Code? Achte mal darauf, dass am
Modulanfang nach Option Compare die Zeile

Option Explicit

vorhanden ist. Dann wirst du auf fehlende Deklarationen aufmerksam gemacht.

varFehlerGeb = False



Wofuer steht "var" bei dir? Variant (weil nicht deklariert) oder Variable?
Ich unterstelle mal letzteres und deklariere sie fuer dich:

Dim varFehlerGeb As Boolean
Dim varNachname As String
Dim varVorname As String
Dim varGebDat As String

If Not rs.EOF Then rs.MoveFirst ' Zum ersten Datensatz



Die Zeile ist nicht notwendig. Nach dem Oeffnen des Recordsets steht der
Zeiger auf dem ersten Satz.

Do While Not rs.EOF ' Schleife über die Datensàtze des
Recordsets

varNachname = rs!NachnameOrig
varVorname = rs!VornameOrig
varGebDat = rs!GeburtsdatumOrig ' Wert auslesen



varGebDat = Replace(varGebDat, "-", ".") 'Erst Bindestriche ersetzen

If InStr(varGebDat, ".") = 0 Then 'dann auf Punkte pruefen
'wenn fortlaufende Zahlen, Punkte einfuegen:
varGebDat = Left(varGebDat, 2) & "." & Mid(varGebDat,3,2) & "." & _
Mid(varGebDat, 5)
End If


If Not IsDate(varGebDat) Then

varFehlerGeb = True



varGebDat = Format(CDate(varGebDat), "DD.MM.YYYY")

Else

varFehlerGeb = False

End If



Quote umgestellt:

2.)
An anderer Stelle muss ich noch prüfen, ob ein Textfeld ausschließlich
Buchstaben oder einen Bindestrich enthàlt. Wenn andere Werte im Feld sind,
wieder variable = false und Fehler.

Wie wàre da die Prüfung im Code?



z.B. so:

Dim strPruefen As String
Dim strErlaubt As String
Dim I As Long
Dim blnGueltig As Boolean

strErlaubt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-"
strPruefen = "ABC123"

blnGueltig = True

For I = 1 To Len(strPruefen)
If InStr(strErlaubt, Mid(strPruefen, I, 1) = 0 Then
blnGueltig = False
Exit For
End If
Next I

If blnGueltig = False Then MsgBox "Ungueltige Zeichen gefunden"


(alles Luftcode)

Gruss - Peter

Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Ähnliche fragen