0

lfd. Rechnungs-ID innerhalb einer Dublicate (i) Schleife

Hallo liebe Ninox-Gemeinde,

 

ich habe ein Rechnungseingangsbuch erstellt, um eingehende Rechnungen zu vewalten. Um mir die Arbeit für immer wiederkehrende Rechnungen zu erleichtern, habe ich eine Vorlage erstellt, die ich  per Klick auf einen Button dupliziere:

 

let myMonat := Rechnungsmonat;
let Zaehler := 0;
let RechSum := 0;
let myRJ := Jahr;
let myRM := number(Monat);
let myRD := 1 + "." + myRM + "." + myRJ;
let myMont := if month(today()) = 1 then 12 else month(today()) - 1 end;
let myYear := if month(today()) = 1 then year(today()) - 1 else year(today()) end;
let y := year(today());
let myRgBetrag := last(select Zahlungsverpflichtung).Zahlungsverpflichtugnsbetrag;
let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;
let c := cnt(select Buchen where year('Erfasst am:') = y) + 1;
let myChoise := dialog("Rechnungs- / Buchungslauf", "Welcher Lauf soll durchgeführt werden?", ["1. Rg.-Lauf", "2. B-Lauf", "3. Statistik", "4. Mon.-Lauf", "Abbruch"]);
if myChoise = "1. Rg.-Lauf" then
    let myChoise3 := dialog("Buchen", "Für welches Zeitintervall sollen die Buchungen durchgeführt werden?", ["monatlich", "Quartal", "halbjährlich", "jährlich", "Abbruch"]);
    switch myChoise3 do
    case "monatlich":
        for i in select RechnungsManagement where 'Rg-Nr.:' = "Abo" and Vertragsmanagement.Vertragsstatus = 2 and 'Rechnung Zahlungsintervall' = "monatlich" do
            let new := duplicate(i);
            new.('Rg.-Dat.:' := myRD);
            new.('Rg-Nr.:' := "Abo-Vorgang");
            new.('FS-ID' := " ");
            new.Zahllauf.Rechnungen.(festgeschrieben := 0);
            new.('Rechnung-ID:' := ('Erfasst am:' := today(); let y := year(today());let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1; 'Rechnung-ID' := "RE-" + y + "-" + format(c, "0000")));

            alert("Die monatlich fälligen Abo-Vorgänge wurden angelegt!")
            end
    case "Quartal":
        for i in select RechnungsManagement where 'Rg-Nr.:' = "Abo" and Sperrung = 0 and Vertragsmanagement.Vertragsstatus = 2 and 'Rechnung Zahlungsintervall' = "Quartal" do
            let new := duplicate(i);
            new.('Rg.-Dat.:' := myRD);
            new.('Rg-Nr.:' := "Abo-Vorgang");
            new.('Rechnung-ID:' := "RE-" + y + "-" + format(c, "0000"));
            alert("Die quartalsfälligen Abo-Vorgänge wurden angelegt!")
        end
    case "halbjährlich":

 

Das obige Skript zeigt zwei Entwicklungsstadien! Case "monatlich" ist ein neuerer Ansatz, bei dem ich versucht. habe die Berechnung der laufenden Nummer für die Rechnung-ID mit in die Schleife zu ziehen.

 new.('Rechnung-ID:' := ('Erfasst am:' := today(); let y := year(today());let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1; 'Rechnung-ID' := "RE-" + y + "-" + format(c, "0000")));

Ergebnis: Die Spalte bleibt leer, es wird also keine fortlaufende Nummer eingetragen.

 

Case "Quartal" zeigt den älteren Entwicklungsstand. Hier hatte ich bewußt Teile, die für die Berechnung der laufenden Nummer nötig sind, oben bei den Variablen abgelegt.

let y := year(today());

let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;

 

die eigentliche Aufbereitung war dann innerhalb der Schleife

new.('Rechnung-ID:' := "RE-" + y + "-" + format(c, "0000"));

 

Ergebnis: Es wurde durch die duplicate-Anweisung die laufende Nummer aus der Vorlage gezogen.

 

Normaler weise liegt die Berechnung der Rechnung-ID im Trigger der RechnungsManagement Tabelle

 

'Erfasst am:' := today();
let y := year(today());
let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;
'Rechnung-ID:' := "RE-" + y + "-" + format(c, "0000")

 

Hat einer von Euch eine Idee, wie ich trotz dem dublicate eines Datensatzes einige Tabellenspalten mit einer laufenden Nummer versorgen kann?

 

Vielen Dank

 

Michael

5 Antworten

