PDA

Vollständige Version anzeigen : Konvertierung von Textfeld in Datumsfeld


olafu
29.09.2005, 19:34
Hallo,

ich komme wieder einmal nicht weiter. Ich habe eine Tabelle mit ca. 2500 Einträgen. In diese Tabelle gibt es ein Textfeld "Geburtsdatum". In diesem Feld stehen die Daten in verschiedensten Formatierungen zB. Komma statt Punkt, Jahr zweistellig und vierstellig, Monat einmal ausgeschrieben und einmal als Zahl. Ich brauche das Geburtsdatum aber als Datumsfeld. Mein Gedanke war ein neues Feld "Geburtstag" anzulegen und in einem Formular mittels Schaltfläche eine Schleife anzuschieben die mir das Geburtsdatum konvertiert und als Datumsfeld in "Geburtstag" speichert.
Nun beginnt mein Problem ich stehe mit Schleifen auf dem Kriegsfuß ich bekomme sie einfach nicht zum laufen egal was ich auch tue. Mein kläglicher Versuch einer Schleife, wobei ich auch nicht weiß ob es so dann richtig als Datum konvertiert ist:

DoCmd.GoToRecord , , acFirst
Do While Not EOF(1)
Me.Geburtstag = Me.geburtsDATum
DoCmd.GoToRecord , , acNext
Loop

Kann mir jemand helfen das Problem auf die Reihe zu bekommen. Ich plage mich schon seit Wochen mit dem Problem herum. Ich hatte in meiner Verzweiflung schon in Erwägung gezogen das Datum händisch neu einzugeben obwohl das die denkbar schlechteste Variante ist. :(

Vielen Dank im Vorraus

Olaf

Anne Berg
29.09.2005, 20:27
Anstatt dich durch ein Formular durchzuhangeln, solltest du dich mit einer Aktualisierungsabfrage anfreunden. ;)
Doch mit einem einfachen
"Update Tabelle_xy Set Geburtstag = Geburtsdatum"
ist es ja wohl nicht getan!

Schreibe dir eine Funktion, in der du das alte Datum auseinanderfieselst und in ein echtes Datum umwandelst, dann kannst du das Update folgendermaßen ausführen:

"Update Tabelle_xy Set Geburtstag = gebneu(Geburtsdatum)"

Code:
Public Function gebneu(gebalt as String)

...

end Function

In der Funktion kannst du mit Left, Right, Mid, InStr oder auch Select Case arbeiten, um die Datumsbestandteile herauszufiltern. Vielleicht kannst du auch zuerst alle Kommas mit der Replace-Funktion durch Punkte ersetzen, um das ganze zu vereinfachen. Musst dich halt danach richten, wie die Daten aussehen! ;)

Arne Dieckmann
29.09.2005, 22:55
Ich plage mich schon seit Wochen mit dem Problem herum. Ich hatte in meiner Verzweiflung schon in Erwägung gezogen das Datum händisch neu einzugebenOhne Witz: Das hättest du bei 2500 Datensätzen manuell schon schneller hinbekommen. Wenn du alle Ausnahmen hier präsentieren könntest, wäre eine schnellere Lösung denkbar (s. Annes Beitrag), aber ich bezweifel, dass eine allumfassende Funktion möglich ist.

JörgG
30.09.2005, 01:32
HallOlaf,

den Weg hat Dir Anne gezeigt, hier eine Funktion die 'ne ganze Menge erschlagen sollte:
Public Function FktKonvDatum(strDatum As String) As Variant
On Error GoTo Fehler
Dim strTag As String, strMon As String, strJahr As String
'Jahr
strJahr = Right(strDatum, 4) '46 = ".", 44 = ",", 32 = " ", Zeichen in Jahreszahl testen
If Mid(strJahr, 2, 1) = Chr(46) Or Mid(strJahr, 2, 1) = Chr(44) Or Mid(strJahr, 2, 1) = Chr(32) Then
strJahr = Right(strDatum, 2) 'Jahr 2-stellig
End If
'Tag
strTag = Left(strDatum, 2) '2.Zeichen testen
If Mid(strDatum, 2, 1) = Chr(46) Or Mid(strDatum, 2, 1) = Chr(44) Or Mid(strDatum, 2, 1) = Chr(32) Then
strTag = Left(strDatum, 1) 'Tag 1-stellig
End If
'Monat
strMon = Trim(Mid(strDatum, Len(strTag) + 2, Len(strDatum) - (Len(strTag) + 1) - (Len(strJahr) + 1)))
If Not IsNumeric(strMon) Then
'mache erstmal nischt, das System erkennt jede Menge
End If
'Wert übergeben
If IsDate(strTag & "." & strMon & "." & strJahr) Then
FktKonvDatum = CDate(strTag & "." & strMon & "." & strJahr)
Else
FktKonvDatum = ""
End If
Exit Function
Fehler:
FktKonvDatum = ""
End Function
Beachte das Datum kommt als String zurück (wegen NULL), du kannst dann eine Abfrage nach NULL darauf machen, die Dir alle fehlerhaften DS bringt, bzw in einem weiteren berechneten Feld den Datumsstring sauber konvertieren.