Ich habe ein Feld mit einer Formel belegt, das direkt bei Eingabe eines Wertes ineinem anderen Feld ein Ergebnis zeigt. Funktioniert wie es soll. Für den Style habe ich die Hintergrundfarbe geändert und wollte das GRÜN der Schriftfarbe ebenfalls ändern. Geht so nicht über den Grafikobjekt-Eigenschaften-Dialog. Egal welche Farbe ich auswähle: grün, grün, grün allein; scheint hier die Farbe zu sein, …
Ich hätte gerne ein Feld als Radio-Buttons angelegt - was funktioniert. Da auf dem Schirm leider die Schrift 9-10 zu klein ist, habe ich sie auf 14 Punkte erhöht. Wie man sieht: Kreis versetzt sich nach unten. Kann ich die runden Punkte für die Auswahl ändern? Und kann man einen Zwischenraum setzen (etwas abstand - horizontal, wie vertikal)?
Ein Feld soll nach einer Berechnung/Formelauswertung ein STATISCHES Ergebnis beinhalten. Ich tippe ein Datum in ein Feld ein (Beigetreten am:…) . Das in dem Anzeige-Feld zu berechnetes Ergebnis soll sein: Das eingegebene Datum Plus 3 Monate (z.B. 04.12.2023 + 3 Monate = 04.02.2024 (Dez./aktueller Monat muss mitgezählt werden). Dieses Ergebniss soll statisch bleiben, also nicht neu berechnet werden. Nach 3 Monate und einen Tag soll nichts mehr angezeigt werden. Vorschläge?
Ich Danke Euch für Eure Bemühungen und Hilfestellungen.
Das ist ein Rechenfeld, da hast du keine Wahl. Nur der Hintergrund lässt sich beeinflussen.
Sieht nicht so aus. Du könntest versuchen, die Schrift wieder auf 10 pt zu setzen und stattdessen den Zoomfaktor des Formulars zu vergrößern. Der wird mitgespeichert, sodass sich das Formular für die Eingabe immer vergrößert öffnet.
Vertikal ja: über Absatz > Erweiterte Absatzformatierung > Abstand über/unter Absatz.
Horizontal: Leerzeichen vor den Werten für die Radiobuttons (in den Feldeigenschaften).
Hmm, nicht ganz einfach. Der 04.12.2023 + 3 Monate wäre aber der 04.03.2024. Hast du dich vertippt?
Bei +2 Monate würde ich eine Rechenformel wie die folgende ansetzen. Man kann sie noch vereinfachen, um die Wiederholungen zu eliminieren. Und man müsste Schaltjahre berücksichtigen.
Im Feld „Beigetreten“ steht das Datum wie von dir beschrieben. In einem weiteren Feld „Anzeige“ vom Typ „Datum“ kommt die Rechenformel zum Einsatz.
IF MONAT(Beigetreten) == 1 THEN Beigetreten + 31 + 28
ELSE IF MONAT(Beigetreten) == 2 THEN Beigetreten + 28 + 31
ELSE IF MONAT(Beigetreten) == 3 THEN Beigetreten + 31 + 30
ELSE IF MONAT(Beigetreten) == 4 THEN Beigetreten + 30 + 31
ELSE IF MONAT(Beigetreten) == 5 THEN Beigetreten + 31 + 30
ELSE IF MONAT(Beigetreten) == 6 THEN Beigetreten + 30 + 31
ELSE IF MONAT(Beigetreten) == 7 THEN Beigetreten + 31 + 31
ELSE IF MONAT(Beigetreten) == 8 THEN Beigetreten + 31 + 30
ELSE IF MONAT(Beigetreten) == 9 THEN Beigetreten + 30 + 31
ELSE IF MONAT(Beigetreten) == 10 THEN Beigetreten + 31 + 30
ELSE IF MONAT(Beigetreten) == 11 THEN Beigetreten + 30 + 31
ELSE IF MONAT(Beigetreten) == 12 THEN Beigetreten + 31 + 31
Erklärung: Bei der Addition von Zahlen zu einem Datum geht Papyrus davon aus, dass Tage addiert werden. Da man keine Monate addieren kann, muss für jeden Monat geprüft werden, welche Anzahl von Tagen die gewünschte Differenz von 3 Monaten ergibt.
@glucose Danke für Deine Mühe. Ich sehe schon, dass dies nicht so einfach ist… Ich habe dies ausprobiert und um 3 Monate ergänzt und festgestellt, dass nächstes Jahr - Schaltjahr - das gesetzte Datum um einen Tag weniger ausfällt (um den Feb. 24). Nach dem Februar geht es normal weiter. Bilder:
In diesem Vorhaben ging es mir, Sichtbar zu machen, wenn jemand die Probezeit beendet hat. Und gezielt sollten auch jene durch Suchabfrage gefunden werden, die noch in der Probezeit, und bis wann, sind.
Vielleicht über eine Variable vorher das Schaltjahr ermitteln und dann dies in eine IF Schaltjahr, THEN ELSE einfügen. Im WIKI zu Base finde ich leider nichts darüber, wie man ein Schaltjahr auslesen kann…
Danke für die Bemühungen
Mit freundlichen Grüßen
ROmacasa
Schaltjahre treten auf, wenn die Jahreszahl durch 4 teilbar ist, aber nicht wenn sie auch durch 100 teilbar ist, aber doch wieder wenn sie durch 400 teilbar ist. Leider hat Papyrus keine Funktion, um ein Schaltjahr zu bestimmen. Deshalb würde ich der Einfachheit halber nur auf die Teilbarkeit durch 4 testen – das funktioniert dann bis zum Jahr 2100.
Bei den Berechnungen, in denen der Februar vorkommt, muss die Teilbarkeit des Beitrittsjahres (Januar und Februar) oder des Folgejahres (Dezember) bestimmt werden. Das kann man sehr elegant mit dem Modulo-Operator testen, der den Teilungsrest liefert. Also
2020 MOD 4 = 0
2021 MOD 4 = 1
2022 MOD 4 = 2
2023 MOD 4 = 3
2024 MOD 4 = 0 usw.
Da die 0 dem Wahrheitswert „falsch“ entspricht und 1, 2, 3 dem Wahrheitswert „richtig“, kann man das in die Berechnungsformeln integrieren:
IF MONAT(Beigetreten) == 1 AND JAHR(Beigetreten) MOD 4 THEN Beigetreten + 31 + 28 + 31// kein Schaltjahr
ELSE IF MONAT(Beigetreten) == 1 THEN Beigetreten + 31 + 29 + 31// Schaltjahr
ELSE IF MONAT(Beigetreten) == 2 AND JAHR(Beigetreten) MOD 4 THEN Beigetreten + 28 + 31 + 30// kein Schaltjahr
ELSE IF MONAT(Beigetreten) == 2 THEN Beigetreten + 29 + 31 + 30// Schaltjahr
ELSE IF MONAT(Beigetreten) == 3 THEN Beigetreten + 31 + 30 + 31
ELSE IF MONAT(Beigetreten) == 4 THEN Beigetreten + 30 + 31 + 30
ELSE IF MONAT(Beigetreten) == 5 THEN Beigetreten + 31 + 30 + 31
ELSE IF MONAT(Beigetreten) == 6 THEN Beigetreten + 30 + 31 + 31
ELSE IF MONAT(Beigetreten) == 7 THEN Beigetreten + 31 + 31 + 30
ELSE IF MONAT(Beigetreten) == 8 THEN Beigetreten + 31 + 30 + 31
ELSE IF MONAT(Beigetreten) == 9 THEN Beigetreten + 30 + 31 + 30
ELSE IF MONAT(Beigetreten) == 10 THEN Beigetreten + 31 + 30 + 31
ELSE IF MONAT(Beigetreten) == 11 THEN Beigetreten + 30 + 31 + 31
ELSE IF MONAT(Beigetreten) == 12 AND (JAHR(Beigetreten) + 1) MOD 4 THEN Beigetreten + 31 + 31 + 28// kein Schaltjahr
ELSE IF MONAT(Beigetreten) == 12 THEN Beigetreten + 31 + 31 + 29// Schaltjahr
ENDIF
Du könntest ein Feld „Probezeitdauer“ anlegen und dieses als Rechenfeld definieren:
Probezeit - AKTDATUM()
Alle Personen mit einer Probezeitdauer > 0 sind noch in der Probezeit und alle anderen sind raus.
Das war ein „tiefnächtlicher“ Schnellschuss … War schnell notiert, aber nicht durchdacht: Gibt man z.B. 29.11.22 ein, dann wird das Ende der Probezeit mit 29.2.23 angegeben. Es gibt aber keinen 29. Februar im Jahr 2023, weil es kein Schaltjahr ist. Oder 31.08.22 ergibt die Probezeit bis 31.11.2022. Ein 31. November existiert nicht. Es gibt also ein paar Beitrittstermine, die falsche Ergebnisse liefern! Man kann das zwar abfangen (siehe dein Code), dann hat man aber wieder einen riesigen IF ELSE IF Block, weil für jeden der Problemtermine ein neuer Zweig erstellt werden muss.
Ich habe noch etwas mit dieser Idee herumgespielt, um zu sehen, ob Papyrus bei der Konvertierung eines Datum-Strings in einen Datums-Wert vielleicht schlau genug ist, solche Fehler selbst zu korrigieren. Aber leider erkennt es nur den Fehler, korrigiert ihn aber nicht.
CTOD(„29.02.2023“) führt zu einem ungültigen Ergebnis, nicht zum 01.03.2023
Das hatte ich auch ausprobiert …
Ich habe die Idee jetzt fertiggestellt mit dem vollständigen Schaltjahr-Prüf-Algorithmus. Es scheint zu funktionieren, ist aber ziemlich lang:
// 29./30. November ohne folgendes Schaltjahr > Überlauf-Tage im Februar
IF TAG(Beigetreten) = 29 AND MONAT(Beigetreten) = 11 AND (((JAHR(Beigetreten) + 1) MOD 4 == 0 AND (JAHR(Beigetreten) + 1) MOD 100 != 0) OR ((JAHR(Beigetreten) + 1) MOD 400 == 0)) !== 0 THEN '29.02.' + (JAHR(Beigetreten) + 1)
ELSE IF TAG(Beigetreten) = 30 AND MONAT(Beigetreten) = 11 AND (((JAHR(Beigetreten) + 1) MOD 4 == 0 AND (JAHR(Beigetreten) + 1) MOD 100 != 0) OR ((JAHR(Beigetreten) + 1) MOD 400 == 0)) !== 0 THEN '01.03.' + (JAHR(Beigetreten) + 1)
// 29./30. November mit folgendem Schaltjahr > Überlauf-Tage im Februar
ELSE IF TAG(Beigetreten) = 29 AND MONAT(Beigetreten) = 11 AND (((JAHR(Beigetreten) + 1) MOD 4 == 0 AND (JAHR(Beigetreten) + 1) MOD 100 != 0) OR ((JAHR(Beigetreten) + 1) MOD 400 == 0)) == 0 THEN '01.03.' + (JAHR(Beigetreten) + 1)
ELSE IF TAG(Beigetreten) = 30 AND MONAT(Beigetreten) = 11 AND (((JAHR(Beigetreten) + 1) MOD 4 == 0 AND (JAHR(Beigetreten) + 1) MOD 100 != 0) OR ((JAHR(Beigetreten) + 1) MOD 400 == 0)) == 0 THEN '02.03.' + (JAHR(Beigetreten) + 1)
// Monate mit 31 Tagen, die 3 Monate später nur 30 Tage haben
ELSE IF TAG(Beigetreten) = 31 AND (MONAT(Beigetreten) = 1 OR MONAT(Beigetreten) = 3 OR MONAT(Beigetreten) = 8) THEN '01.' + (MONAT(Beigetreten) + 4) + '.' + JAHR(Beigetreten)
// Restliche Tage
ELSE IF MONAT(Beigetreten) < 10 THEN TAG(Beigetreten) + '.' + (MONAT(Beigetreten) + 3) + '.' + JAHR(Beigetreten)
ELSE IF MONAT(Beigetreten) > 9 THEN TAG(Beigetreten) + '.' + (MONAT(Beigetreten) - 9) + '.' + (JAHR(Beigetreten) + 1)
ENDIF
Glucoses Formel funktioniert ja auch. Zum Rest deiner Frage:
Nach 3 Monate und einen Tag soll nichts mehr angezeigt werden.
Ein Feld RestProbezeittage anlegen mit Typ Text oder Zahl, nicht überschreibbar.
Formel:
IF (TOTALDAYS(Probezeit) - TOTALDAYS(AKTDATUM())) < 1 THEN
'Probezeit vorbei'
ELSE
TOTALDAYS(Probezeit) - TOTALDAYS(AKTDATUM())
ENDIF
Das zeigt dann die verbleibende Zahl von Probezeittagen an.
Man kann übrigens ein Feld aus dem Datenbankformular löschen, es wird nur graphisch gelöscht, ist aber in den Feldeigenschaften noch vorhanden, wird also zur Berechnung benutzt. Wenn in diesem Fall das Feld Probezeit gelöscht wird, bleiber nur Beigetreten und RestProbezeittage übrig. Diese RestProbezeittage ist in der Formel auf Probezeit vorbei gestellt, könnte aber auch einen Leerstring enthalten, sodass dann wie gewünscht die Anzeige nach Ablauf der Probezeit verschwindet.