0

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

null
    • Leonid_Semik.2
    • gestern
    • Gemeldet - anzeigen

    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:

    1. bei yearmonth muss ninox in jedem Datensatz zuerst das Datum umwandeln und danach vergleichen. Das Vergleichen von einfachen Datumsfelder ist deutlich performanter.
    2. selectedAppointments ist direkt nach 'Beginn Einzeltermin' sortiert. Der erste Datensatz enthält somit das kleinste Datum.
    3. 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
      • Ali
      • gestern
      • Gemeldet - anzeigen

       Lieber Leo, danke!
      Das werde ich gleich ausprobieren. Bin gespannt :-)
      Grüße
      ali

      • Ali
      • gestern
      • Gemeldet - anzeigen

       Lieber Leo,
      ich habe Dein Script implementiert und wie erwartet macht es genau das, was es soll :-)
      Und dank Deiner Erläuterungen verstehe ich auch, auf welche Weise es funktioniert.
      Allerbesten Dank!
      Die einzige Änderung, die ich vorgenommen habe, ist folgende: 

      if existOldestDate = null or existOldestDate > currentDate then
          selectedAppointments.('kleinstes Datum' := currentDate)

      Ansonsten würde das Script ein noch leeres Feld gar nicht erst befüllen.

      Schöne Grüße
      ali

      if existOldestDate = null or existOldestDate > currentDate then
          selectedAppointments.('kleinstes Datum' := currentDate)

Content aside

  • gesternZuletzt aktiv
  • 3Antworten
  • 47Ansichten
  • 2 Folge bereits