Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Notestime am 19.09.04 - 09:21:42

Titel: Alter berechnen
Beitrag von: Notestime am 19.09.04 - 09:21:42
Hallo!

Wie kann ich in Formelsprache ein Alter berechnen?

Also ich hab in Feld1 das Geburtsdatum als Date/Time Value und ich möchte im brechneten Feld2 das aktuelle alter stehen haben.

Kann mir jemaand helfen?

Danke und Gruß
bernd
Titel: Re:Alter berechnen
Beitrag von: eknori am 19.09.04 - 09:38:58
_dateOfBirth:="21.10.1959";
_age:=(@TextToNumber(@Text(@TextToTime("Today") - @Date(@TextToTime(_dateOfBirth)))) / 86400) / 365;
@Prompt([Ok];"Alter";@Text(@Integer(_age)))
Titel: Re:Alter berechnen
Beitrag von: Notestime am 19.09.04 - 18:08:54
Danke!!! Funktioniert Super!
 :) :) :)
Titel: Re:Alter berechnen
Beitrag von: Thomas Schulte am 20.09.04 - 13:50:44
Aber nur wenn du in diesem Jahr nach dem  12.01.1959 geboren worden bist.

Thomas
Titel: Re:Alter berechnen
Beitrag von: HarryB am 20.09.04 - 15:29:30
Um keine Probleme mit Schaltjahren und älteren Leuten zu bekommen, kann man das auch wie folgt lösen:

------

 _dateOfBirth:=@TextToTime("21.10.1959");
_age:=@If(@Month(@Today) > @Month(_dateOfBirth);@Year(@Today) - @Year(_dateOfBirth);
    @Month(@Today) < @Month(_dateOfBirth);@Year(@Today) - @Year(_dateOfBirth)-1;
    @If(@Day(@Today) >= @Day(_dateOfBirth);@Year(@Today) - @Year(_dateOfBirth);@Year(@Today) - @Year(_dateOfBirth) - 1));
@Prompt([Ok];"Alter";@Text(@Integer(_age)))

------

Viele Grüße
Harry
Titel: Re: Alter berechnen
Beitrag von: billygates am 16.01.08 - 11:02:54
Oder auch so (als Formel in einem berechneten Datumsfeld):

datum := [21.10.1959];
tmp1   := @Date(@Year(@Now);@Month(datum);@Day(datum));
tmp2   := (@Now-tmp1)/86400;
tmp3   := @Year(@Now) - @Year(datum);
@If(tmp2 > -1; tmp3; tmp3 - 1)
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 19.01.08 - 00:46:46
Achtung - in unten stehender Formel ist ein böser Bug!
Im Beitrag 21 http://atnotes.de/index.php?PHPSESSID=7594h1jjplgptfnvqalc3tcal4&topic=18281.msg359788#msg359788
wird eine korrigierte Fassung dargestellt und auf das Verhalten von @Date, dem 29. Februar und Nicht-Schaltjahren hingewiesen.

BK, 28.02.2013



Warum nicht als Zweizeiler?  ;)

BirthDay sei das Feld mit dem Geburtsdatum, ActDate das Feld mit dem aktuellen Bezugsdatum (was man ggf. durch @Today ersetzen kann). Age ist (in diesem Fall) das berechnete Feld zur Ausgabe des Alters.

Die erste Zeile des berechneten Feldes prüft zunächst, ob man überhaupt etwas berechnen kann. Dies ist ebenso in einer Aktion mit Ausgabe via @Prompt verwendbar.

Die zweite Zeile berechnet stur das die Jahre von Birthdate bis ActDate. Dumm, wenn Birthday = 11.07.1990 und ActDate = 19.01.2008 - die Person ist dann (ungerechtfertigterweise) schon wehrdienstpflichtig.

Die zweite Zeile normiert Birthday dann auf das Jahr von ActDate (aus 11.07.1990 wird so 11.07.2008), vergleicht dies mit ActDate und reduziert das Alter dann gegebenenfalls um ein Jahr. Ergebnis: Mein Sohn darf heute noch nicht zum Bund einberufen werden  ;D

