Anzeige Feiertage in Stundenlistenformular
Liebe Forumsmitglieder,
ich bin totaler Ninox Anfänger und versuche schon den ganzen Tag die Tabelle “Feiertage” mit den Spalten “Feiertagsdatum” und “Feiertag” mit der Tabelle “Stunden” zu kombinieren.
In Tabelle “Feiertage” will ich manuell (Osterformel hin oder her) einfach Jahr für Jahr die staatlichen Feiertage eintragen. Das bedeutet zwar einen Aufwand, jedoch ist der bei 13 Feiertagen in Österreich überschaubar.
In der Tabelle “Stunden” trage ich die geleisteten Arbeitsstunden ein. Dort wird in Abhängigkeit des Datums z.B. angezeigt, ob es sich beim Datum um einen Wochentag bzw. um ein Wochenende handelt. Diese Formel würde ich nun gerne erweitern. Sprich: wenn ich einen neuen Datensatz mit einem Datum anlege, der auch in der Tabelle “Feiertage” vorhanden ist, soll mir zusätzlich zum Wochentag/Feiertag auch der entsprechende Feiertagsname angezeigt werden.
Hier erste Gehversuche der Berechnungsformel in der Stundentabelle:let i := date(Datum);
let f := date(Feiertage.Feiertagsdatum);
(select Feiertage where i = f).Feiertagsname
Dabei wird leider nichts angezeigt. Wenn ich die zwei ersten Zeilen entferne, zeigt Ninox zumindest schon einmal die eingetragenen Feiertagsnamen in einer Zeile an (Weihnachten, Silvester, Weihnachten).
Was mache ich falsch?
Vielen Dank um jeden noch so kleinen Rat und liebe Grüße aus Wien,
Klemen
8 Antworten
-
Hallo Klemen, versuch“s mal so:
let myD := date(Datum);
first((select Feiertage where Feiertagsdatum = myD).Feiertagsname)
-
Guten Abend!
es hat funktioniert!!! Vielen lieben Dank!
Stellt sich nur die Frage, was ich falsch gemacht habe? Bzw. kannst du mir kurz erklären, was die einzelen Komponenten der Formel bezwecken?
So kann ich davon lernen.Schönen Abend,
Klemen
-
Du hast i = f in der Abfrage geschrieben, doch auf der linken Seite muss immer der Feldnamen des Feldes stehen, dessen Wert du mit dem Wert auf der rechten Seite vergleichen willst.
-
Vielen Dank!
Und das “first” wählt sozusagen den ersten Eintrag dieses Tages aus, richtig? Ich habe das “first” testweise weggelassen, funktioniert noch immer, jedoch klappt es dann bei einer 2. Formel nicht mehr, die diese “Feiertagsabfrage” weiterspinnt. Dort habe ich das so gelöst.
let x := if weekday(Datum) < 5 then “Wochentag” else “Wochenende” end;
if Feiertagsabfrage = null then
x
else
Feiertagsabfrage
endInteressant: wenn ich “first” weglasse und den Christtag dupliziere, funktioniert dieser Code plötzlich nicht mehr. Weil er nicht 2 Einträge darstellen kann?
Wichtiger: Ist es möglich, die “Feiertagsabrage mit der Wochentag/Wochenende-Formel zu kombinieren?
-
Da ich davpn ausgehe, dass „Datum“ ein Datumsfeld ist, braucht es nicht in date() eingeschlossen werden.
let myDate := Datum;
let myRecords := (select Feiertage)[Feiertagsdatum = myDate and weekday(Feiertagsdatum) < 5];
So bekommst du alle Feiertage, die nicht auf Samstag oder Sonntag fallen.
-
Die mit dieser Abfrage erhaltenen Datensätze kannst du dann mit
for myRecord in myRecords do
...
end;
durchgehen.
-
Hallo Klemen, zum Thema first(): Mit “select” greift man auf eine Tabelle zu (in diesem Fall: Feiertage). Mit dem optionalen “where” werden die Datensätze gefiltert. Dazu wird eines (oder auch mehrere) der Datenfelder (Feiertagsname) mit einem Wert einer Variablen (myD)oder einer Funktion verglichen.
Da das Ergebnis einer select-Anweisung auch bei Filterung mehrere Datensätze umfassen kann (nicht: muss), gibt Ninox immer ein Array mit den entsprechenden Werten zurück. Sucht man von vornherein nur einen ganz bestimmten Datensatz, lässt sich das Ergebnis mit der Funktion first() auf den ersten, dem Filterkriterium entsprechenden Datensatz beschränken (oder mit last() auf den letzten). Dann bekommt man statt eines Arrays nur einen einzelnen Wert zurück, entweder die Record-ID oder den Inhalt eines bestimmten Feldes (Feiertagsname), im vorliegenden Fall bspw. einen String mit dem Inhalt “Ostermontag”.
Ohne first() oder last() wird wie gesagt ein Array zurückgegeben, unabhängig von der Anzahl der Datensätze. Deshalb funktioniert die zweite Formel nicht mehr. Denn Ninox weiß ja nicht, auf welches Array-Element es zugreifen soll.
-
Vielen Dank für die sehr plastische Erklärung!
Content aside
- vor 4 JahrenZuletzt aktiv
- 8Antworten
- 591Ansichten