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
@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)
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
@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 ;)
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:
_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