Code
@If (!@IsTime (Birthday) | !@IsTime (ActDate); @Return (Age); "");
_Age1 := @Year (Actdate) - @Year (Birthday);
@If (@Date (@Year (ActDate); @Month (Birthday); @Day (Birthday)) > ActDate; _Age1 - 1; _Age1)

Bernhard

PS: Mehr dazu auf dem EntwicklerCamp am 27. Februar 2008 (http://entwicklercamp.de/EntwicklerCamp/Agenda)
Titel: Re: Alter berechnen
Beitrag von: billygates am 24.01.08 - 14:42:52
Zweizeiler??? Also ich kann zählen und komme auf 3!  :)
Titel: Re: Alter berechnen
Beitrag von: klaussal am 24.01.08 - 14:44:27
Wenn man bei 0 anfängt zu zählen, dann passt es wieder...  :P
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 24.01.08 - 14:46:40
Die erste Zeile gehört ja "eigentlich" nicht dazu und dient nur der Ordnung und Sauberkeit im Schlachthof  ;)
Und Zeile 2 kann man mit Zeile 3 kombinieren (und dann das Konstrukt aus der neuen Zeile statt der "" in der ersten Zeile einsetzen. Dann hat man einen Einzeiler (kann ihn aber nicht mehr lesen  ;D)

Bernhard
Titel: Re: Alter berechnen
Beitrag von: billygates am 24.01.08 - 15:05:08
So in etwa also:

datum := [21.10.1959];
@If(@Now-@Date(@Year(@Now);@Month(datum);@Day(datum)))/86400 > -1; @Year(@Now) - @Year(datum); @Year(@Now) - @Year(datum) - 1)
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 24.01.08 - 15:21:37
Da fehlt die entscheidende Prüfung auf @IsTime. Davor muss also noch
@If (!@IsTime (Birthday) | !@IsTime (ActDate); @Return (Age); ..............)
Titel: Re: Alter berechnen
Beitrag von: billygates am 24.01.08 - 16:07:19
Uah, ich bin müde...
Titel: Re: Alter berechnen
Beitrag von: Fineas am 12.02.08 - 10:38:43
Als Einzeiler hätte ich auch noch eine simple Lösung im Angebot:

@If(@Month(d2) * 31 + @Day(d2) >= @Month(d1) * 31 + @Day(d1); @Year(d2)-@Year(d1); @Year(d2)-@Year(d1) - 1 )

Zwei Datumsfelder d1 und d2, ein berechnetes Ergebnisfeld mit der Formel.

Selbstverständlich korrekterweise mit Validierung:

@if(@IsTime(d1) & @IsTime(d2); ... ;"gibts nicht!")
Titel: Re: Alter berechnen
Beitrag von: iukhdh am 07.10.09 - 14:29:59
Und was haltet ihr von meiner Einzeilerlösung?

@If(geburtsdatum="";"unbekannt";@Round(((@Year(@Today)*10000+@Month(@Today)*100+@Day(@Today))-(@Year(Geburtsdatum)*10000+@Month(Geburtsdatum)*100+@Day(Geburtsdatum)))/10000))
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 07.10.09 - 16:31:05
Nix.

Bernhard
Titel: Re: Alter berechnen
Beitrag von: iukhdh am 07.10.09 - 16:46:56
Schade.  :'(

Und warum nicht?
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 07.10.09 - 16:53:10
Du änderst die Dimensionen von Datums-/Zeit-Werten und rundest dann. Dazu Schaltjahre, @Year ("unbekannt") kommt gar nicht gut und ... wird mir jetzt zu lang.

Bernhard
Titel: Re: Alter berechnen
Beitrag von: iukhdh am 07.10.09 - 17:16:50
Ups,
das kommt davon, wenn man sich zu einem Schnellschuss hinreissen lässt und auswendig eine alte Idee wieder aufwärmt, die ich in einer berechneten Spalte einer Ansicht verwende. Passt daher nicht ganz zu der Ausgangsfrage mit den Feldern, muss ich zugeben.

