Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datumsfeld aus Text auslesen

Begonnen von cyorps, Juni 01, 2010, 12:44:56

⏪ vorheriges - nächstes ⏩

cyorps

Hallo,

ich habe bezüglich Datumsfelder in Tabellen und Abfragen zwei Fragen. Die Problemstellung sieht so aus, dass für eine Personalübersicht die Kinder der Mitarbeiter erfasst werden. Für Kinder die älter oder gleich 18 Jahre alt sind, wird zusätzlich in einem Feld ein "Gilt-bis-Datum" im Format mm.jjjj angegeben. Damit wird erfasst, dass der Mitarbeiter trotz Mündigkeit seines Kindes bis zu einem bestimmten Monat noch Kindergeld bezieht. Ein typisches Beispiel dafür ist das Studium. Dann würde beim gilt-bis 03.2010 oder 09.2010 eingetragen werden.

Dieses Feld habe ich in der Tabelle so definiert:
- Felddatentyp: Datum/Uhrzeit
- Format: mm.jjjj (->mm.yyyy funktioniert leider nicht.)
- Eingabeformat: 99.9999;0;_

1. Frage:

Diese Felddefinition bringt das gewünschte Ergebnis und Access kann damit auch in Abfragen umgehen. Denn ein Abfragekriterium beispielsweise in Form von (  [kind-gbis]<Format(Datum();"mm.yyyy"  ) funktioniert. Da ich mir diese Felddefinition über die Accesshilfe zusammengebastelt habe, möchte ich fragen ob diese Definition halbwegs sauber ist? Oder ob ich damit irgendwo Probleme (in Formulare, Berichte etc.) bekommen könnte, was ich jetzt noch nicht überblicke?

2. Frage

Es existiert bereits eine Tabelle wo die Benutzer in Ermangelung eines Gilt-Bis_Feldes, diese Information beim Namen des Kindes eingefügt haben. Diese Felder sehen meistens so aus: "Max (03/10)" oder "Max b.03/10". Da trotz des Eingabewildwuchses das eigentliche Datumformat mit XX/XX recht einheitlich ist, frage ich mich, ob man diese Informationen aus dem Textfeld filtern kann? Hier hatte ich darüber nachgedacht, ob ich es mit Teil() probiere. Doch das hatte ich garnicht erst versucht, da das Eingabeformat dafür doch zu ungenau ist.

Gruß
Mario

P.S. Nur eine Verständnisfrage. Warum aktzepiert Access in einer Tabelle das nur Format "jjjj"  und will dann aber in einer Abfrage z.B. bei Datdiff() auf jedenfall das Format "yyyy" und NICHT "jjjj" haben?
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

DF6GL

Hallo,

- Felddatentyp: Datum/Uhrzeit
- Format: mm.jjjj (->mm.yyyy funktioniert leider nicht.)

sehr wahrscheinlich benutzt Du Access in deutscher Sprachversion. Dadurch müssen in der GUI (Access-Oberfläche) "deutsche" Angaben in den Eigenschaften z. B.  gemacht werden  (j==Jahr).

1)  Problemstellen: 
--Sonderzeichen in Namen ("-"), 
--Verwendung eines "fraktalen" Datumwertes (siehe oben: Tageszahl fehlt. In der Tabelle ist trotz der fehlenden Tagesangabe  im  Eingabeformat der Tag auf den 1.  des Monats gesetzt, aber für das korrekte Funktionieren des Kriteriums lege ich jetzt nicht meine Hand ins Feuer.
--Besser insgesamt wäre, mit "richtigen" (gültigen) Datumswerten zu operieren.


2.  Das Unterfangen wird halt mit jeder Schreib- Variation des "Datum" komplizierter.
Wenn das "Datum" strukturell immer so aussieht:   ...01/10..


kann man die Position des Schrägstricvhs ermitteln und die zwei vorangegangenen Ziffern ausschneiden und als Monatszahl interpretieren, dito bei den nachfolgenden zwei Ziffern diese als Jahreszahl..



PS:  das kommt von der schon oben angesprochenen Sprachversion.  Access versucht (schafft es aber nicht immer, bzw. erzeugt Verwirrung) die angegebenen deutschen Ausdrücke in die in VBA-Routinen zu verwendenden englischen Ausdrücke zu übersetzen. In VBA(Code) selber gibt es nur "englische" Parameter. Datdiff (--> DateDiff() ) ist eine VBA- und damit eine "englischsprachige Funktion.

database

Hallo,

zu 1.

Es ist halt schwierig abzuschätzen, was künftig alles geschehen kann (in Bezug auf Ein- und Ausgaben in der DB) um zum jetzigen Zeitpunkt eine fixe Aussage dazu zu treffen.
Wenn die Syntax stimmt - und davon gehe ich aus wenn die Felddefinition der Access-Hilfe entstammt :)

