Dauerauftrag Cronjob
Hallo, wir haben eine Rechnungsdatenbank erstellt und möchten nun gerne Daueraufträge anlegen. Die Lösung könnte sein, dass ein neuer Datensatz unter Rechnungen angelegt wird. Anschließend wird der Status auf "Dauerauftrag" gestellt, wodurch ein neues Feld erscheint: "Abrechnung". Je nach Einstellung der "Abrechnung", zb. monatlich soll der gleiche Datensatz nach Eingabe des Datums dupliziert, in dem Falle 01.08. - also zum 01.09. nochmal eingefügt werden.
Und das Ganze am Besten noch mit einem CronJob, sodass die Funktion automatisch beispielsweise einmal am Tag ausgeführt wird.
Vielen Dank für Eure Hilfe. :)
7 Antworten
-
Hab eine Lösung gefunden:
for i in select '3. Rechnungen' where 'nächste Abrechnung' = today() and 'Folgerechnung-erstellt' != 1 do
let new := duplicate(i);
new.(Datum := today());
i.('Folgerechnung-erstellt' := 1)
end
:)
-
Hallo,
Ninox hat noch keinen zeitbasierten Job-Scheduler. Wenn man aber annimmt, dass Ninox jeden Tag Morgens geöffnet wird, kann man einen Trigger beim Öffnen schreiben. Die nötige Datensätze kann man mit select Abfrage finden und dann in einer Schleife duplizieren. Der Befel zum duplizieren heist duplicate(record). Im gegensatz zum create (table) kann man den duplizierten Datensatz nicht direkt in eine Variable packen. Dazu kommt noch die schwierigkeit, dass ninox mit last(record) komisch verfährt. Bei monatlichen Daueraufträgen kann der Code so aussehen:
---
let myArray:=select Rechnungen where text(Status)="Dauerauftrag" and text(Abrechnung)="Monatlich" and date(year(Datum),mont(Datum)+1,day(Datum))=today();
for i in myArray do
duplicate (i);
let maxID:=max(select Rechnungen.number(Nr));
let newR:=first(select Rechnungen where number(Nr)=maxID;
newR.Datum:=today();
newR.'R-Nr.'=.......;
.....
end
---
Die neu erstellten Rechnungen kann man dann in einer Ansichtstabelle anschauen. Je nach Datenmodell kann es sein dass die Rechnungspositionen nicht übernommen werden. In diesem Fall kann man die Positionen auch mit Skript schreiben.
Leo
-
Oh, da war ich zu spät
-
Offensichtlich wurde der Code verbessert:
---
let new := duplicate(i);
new.(Datum := today());---
das hat früher nicht funktioniert.
-
Hallo Leo, danke für die schnelle Hilfe. Ich habe den Code nun ein wenig ausgebaut und brauche bitte nochmal Unterstützung. Ich habe folgenden Code als Befehlsschaltfläche geschrieben:
for i in select '3. Rechnungen' where 'nächste Abrechnung' = today() and 'Folgerechnung-erstellt' != 1 do
let new := duplicate(i);
new.(Datum := today());
new.('Folgerechnung-erstellt' := 1);
new.(Status := 9);
let YEA := year(Datum);
let MON := month(Datum);
let DAY := day(Datum);
if i.Abrechnung = 2 then
i.('nächste Abrechnung' := date(YEA, MON + 1, DAY))
end;
if i.Abrechnung = 3 then
i.('nächste Abrechnung' := date(YEA, MON + 3, DAY))
end
end
Wenn ich diesen Code jedoch unter Optionen und "nach dem Öffnen der Datenbank folgendes Script ausführen" einfüge, dann erhalte ich eine Fehelermeldung: "Eine Tabellenspalte wurde nicht gefunden: Datum in Zeile 6"
Weißt du eine Lösung? Danke und viele Grüße
Paul
-
Hallo Paul,
Datum in der Schleife sollte man entweder mit i.Datum oder mit new.Datum ansprechen (je nach dem, welchen Datensatz man ansprechen möchte). Mir ist noch aufgefallen, dass du in dem neuen Datensatz das Feld 'Folgerechnung-erstellt' auf 1 setzt. Ich glaube, das solltesrt du mit dem aktuellen Datensatz machen (i.'Folgerechnung-erstellt' :=1).
Und weiter manipilierst du den bestehnden Datensatz. Ich würde die nächste Abrechnung lieber bei neuen Datensatz ändern. Hier mein Vorschlag:
---
for i in select '3. Rechnungen' where 'nächste Abrechnung' = today() and 'Folgerechnung-erstellt' != 1 do
let new := duplicate(i);
new.(Datum := today());
i.('Folgerechnung-erstellt' := 1);
new.(Status := 9);
let nextMonth:=switch i.Abrechnung do
case 2:
month(today())+1
case 3:
month(today())+3
end;
new.'nächste Abrechnung':=date(year(today()),nextMonth,day(today()))
end
end
---
Leo
-
Hallo Leo. Vielen Dank :)
Content aside
- vor 5 JahrenZuletzt aktiv
- 7Antworten
- 1882Ansichten