Auswahl in Schleife bringt nicht den gewünschten Wert
Liebe Leute,
In der Tabelle "Tagungen" gibt es eine Untertabelle "Tagungseinzeltermine", die u. a. das Feld "Beginn Einzeltermin" enthält. Über einen Button / einen Trigger möchte ich immer, wenn ein neuer Wert in das Feld "Beginn Einzeltermin" eingegeben wird (bzw. der Button aktiviert wird), im Feld "kleinstes Datum" folgendes Ergebnis neu berechnet haben: Das kleinste (älteste) Datum aller Felder "Beginn Einzeltermin", und zwar von jenem Monat des Datums "Beginn Einzeltermin, in dem der Trigger/der Button ausgelöst wird.
Das Skript lautet bislang wie folgt:
let VYearMonth := yearmonth(min(Tagungen.Tagungseinzeltermine.'Beginn Einzeltagung'));
let AllRecords := (select Tagungen where yearmonth(min(Tagungseinzeltermine.'Beginn Einzeltagung')) = VYearMonth);
for i in AllRecords do
let VDate := i.Tagungseinzeltermine.'Beginn Einzeltagung';
'kleinstes Datum' := min(VDate)
end;
Was funktioniert: Die Auswahl der Datensätze in der Variable "All Records" ist korrekt. Es werden die Datensätze ausgewählt die dem Kriterium: "Beginn Einzeltermin" = yearmonth des Datensatzes, in dem der Button ausgelöst wird.
Das Problem: Egal ob in der letzten Zeile "min" oder "max" oder "first" oder "last" schreibe, es wird immer das größte (jüngste) Datum angezeigt, also z. B. 28.01.2024 anstatt 02.01.2024.
Frage: Was mache ich falsch?
Ich bin dankbar für Ratschläge :-)
Danke und beste Grüße
ali
3 Antworten
-
Hallo Ali,
Ich gehe davon aus, dass 'Beginn Einzeltermin' ein Datumsfeld ist. Dann würde ich die Formel so gestalten:
let currentDate := 'Beginn Einzeltermin'; let currentYear := year(currentDate); let currentMonth := month(currentDate); let monthStartDate := date(currentYear, currentMonth, 1); let monthEndDate := date(currentYear, currentMonth + 1, 0); let selectedAppointments := (Tagungen.Tagungseinzeltermine['Beginn Einzeltermin' <= monthEndDate and 'Beginn Einzeltermin' >= monthStartDate] order by 'Beginn Einzeltermin'); let existOldestDate := first(selectedAppointments.'kleinstes Datum'); if existOldestDate > currentDate then selectedAppointments.('kleinstes Datum' := currentDate) else 'kleinstes Datum' := existOldestDate end
Warum so:
- bei yearmonth muss ninox in jedem Datensatz zuerst das Datum umwandeln und danach vergleichen. Das Vergleichen von einfachen Datumsfelder ist deutlich performanter.
- selectedAppointments ist direkt nach 'Beginn Einzeltermin' sortiert. Der erste Datensatz enthält somit das kleinste Datum.
- mit existOldestDate vergleichen wir ob es notwendig ist alle Datumsfelder zu ändern. So reduzieren wir die Schreibaktionen wenn es ausreichend ist nur das aktuelle Feld 'kleinstes Datum' zu ändern
Grüße
Leo
Content aside
- gesternZuletzt aktiv
- 3Antworten
- 47Ansichten
-
2
Folge bereits