null
    • + Maßanzug statt Massenware +
    • RonaldP
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Moin Michael ,

    beim Querlesen deiner Skripte fällt mir auf, dass du Variablen mit nur einem Buchstaben verwendest/definierst "y" "c" usw. Das kann Verwechslungen mit NX-Variablen/Funktionen usw. geben.
    Meine Empfehlung: mindestens 3 Zeichen und gerne immer ein "my" o.ä. mitverwenden.
    Damit hat jeder der das Skript liest gleich die Info, dass das eine "eigene" Variable ist.
    Vielleicht funktioniert es ja schon, wenn du diese Änerung einpflegst...

    VG Ronald

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Du deklarierst 'c' 2 mal nacheinander.
    Die erste Deklaration wird niemals durchlaufen, da du 'c' im nächsten Schritt wieder überschreibst.
    Ich kann da Ronald nur zustimmen und auf eine saubere, eindeutige Vergabe von Variablennamen zu achten.

    Ich habe mal das Script für das zu beschreibende Feld new.'Rechnungs-ID' aufgedröselt:

    'Erfasst am:' := today();
    let y := year(today());
    let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;
    'Rechnung-ID' := "RE-" + y + "-" + format(c, "0000"))

    Ohne Kenntnis der DB verstehe ich das Script nicht so richtig.

    Ich würde es mal trotzdem wie folgt testen:

    'Erfasst am:' := today();
    let y := year(today());
    let c := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;
    "RE-" + y + "-" + format(c, "0000")

    Wobei sich mir 'Erfasst am:' := today() in diesem Code nicht erschließt.

    Das ist für euch immer ganz logisch was ihr fragt.
    Für die Beantwortung wird aber meist mehr Content benötigt, da wir eure Datenbank und deren Aufbau nicht kennen und wir meist mit sehr viel Fantasie an eure Fragestellung herangehen müssen und ab und an dennoch scheitern.
    Jedenfalls mir geht es so.
     

    • Michael.3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Roland, DIGITOOL

    hallo UweG ,

     

    vielen Dank für Euer Feedback bezüglich der Variablen. Ich habe allerdings noch Probleme damit, dass nach der Kopie des Datensatz die neuen Rechnung-ID den Kopien zugeordnet wird.

     

    case "monatlich":
            for i in select RechnungsManagement where 'Rg-Nr.:' = "Abo" and Vertragsmanagement.Vertragsstatus = 2 and 'Rechnung Zahlungsintervall' = "monatlich" do
                let new := duplicate(i);
                new.('Rg.-Dat.:' := myRD);
                new.('Rg-Nr.:' := "Abo-Vorgang");
                new.('FS-ID' := null);
                new.(festgeschrieben := 0);
                new.('Rechnung-ID:' := " ");
                alert("Die monatlich fälligen Abo-Vorgänge wurden angelegt!");
                let myArray := (select RechnungsManagement where 'Erfasst am:' = null);
                for 'Rechnung-ID:' in myArray do
                    let myYear1 := year(today());
                    let mycount := cnt(select RechnungsManagement where year('Erfasst am:') = y) + 1;
                    let 'Rechnung-ID:' := "RE-" + myYear1 + "-" + format(mycount, "0000");
                    void
                end
            end 

     

    Da ich im oberen Teil die Rechnung-ID auf Null setze, bleibt diese Lücke. Die Bemühung diese Lücke mit neu generierten Rechnung-ID aufzufüllen scheitert. Habt Ihr dazu eine Idee?

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    case "monatlich":
            for i in select RechnungsManagement ['Rg-Nr.:' = "Abo"] [Vertragsmanagement.Vertragsstatus = 2] ['Rechnung Zahlungsintervall' = "monatlich"] do
                let mycount := cnt(select RechnungsManagement [year('Erfasst am:') = year(today()]) + 1;
                let myRechID := "RE-" + year(today()) + "-" + format(mycount, "0000");
                let new := duplicate(i);
                new.('Rg.-Dat.:' := myRD);
                new.('Rg-Nr.:' := "Abo-Vorgang");
                new.('FS-ID' := null);
                new.(festgeschrieben := 0);
                new.('Rechnung-ID:' := myRechID);
                alert("Die monatlich fälligen Abo-Vorgänge wurden angelegt!");
            end 

    Direkt nach dem Schleifenstart würde ich die neue RechnungsID ermitteln, da zu diesem Zeitpunkt noch kein neuer Datensatz durch Duplizierung angelegt ist.
    Das Variablengedöns ist in der select-Abfrage nicht notwendig, da du einen Vergleich mit einer Variablenunabhängigen Funktion 'hier today()' vornimmst.
    Das Selbe gilt für das erstellen der neuen Rechnung-ID.

    • Michael.3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vielen Dank!

     

    jetzt läuft es wie es soll ;-)