zu 2.

ZitatDiese Felder sehen meistens so aus
... ist in dem Fall eine sehr 'gefährliche' Geschichte, da ohne konkrete Angabe es kaum möglich ist mit 'normalen' Access-Bordmitteln eine gangbare Lösung zu finden.

wenn die Eingabe nach dem Schema xx/xx erfolgt ist, kann das Datum relativ einfach mit   Rechts([DatumsFeld];5) gelesen werden.
wenn die Eingabe nach dem Schema (xx/xx) erfolgt ist muss die Klammerung ausgeschlossen werden Teil(Rechts([DatumsFeld];7);2;5)

um die beiden Schemata zu unterscheiden muss die äußerst rechte Stelle gelesen und verglichen und die beiden obigen Funktionalitäten eingebaut werden:

Wenn(Rechts([DatumsFeld];1)=")"; Teil(Rechts([DatumsFeld];7);2;5);Rechts([DatumsFeld];5))
Somit sollte die obenstehende Formel den gewünschten Teil des Eintrags ins Datumsfeld/ Namensfeld auslesen.

ZitatWarum aktzepiert Access in einer Tabelle das nur Format "jjjj"  und will dann aber in einer Abfrage z.B. bei Datdiff() auf jedenfall das Format "yyyy" und NICHT "jjjj" haben

Da du dich beim Tabellenentwurf in der deutssprachigen Umgebung befindest.
DatDiff als Datumsfunktion im Abfrageentwurf akzeptiert nur "jjjj" und nur in der SQL-Ansicht ist die Verwendung von "yyyy" möglich - hier allerdings dann als DateDiff

Peter

database

Aha der Franz war wieder einmal schneller - oder ich ein wenig langsamer? ;D ;)

cyorps

#4
Hallo ihr Beide,

danke für eure Antworten.

Zu Frage 1:
Da die Eingabe dieses Feldes natürlich nicht in der Tabelle selbst, sondern in einem Formular erfolgt, werde ich dort den letzten Tag des eingegebenen Monats ermitteln und dann ein komplettes Datum an die Tabelle übergeben. Zum letzten Monatstag hatte ich bei donkarl.com etwas gelesen. Das kann und werde ich sicherlich nutzen.

Ich könnte es mir zwar einfacher machen und die Benutzer zwingen ein komplettes Datum einzugeben, aber ich höre schon die Aufschreie à la "Dann muss ich ja immer überlegen, welcher Tag nun der Monatsletzte ist!?!" Darauf habe ich keine Lust.

Ich danke euch für diesen Rat.

Zu Frage 2:
Da im Namensfeld dieser Tabelle Eintragungen existieren, wo überhaupt kein Gilt-bis-Datum angegeben wurde, habe ich deine Formel, lieber database, mit folgender Ergänzung genutzt (Achtung! Luft anhalten!):

Wenn(IstNumerisch(Rechts(Formel von database);1));Formel von database;Null)
--Ich frage erst ab, ob nach der Anwendung von database's Formel, das erste Zeichen von rechts eine Zahl ist. Wenn ja, greift die Formel von database. - Wenn nein, bleibt das Feld leer--

Ihr Access-Gurus löst das sicherlich eleganter, aber ich bin erstmal stolz auf meine eigene Variante. Aber auch für diese Hilfestellung möchte ich euch danken.

Gruß
Mario
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

database

Hi,

viele Wege führen nach Rom - und das ist es mitunter auch, was die Arbeit im EDV-Umfeld interessant macht. :)