Papyrus Datenbank Felder - Farbe ändern und 2 andere Probleme

Hallo.

  1. 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, …
    BildGeburri

  2. 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)?
    BeispielRadio

  3. 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.

Mit freundlichen Grüßen Romacasa

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.

2 „Gefällt mir“

@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:
Dat1
dat2
dat3
dat4

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.

2 „Gefällt mir“

@FDK ich fand die Idee sehr spannend, das Datum durch Hochzählen des Monats und ggf. des Jahres zu berechnen. Warum hast du sie wieder gelöscht?

Herzlichen Dank. FDK hat es gelöscht,jedoch habe ich es zuvor per mail erhalten. Hier die von Ihm geschriebeneFormel:

IF MONAT(Beigetreten) < 10 THEN
  TAG(Beigetreten) + '.' + (MONAT(Beigetreten) + 3) + '.' + JAHR(Beigetreten)
ELSE
  TAG(Beigetreten) + '.' + (MONAT(Beigetreten) - 9) + '.' + (JAHR(Beigetreten) + 1)
ENDIF

Sehr interessante Lösungen habt ihr mir gegeben. Herzlichen Dank.

Mit freundlichen Grüßen
Romacasa

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.

2 „Gefällt mir“

Vorschlag, wie man die vertikale Positionierung von Radiobutton-Texten ändern kann:
grafik
Radiobuttons in PapyrusBase.pdf (282,5 KB)

1 „Gefällt mir“

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 :slight_smile:

Das hatte ich auch ausprobiert … :sweat_smile:
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 
2 „Gefällt mir“

@FDK Wow. Herzlichen dank. Funktioniert wunderbar.
Herzlichen Dank

Mit freundlichen Grüßen
Romacasa

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.

@FDK Dank der wunderbaren Hilfe lerne ich einiges hier im Forum. Habe nun Diene Formel ergänzt:

IF NOT LegioBeitritt THEN
  'Beitrittsdatum fehlt'
ELSE IF (TOTALDAYS(Probezeit) - TOTALDAYS(AKTDATUM())) < 1 THEN
  'Probezeit vorbei'
ELSE IF TAG(Probezeit) <= 9 AND MONAT(Probezeit) <= 9 THEN
       'bis zum 0' + TAG(Probezeit) + '.' + '0' + MONAT(Probezeit) + '.' + JAHR(Probezeit)
ELSE IF TAG(Probezeit) >= 10 AND MONAT(Probezeit) <= 9 THEN
        'bis zum ' + TAG(Probezeit) + '.' + '0' + MONAT(Probezeit) + '.' + JAHR(Probezeit)
ELSE IF TAG(Probezeit) <= 9 AND MONAT(Probezeit) >= 10 THEN
        'bis zum 0' + TAG(Probezeit) + '.' + MONAT(Probezeit) + '.' + JAHR(Probezeit)
ELSE
        'bis zum ' + TAG(Probezeit) + '.' + MONAT(Probezeit) + '.' + JAHR(Probezeit)
ENDIF 
1 „Gefällt mir“