Natürlich darf ich nicht kaufmännisch runden, sondern muss immer abrunden.

Also
@If(geburtsdatum="";"unbekannt";@integer(((@Year(@Today)*10000+@Month(@Today)*100+@Day(@Today))-(@Year(Geburtsdatum)*10000+@Month(Geburtsdatum)*100+@Day(Geburtsdatum)))/10000))

Und du meinst, das funktioniert bei Schaltjahren nicht? ... Muss ich echt mal nachprüfen, bisher war ich der Meinung dass das klappt. Aber jetzt bin ich schon etwas verunsichert ... ob ich heute Nacht gut schlafe?

 ;)
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 07.10.09 - 23:20:23
Thomas, Du bist auf dem falschen Dampfer.

Ad a) Hier im Thread wurde gutes bereits gepostet und entsprechend bewertet. Du treibst jetzt eine neue Sau durchs Dorf. Wozu? Zur Überprüfung durch uns - das ist okay und sicherlich auch Deine Intention. Das wäre gut.

Ad b) Deine Formel ist ... untauglich. Wenn Martin Leyrer Dein Post bisher schon gelesen hätte, würde er vermutlich mit einem "Schrei" antworten: "***BERNHARD***!!!" Weil:
Man verarbeitet Datums-/Zeitwerte *IMMER* als Datums-/Zeitwerte und "verwurstet" diese nicht.

Der Murks geht los mit
Code
@If(geburtsdatum="";"unbekannt";
Das Item Geburtsdatum sollte (für den Rest Deines Codes) ein Datums-/Zeitwert sein. Und dann prüftst Du gegen einen **STRING**? Geht's noch? Das geht dank der Freundlichkeit von Notes in diesen Dingen x mal gut - bei x + 1 knallt es dann: Weit hergeholt, aber (auch) in Notes möglich: Dort steht kein Datums-/Zeitwert oder auch nicht "nichts" (scheinbar!!), sondern "An einem schönen Tag im Mai". Da scheppert es dann heftig - obwohl das doch so schön formuliert war  ;D

Der Murks geht weiter mit der Alternative: Nix Geburtsdatum, also wird mit dem String "unbekannt" "gerechnet". Hast Du das schon mal ausprobiert)? @Year ("unbekannt")?

Ich finde das Einbringen Deiner Idee sehr gut. Das ist einer der Dinge, wofür wir hier bei AtNotes stehen - Dinge diskutieren. Du betreibst das in einer hervorragenden Art und Weise (und wir alle wissen, dass Notes-Programmierung gar nicht Dein Hauptaufgabengebiet ist). Bleib uns bitte in dieser Art gewogen. Bitte! Aber Dein geposteter Code ist einfach ... vollkommen unbrauchbar.

Ich hoffe sehr, Du verstehst meine Replik (bitte) nicht falsch.

Bernhard

PS: Vor 15 oder 16 oder 17 Jahren habe ich mir genau mit einer solchen Idee wie Deiner ganz übel ein "Kuckucksei" ins Nest gelegt. Damals gab es aber AtNotes oder vergleichbares noch nicht  ;)
Titel: Re: Alter berechnen
Beitrag von: iukhdh am 08.10.09 - 00:21:50
Hallo Bernhard,
du weisst dass ich immer dankbar über deine/eure Hilfe bin, schon oft habt ihr mir weitergeholfen und ich hab einiges gelernt. Von daher natürlich Danke für deine Anmerkungen.

Gerade deswegen  möchte ich da aber schon weiter nachhaken.

Wie gesagt, das ganze dient bei mir dazu, in einer Ansicht in einer berechneten Spalte Kategorien mit Altersstufen zu bilden. Ich hole mir das Geburtsdatum aus einem Eingabefeld einer Maske. Ich gehe eigentlich davon aus, dass wenn ich das Eingabefeld "Geburtsdatum" als Datumsfeld definiere, eine Eingabe à la "Ein schöner Tag im Mai" niemals möglich ist, oder? Was sollte dann da anderes drinstehen als "Nix" oder ein Datum?

