Kalendermonat erzeugen für Spesenabrechnung
Ich möchte unsere Spesenabrechnung über unsere Datenbank realisieren.
Dazu soll ein Monat in einer Untertabelle erzeugt werden.
Im zweiten Schrit sollen dann die verschiedenen Spesensätze ausgewählt werden etc. etc.
Dazu habe ich
- Das Startdatum 'Calculated First Date of Report' über die Auswahlfelder den Monat und das Jahr generiert.
- Den ersten Wochentag "XX" über 'Calculated Weekday' berechnet.
- Die Anzahl der Tage über eine If Abfrage in 'Calculated Days' gespeichert.
Ein Loop soll nun soviele "Tage" in eine Untertabelle schreiben wie der Monat Tage hat und soll dabei das:
- Erste Datum aus 'Calculated First Date of Report' in den ersten "Tag" speichern.
- Den ersten Wochentag mit 'Calculated Weekday' in den ersten Wochentag speichern.
Danach soll:
- Der 'Calculated First Date of Report' um einen Tag erhöht werden.
- Der Wochentag dementsprechend neu berechnet werden.
Und das Ganze so lange wie der Monat Tage hat.
Hier mein Versuch dazu aber leider klappt das überhaupt nicht)
- Das Datum wir nicht erhöht.
- Der Wochentag wird nur einmal korrekt errechnet.
let loop := 'Calculated Days';
let myDate := 'Calculated First Date of Report';
let myDay := 'Calculated Weekday';
for II from 0 to loop do
let newR := (create 'Monthly-Report');
newR.(Date := myDate);
newR.(Day := myDay);
let myDate := myDate + 1;
if weekday(myDate) = 0 then
myDay := "Mo"
else
if weekday(myDate) = 1 then
myDay := "Di"
else
if weekday(myDate) = 2 then
myDay := "Mi"
else
if weekday(myDate) = 3 then
myDay := "Do"
else
if weekday(myDate) = 4 then
myDay := "Fr"
else
if weekday(myDate) = 5 then myDay := "Sa" else myDay := "So" end
end
end
end
end
end
end
Was mache ich verkehrt?
Mein Problem ist immer wieder dass die Syntax der Befehle nicht irgendwo definiert ist.
Man muss sich alles aus irgendwelchen Beispielen suchen
15 Antworten
-
Achso, das Ganze habe ich über ein Befehlsfeld "Monat Generieren" versucht zu erstellen.
-
Hallo Tomi,
viel zu kompliziert. Ich würde es so machen.
---
let myNr := Nr;
let myDate:='Calculated First Date of Report';
for II from myDate to date(year(myDate), month(myDate) + 1, 1) step 1000 * 60 * 60 * 24 do
let newR := (create 'Monthly-Report');
newR.(Date := II);
newR.(Day := format(II, "dd"));
newR.('Deine Haupttabelle' := myNr)
end---
Was wird hier gemacht: Ende des Monats is das 1. des nächsten Monats -1 Tag. Mit date(year(myDate), month(myDate) + 1, 1) hat man das erste des nächsten Monats und in der Schleife wird das letzte Datum nich berechnet. Die Steps solltem in Tagen sein, da aber das Datum in Millisekunden ist, kann man daraus mit 1000 * 60 * 60 * 24 die Tage machen. Und die Wochentage kann man über format(Datum,"dd") darstellen. In dem letzten Schritt wird noch die Verknüpfung von der Haupttabelle (hier Deine Haupttabelle) zu der Monthly-Report aufgebaut
Leo
-
Hi Leo,
Super, danke das geht.
Deine Formel ist auch deshalb besser weil ich mich nicht weiter um die Schaltjahre und damit den 29. Februar kümmern.
- Kannst du mir (für die Zukunft) nochmal erklären welcher Teil für die Verknüpfung zuständig ist?
- Ist es vielleicht möglich die Samstage und Sonntage irgendwie zu markieren?
Tomi -
Toll! Teilst du die DB, wenn sie fertig ist?
-
Hallo Tomi,
Ich versuche es so zu erklären, wie ich es verstehe. Du hast Tabelle A als Haupttabelle und Tabelle B als Untertabelle.
bei 1:n Beziehung hast du in der Tabelle A in jedem Datensatz eine Tabelle namens Tabelle B. In der Tabelle B hast du ein Verknüpfungfeld namens Tabelle A. Hier kannst du nur einen Datensatz aus der Tabelle A haben. Deswegen auch 1:n. So weit so gut. Jetzt möchte man per Skript neue Datensätze in der Tabelle B erzeugen und diese automatisch zu dem Datensatz in der Tabelle A zuordnen wo dieser Skript auch herkam. Zuerst muss ich die ID von dem aktuellen Datensatz speichern. Das kann man mit:
let myID:=Nr
erledigen.
Danach möchte ich ein neuen Datensatz in der Tabelle B erzeugen. dafür ist create zuständig. Jetzt kommt aber ein Irrtum zustande: mit let newR:=create 'Tabelle B' erzeugt Ninox einen leeren Datensatz ohne Verknüpfungen. Da aber sowohl die Tabelle B selbst als auch die Verknüpfung gleich heißen (Tabelle B), denken viele, dass die Verknüpfung automatisch erstellt wird. Wenn man die Verknüpfung anders benennt z.B. Untertabelle, und versucht die Code so aufbauen: let newR:=create Untertabelle, bekommt man die Fehlehrmeldung, dass die Tabelle Untertabelle nicht existiert. Also man muss in dem neuen Datensatz newR noch die Verknüpfung zu dem aktuellen Datebnsatz aus der Tabelle A setzen: newR.'Tabelle A':=myID
und Gesamtcode:
---
let myID:=Nr;
let newR:=create 'Tabelle B';
newR.'Tabelle A':=myID
---
Jetzt zu der Markierung. Man kan das Feld Day als Berechnungsfeld darstellen und mit styled Funktion formatieren:
---
styled(format(Date, "dd"), if weekday(Date) < 5 then "white" else "red" end)
---
Da Day jetzt automatisch berechnet wird, musst du die Formel newR.(Day := format(II, "dd")) aus deinem code entfernen
Leo
-
Hi Dirk,
Klar kann ich das teilen.
Gute Idee -
Danke Tomi! Wo teilst Du die Datenbank? Schreibst Du hier einen Link hinein?
-
Ich brauche noch ein bischen weil ich ja immer nur Abends was machen kann.
Außerdem bin ich noch Neuling hier und haben keine Ahnung wo man das teilen könnte.
Vielleicht kann mal einer von den Admins sagen wo man das dann am Ende teilen kann. -
Also, ich habe das jetzt fertig und muss mich bei Leonid ausdrücklich bedanken.
Leonid, du hast mir eine Menge Zeit und Kopfschmerzen erspart.
Wenn mir jetzt noch jemand sagt wie ich das Ergebnis teilen kann, stell ich das gerne zur Verfügung. -
Dropbox oder anderer Cloudspecher oder wenn Du im Webinar-Team bist direkt dort?
-
geschafft: hier kannst du es runterladen:
https://www.file-upload.net/download-13227265/ExpenseReportfinal.ninox.html -
hmm...
Das wird da irgenwie verschlüsselt.Ich speichere das irgendwo anders
-
Hallo zusammen,
ich habe mir aus gegebenen Anlass den Code ein wenig in meine Datenbank importiert. Die Zeilen werden erstellt, alles schön. Problem ist jedoch, dass Ninox offenbar die Verknüpfung zwischen den einzelnen Daten und der Hauptansicht nicht erkennt. Sprich: Wenn ich auf Generate klicke, wird bei mir die Tabelle darunter nicht ausgefüllt. Ich muss handisch die Verknüpfung in der Untertabelle erst herstellen. Bei dir geht das aber automatisch. Wo muss ich das einstellen? Wie geht der Trick :D.
Gruß Dominik
-
Ach ich dussel...
newR.('Deine Haupttabelle' := myNr)
Alles klar. Damit funktionier das ganze nun einwandfrei. Besten Dank für das Beispiel :)
Content aside
- vor 5 JahrenZuletzt aktiv
- 15Antworten
- 4616Ansichten