Hallo Access-O-Maniacs!
Habe ein kleines Denkspiel für Euch, folgende Situation:
Im Formular 'frmMitglieder' gibt es ein Textfeld 'Eintrittsdatum' und ein Textfeld 'Austrittsdatum'.
Nun soll in drei ungebundene Textfelder ('SeitJahre' , 'SeitMonate' und 'SeitTage') der Zeitraum so errechnet werden:
z.B.
Ausgehend davon, dass heute der 13.04.2011 ist:
Mitglied Eintrittsdatum SeitJahre SeitMonate SeitTage
------------------------------------------------------------------------------
Hans Wurst 23.04.2004 6 11 21
Frank Heiß 12.08.2010 0 8 1
Fritz Lump 10.03.2000 11 1 3
usw.
Wie lauten die Formeln, die im Steuerelementinhalt der Textfelder 'SeitJahre' , 'SeitMonate' und 'SeitTage' einzugeben sind?
Aber Vorsicht, wenn ein Monat z.B. 31 Tage hat, dann sollen 'SeitMonate' = 1 und 'SeitTage' = 0 herauskommen,
ebenso, da ein Jahr 12 Monate hat, dann soll 'SeitJahre' = 1 und 'SeitMonate' = 0 ergeben!
Diese müssen selbstverständlich hochgerechnet werden (denn Mitglieder bleiben ja gerne länger als 1 Jahr in einem Verein ;D )
Wer traut sich ran an diese Aufgabe?
Natürlich lässt sich diese Problematik auch mir Code lösen, aber wie ???
Sende Euch inzwischen freundliche Grüße
Pergus
Ist nicht ganz trivial. Ich habe dies in einer Abfrage wie folgt gelöst:
Jahre: Wenn(Monat([eintrittsdatum])<Monat([austrittsdatum]);Jahr([austrittsdatum])-Jahr([eintrittsdatum]);Wenn(Monat([eintrittsdatum])=Monat([austrittsdatum]);Wenn(Tag([eintrittsdatum])>Tag([austrittsdatum]);Jahr([austrittsdatum])-Jahr([eintrittsdatum])-1;Jahr([austrittsdatum])-Jahr([eintrittsdatum]));Jahr([austrittsdatum])-Jahr([eintrittsdatum])-1))
Monate: Wenn(Monat([eintrittsdatum])<Monat([austrittsdatum]);Monat([austrittsdatum])-Monat([eintrittsdatum]);Wenn(Monat([eintrittsdatum])=Monat([austrittsdatum]);Wenn(Tag([eintrittsdatum])>Tag([austrittsdatum]);Monat([austrittsdatum])-Monat([eintrittsdatum])-1+12;Monat([austrittsdatum])-Monat([eintrittsdatum]));Monat([austrittsdatum])-Monat([eintrittsdatum])+12))
Tage: Wenn(Tag([eintrittsdatum])<Tag([austrittsdatum]);Tag([austrittsdatum])-Tag([eintrittsdatum]);Tag([austrittsdatum])-Tag([eintrittsdatum])+Tag(DatSeriell(Jahr([eintrittsdatum]);Monat([eintrittsdatum]);0)))
Hallo Gustav,
nach der hervorragenden Vorarbeit von Edgar war das Beispiel im Anhang relativ schnell realisiert.
Ein einfaches Formular zeigt die von dir gewünschten Werte entweder auf Buttonklick beim Eingeben neuer Daten
oder beim Datensatzwechsel in den entsprechenden Textfeldern an.
HTH
[Anhang gelöscht durch Administrator]
Hallo!
Eine andere Variante:
Steuerelementinhalt von:
txtJahre: =DatDiff("jjjj";[Eintrittsdatum];[Austrittsdatum])+([Eintrittsdatum]>DatAdd("jjjj";-Jahr([Austrittsdatum])+Jahr([Eintrittsdatum]);[Austrittsdatum]))
txtMonate: =DatDiff("m";DatAdd("jjjj";[txtJahre];[Eintrittsdatum]);[Austrittsdatum])+(DatSeriell(Jahr([Austrittsdatum]);Monat([Austrittsdatum]);Tag([Eintrittsdatum]))>[Austrittsdatum])
txtTage: =DatDiff("t";DatAdd("m";[txtMonate];DatAdd("jjjj";[txtJahre];[Eintrittsdatum]));[Austrittsdatum])
Interessehalber:
@database: Warum verwendest du für die Berechnung den Umweg über ein Recordset?
Wäre es nicht übersichtlicher in VBA zu bleiben, wenn die Datumswerte bereits per Parameter übergeben werden?
In VBA würde ich dazu neigen, eine allgemeingültige Prozedur zu erstellen und z. B. einen benutzerdefinierten Typ als Rückgabe verwenden.
In einem allgemeinen Modul:
Public Type DatumsDifferenz
Jahre As Long
Monate As Long
Tage As Long
End Type
Public Function GetDatumsdifferenz(ByVal Date1 As Date, ByVal Date2 As Date) As DatumsDifferenz
Dim Diff As DatumsDifferenz
Dim tempDate As Date
Diff.Jahre = DateDiff("yyyy", Date1, Date2) + (DateAdd("yyyy", Year(Date2) - Year(Date1), Date1) > Date2)
tempDate = DateAdd("yyyy", Diff.Jahre, Date1)
Diff.Monate = DateDiff("m", tempDate, Date2) + (DateSerial(Year(Date2), Month(Date2), Day(Date1)) > Date2)
tempDate = DateAdd("m", Diff.Monate, tempDate)
Diff.Tage = DateDiff("d", tempDate, Date2)
GetDatumsdifferenz = Diff
End Function
Im Formular:
Private Sub cmdRechne_Click()
BerechneDatumsdifferenz
End Sub
Private Sub Form_Current()
BerechneDatumsdifferenz
End Sub
Private Sub BerechneDatumsdifferenz()
Dim Diff As DatumsDifferenz
If IsNull(Me!Eintrittsdatum) Or IsNull(Me!Austrittsdatum) Then
Me.txtJahre.Value = "N/A"
Me.txtMonate.Value = "N/A"
Me.txtTage.Value = "N/A"
Exit Sub
End If
Diff = GetDatumsdifferenz(Me!Eintrittsdatum, Me!Austrittsdatum)
Me.txtJahre.Value = Diff.Jahre
Me.txtMonate.Value = Diff.Monate
Me.txtTage.Value = Diff.Tage
End Sub
/edit: zu überlegen wäre noch, was passieren soll, wenn Date1 > Date2 ist.
mfg
Josef, der hofft, dass in Beitrag #1 keine Hausübung delegiert wurde. :D
Hallo,
@Josef
Nein, das war mit
Sicherheit keine Hausaufgabe ;D
ZitatWarum verwendest du für die Berechnung den Umweg über ein Recordset
Hmmm... viele Wege führen nach Rom...
Nachdem die Abfragendefinition von Edgar schon da war lag dieser Weg am Nächsten - deshalb
Hallo edgar.basler,
hallo database (Peter),
hallo Josef P.!
Danke für Euer Mitmachen! Werde alle Lösungen ausprobieren und berichten!
Muß schon sagen, hätte nicht gedacht so schnell und so viele Lösungen zu bekommen!
Aber das bekräftigt meine Aussage, das ACCESS-O-MANIA´s einfach DIE BESTEN 8) sind!
Schöne Grüße aus Südtirol
Gustav
Hallo edgar.basler,
habe Deine Abfrage-Lösung getestet: 1A 8)
Gebe ehrlich zu: Hatte immer schon Verständnis-Schwierigkeiten mit der Logik, wie Microsoft mit dem Datum-Uhrzeit-Format rechnet!
Deine Lösung verschafft mir (und sich auch Anderen!) einen guten Einblick, wie man mit Datums-Formaten umgeht!
Danke dafür!
Gustav
Hallo Peter!
Wie immer funktioniert Deine Lösung einwandfrei (wie könnte es auch anders sein ;D )
Bin immer froh, wenn zwischen den Antworten auch eine von Dir kommt denn, wie Du weißt, schätze ich Deine Meinung sehr! ;)
P.S.: Sehe gerade, daß mit dem speichern dieser Antwort mein Status von 'Newbie' auf 'Access-User' geändert wurde! ::)
Habe das allermeiste Erlernte Dir zu Verdanken, bin Dir sehr dankbar dafür!
Schöne Grüße
Gustav
Hallo Josef P. !
Auch Deine Lösung ist Tip-Top!
Hatte keine Ahnung, wie ich es bewerkstelligen konnte, und nun habe ich die Qual der Wahl!
Ihr seit wirklich großartig! ;)
Schöne Grüße aus Südtirol
Gustav