0

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. :)

Bildschirmfoto 2019-08-01 um 16.16.44

7 Antworten

null
    • Paul_Krummling
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    :)

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Oh, da war ich zu spät

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Offensichtlich wurde der Code verbessert:

    ---

    let new := duplicate(i);
    new.(Datum := today());

    ---

    das hat früher nicht funktioniert.

    • Paul_Krummling
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Paul_Krummling
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Leo. Vielen Dank :)

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 7Antworten
  • 1882Ansichten