Wie kommst du drauf, dass in der Formel mit "unbekannt" gerechnet wird? Wenn nix drinsteht, dann ist das Ergebniss der String "unbekannt", wenn doch was drinsteht, dann wird mit den Datumswerten gerechnet, da kommt dann ein (Alters-)Zahlenwert raus. Die Situation @year("unbekannt") kommt also nie vor.

OK, ich habe in meiner Spalte bisher nicht darauf geachtet, dass das eine Ergebnis ein String, das andere eine Zahl ist, hat aber zumindest in den berechneten Ansichtsspalten noch nie Probleme gemacht. Kann man aber natürlich auch umwandeln. Ich möchte halt in den Fällen, in denen noch keine Alterangabe eingegeben wurde, nicht irgendeine Fehlermeldung drin stehen haben, sondern eine für die Anwender verständliche Meldung.

Ich gebe zu, ich frage grundsätzlich den Inhalt meiner Felder immer mit  - @if xyz = "" - dahingehend ab, ob da was drinsteht oder ob sie noch leer sind. Hat bisher auch bei Zahlen oder Datumsfeldern noch nie Probleme gegeben, aber nun will ichs schon wissen: Wie frage ich ein Zahlenfeld denn korrekt ab, ob es leer ist?

Und letztlich tät mich jetzt doch trotz allem interessieren, ob meine Idee der Altersbestimmung, nämlich einfach zwei große Zahlen aus Jahr, Monat und Tag zu generieren, diese voneinander abzuziehen und dann abzurunden funktioniert. Ich finde diese Lösung nämlich weitaus einfacher als die anderen, und habe bisher kein falsches Ergebnis entdecken können. Aber vielleicht finde ich die Sonderfälle nur nicht, die dir im Kopf rumschweben. Auch bei Schaltjahren konnte ich bisher keinen Fehler entdecken.

Und dieser aus meiner Sicht weitaus einfachere Ansatz war der Grund, warum ich das hier noch an einen alten Thread angehängt habe. Mir schienen die bisherigen Lösungen nämlich einfach viel zu kompliziert.

So, und nun gute Nacht, bis morgen.
Titel: Re: Alter berechnen
Beitrag von: koehlerbv am 28.02.13 - 19:13:29
Udo (udo187 (http://atnotes.de/index.php?action=profile;u=11004) udo187) hat mich eben darauf hingewiesen, dass in der von mir geposteten Formel eine arge Falle steckt: @Date (<kein-Schaltjahr<; 2; 29) liefert einen NULL-Wert zurück.
Übel ist in diesem Zusammenhang auch, dass in LotusScript Datenumber (<kein-Schaltjahr>, 2, 29) sehr wohl den darauf folgenden 1. März zurückgibt.

Hilfreich ist in diesem Zusammenhang die Verwendung der @-Funktion @Adjust.
Das von mir gepostete Formelkonstrukt sollte also korrekter lauten:

Code
_Age1 := @Year (Actdate) - @Year (Birthday);
Age2 := @If (@Adjust (@Date (@Year (ActDate); @Month (Birthday); 1); 0; 0; @Day (Birthday) - 1; 0; 0; 0) > ActDate; _Age1 - 1; _Age1);

@Prompt ([Ok]; "Age"; @Text (Age2))

Ich bitte meinen Fehler zu entschuldigen.

Bernhard
Titel: Re: Alter berechnen
Beitrag von: tfrenz am 14.01.14 - 14:17:52
Habe hier die Formel nach LotusScript gewandelt.

Dim Age As Integer
Dim datum As NotesDateTime

Age = Year(Stichtag.DateOnly) - Year(GebDatum.DateOnly)
Set datum = New NotesDateTime( "1." & Month( GebDatum.DateOnly) & "." & Year(Stichtag.DateOnly))
Call datum.AdjustDay(Day(GebDatum.DateOnly)-1)
If datum.TimeDifferenceDouble(Stichtag) > 0 Then
   Age = Age -1
End If

Messagebox "Age " + Cstr(Age), 0

gruß Thomas