0

for i in select ... verschachteln mit if then else?

Hallo!

 

Kann man innerhalb einer Schleife noch eine Fallunterscheidung unterbringen?

 

Gruß

 

Michael

9 Antworten

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

    Im Grunde zielt meine Frage darauf ab, ob man die zwei Skripte zusammenführen kann.

     

    1. Skript (funktioniert):

    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 c := cnt(select Rechnungen where year('Erfasst am:') = y) + 1;

    for i in select Rechnungen where Status = "Vorlage" and Vertragsmanagement.Vertragsstatus = 2 do

    let new := duplicate(i);

    new.('Rg.-Dat.:' := myRD);

    new.('Rg-Nr.:' := "Abo-Vorgang");

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

    Zaehler := cnt((select Rechnungen)['Rg-Nr.:' = "Abo-Vorgang" and format('Rg.-Dat.:', "MM") = myRM]);

    RechSum := sum((select Rechnungen)['Rg-Nr.:' = "Abo-Vorgang" and format('Rg.-Dat.:', "MM") = myRM].Zahlbetrag)

    end;

    let CC := "======== Voreinstellung für Rechnungsmonat hochzählen ======";

    if substr(myMonat, 5, 2) = 12 then

    let myJahr := number(text(Jahr)) + 1;

    Jahr := text(myJahr);

    Monat := "Januar"

    else

    Monat := monthName(number(Monat) + 1)

    end;

    let CC := "============= Datensatz für Rechnungslauf erzeugen =======";

    let newRL := (create 'Rechnungslauf-Protokoll');

    newRL.('für Monat' := myMonat);

    newRL.('Rg-Dat' := myRD);

    newRL.('Anzahl Rechnungen' := Zaehler);

    newRL.(Gesamtbetrag := RechSum)

     

    2. Skript (funktioniert leider noch nicht):

     

    let myMonat := Rechnungsmonat;

    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 c := cnt(select Rechnungen where year('Erfasst am:') = y) + 1;

    for i in select Rechnungen where Status = "Abo-Vorgang" and Vertragsmanagement.Zahlweg = 2 do

    let newZAufTr := i;

    let newZAufTr := (create 'Zahlaufträge');

    newZAufTr.('Ausführung' := today())

    end

     

    Was ich versuchen möchte ist, dass bei Lastschriften automatisch ein Ausgleich eingestellt wird.

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Michael. Im zweiten Skript legst Du 8 Variablen an, die Du dann in der Schleife gar nicht benutzt. Die Schleife selbst legt nur eine, den Bedingungen gemäße Anzahl neuer Datensätze in der Tabelle "Zahlaufträge" an und weist dem Feld "Ausführung" den Wert today() zu. Du hast also x neue Datensätze mit einer Feldzuweisung und immer dem gleichen Ergebnis. 

    Zu Deiner Anfangsfrage. Es ist problemlos möglich, in Schleifen noch Fallunterscheidungen anzulegen. Sowohl if-else funktioniert, als auch switch case Abfragen. Und natürlich auch mehrfache Verschachtelungen. Das Problem ist bei komplexen Fällen, die Übersicht zu behalten über alle Bedingungen;-)

    Ich würde hier, um helfen zu können, mehr Informationen benötigen oder sogar die datenlose Tabelle. Gruß Mirko

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

    Hallo Mirko,

     

    wie kann ich denn eine leere Tabelle bereitstellen? Einfacher Export in CSV / Excel und dann die Daten löschen? Bezüglich des zweiten Skriptes hast Du völlig recht mit den Variablen.

     

    Gruß

     

    Michael

      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Michael Vielleicht geht es auch einfacher, aber meine Version wäre ein manuelles Backup zu machen, download der Datei, die Datei importieren und dann in den Tabellen die Datensätze löschen (re Mausklick auf die Datensatznummerierung im Tabellenmodus - alles markieren - löschen), wieder Backup und download, jetzt hast Du eine leere Datenbank, dann gibt es jetzt im Forum die Möglichkeit Anhänge zu senden (Büroklammer). Aber keine Eile, muß eh noch arbeiten ;-)

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

    Hallo Mikro,

     

    hier ein paar Hintergrundinformationen: Entstanden ist das alles weil ich meine Verträge verwalten wollte. Im Bereich der Vertragsverwaltung gibt es einen TAB Zahlungsverpflichtung. Hier wird grob verzeichnet was monatlich an Kapital benötigt wird. War aber eher suboptimal. Ich habe dann eine neue Tabelle geschaffen, in der ich die Daten hinein kopiere, um einen Ort zu haben an dem alle Rechnungen stehen.

    Mit dem Skript übertrage ich die Daten: 

     

    let my := this;
    let myVertragsNr := 'Vertrags-Nr.';
    let myZVP := 'ZVP-ID';
    let myRgDat := last(select Zahlungsverpflichtung where Vertragsmanagement.'Vertrags-Nr.' = myVertragsNr).'Fälligkeit';
    let myRgBetrag := last(select Zahlungsverpflichtung where Vertragsmanagement.'Vertrags-Nr.' = myVertragsNr).Zahlungsverpflichtugnsbetrag;
    let myZW := text(Zahlweg);
    let myRgPos := last(select Zahlungsverpflichtung where Vertragsmanagement.'Vertrags-Nr.' = myVertragsNr).Beschreibung; if Vertragsstatus != 2 then

    alert("Der ausgewählte Vertrag verfügt nicht über den richtigen Status, um an den Rechnungslauf übertragen zu werden!")
    else

    if Vertragsstatus = 2 then if ABO = 1 then

    let myChoise := dialog("ABO-Vorgänge", "Es kann leider kein ABO-Vorgang angelegt werden, da bereits am " + 'ABO-Datum' + " ein ABO- Vorgang mit der ID: " + 'ZVP-ID' + " zum Vertrag " + 'Vertrags-Nr.' + " angelegt wurde. Soll der bereits vorhandene ABO-Vorgang storniert werden?", ["ABO- Vorgang stornieren", "Abbruch"]);

    switch myChoise do
    case "ABO-Vorgang stornieren":

    (
    for i in select Rechnungen where 'ZVP-ID' = myZVP do

    delete i end;

    ABO := 0;
    'ABO-Datum' := " ";
    alert("Die alten Abo-Daten wurden gelöscht.")

    )
    case "Abbruch":

    alert("Der ABO-Vorgang mit der ID: " + myZVP + " vom " + 'ABO-Datum' + " wurde nicht storniert!")

    end else

    let newRg := (create Rechnungen); newRg.('Erfasst am:' := today()); newRg.('Rg.-Dat.:' := myRgDat); newRg.(Zahlungsart := myZW); newRg.('ZVP-ID' := myZVP); newRg.('Rg-Nr.:' := "Abo"); newRg.('Vertrags-Herkunft' := 1);

    let newRgPos := (create Rechnungsposition); newRgPos.(Rechnungen := newRg); newRgPos.(Betrag := myRgBetrag); newRgPos.(Bezeichnung := myRgPos); popupRecord(newRg);

    ABO := 1;

    'ABO-Datum' := today() end

    end end

     

    Dies ist dann quasi eine Vorlage, um monatlich  die Vorlage auszuführen. Für das Ausführen habe ich das Skript:

     

    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 c := cnt(select Rechnungen where year('Erfasst am:') = y) + 1;
    for i in select Rechnungen where 'Rg-Nr.:' = "Abo" and Vertragsmanagement.Vertragsstatus = 2 do

    let new := duplicate(i);
    new.('Rg.-Dat.:' := myRD);
    new.('Rg-Nr.:' := "Abo-Vorgang");
    new.('Rechnung-ID:' := "RE-" + y + "-" + format(c, "0000")); Zaehler := cnt((select Rechnungen)['Rg-Nr.:' = "Abo-Vorgang" and

    format('Rg.-Dat.:', "MM") = myRM]);
    RechSum := sum((select Rechnungen)['Rg-Nr.:' = "Abo-Vorgang" and

    format('Rg.-Dat.:', "MM") = myRM].Zahlbetrag)
    end;
    let CC := "======== Voreinstellung für Rechnungsmonat hochzählen ======";
    if substr(myMonat, 5, 2) = 12 then

    let myJahr := number(text(Jahr)) + 1; Jahr := text(myJahr);
    Monat := "Januar"

    else
    Monat := monthName(number(Monat) + 1)

    end;
    let CC := "============= Datensatz für Rechnungslauf erzeugen ======="; let newRL := (create 'Rechnungslauf-Protokoll');
    newRL.('für Monat' := myMonat);
    newRL.('Rg-Dat' := myRD);
    newRL.('Anzahl Rechnungen' := Zaehler);
    newRL.(Gesamtbetrag := RechSum)

     

    Hier wird über ein Dashboard die Steuerung vorgenommen und in einer weiteren Tabelle das Protokoll geschrieben.

     

    Das was ich möchte ist, dass bei einem Kopieren der Daten vom Vertragsbereich in den Rechnungsbereich 'Rechnungen' dabei sind, die mit Lastschrift gekennzeichnet sind. somit wäre es schön, wenn beim monatlichen Lauf in der Untertabelle Zahllauf/Zahlaufträge hier automatisch die Untertabelle gefüllt wird, damit der Status des Vorganges auf bezahlt und nicht auf noch offen steht

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

    Hallo Mirko,

     

    ich habe nach Deinem Hinweis die DB geleert. Bitte nicht wundern, da sind viele Themen angerissen, ist mein kleines on going Projekt.

     

    Gruß + Danke

     

    Michael

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Michael. Mein Respekt. Eine tolle und sehr durchdachte Datenbank. Ich würde einige Zeit brauchen um Deine Gedankengänge nachvollziehen zu können. Als notorisch fauler habe ich Dir mal einen Vorschlag zu machen, der Dein Skript nicht noch umfangreicher macht und vielleicht liege ich ja mit dieser Lösung daneben, aber wer weiß. Schreibe doch bitte in das Feld "Status" in der Tabelle "Rechnung" den folgenden geänderten Code: 

    if 'Rg-Nr.:' = "Abo" and Zahlungsart = 2 then
    styled(text("erledigt"), "lightblue", "blue", "")
    else
    if 'Rg-Nr.:' = "Abo" then
    styled(text("Vorlage"), "green", "blue", "")
    else
    if 'Noch offen' = Zahlbetrag then
    styled(text("noch offen"), "pink", "red", "")
    else
    if 'Noch offen' = 0 then
    styled(text("bezahlt"), "lightgreen", "green", "")
    else
    if 'Noch offen' < 0 then
    styled(text("überzahlt"), "lightpurple", "purple", "")
    else
    styled(text("Teilzahlung"), "lightyellow", "darkorange", "")
    end
    end
    end
    end
    end
    • Michael.3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    oh man! Da habe ich wieder viel zu kompliziert gedacht. Das über den Status zu regeln ist genial, denn im Grunde ist bei einem Lastschrift / Abbuchungsverfahren das Einstellen eines Zahlauftrages obsolet.

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

    Die DB ist letztes Jahr während Corona entstanden. Es kam immer wieder ein Stückchen dazu, durch ausprobieren, Denkanstöße aus dem Forum bzw. adaptierter Code. Kann sicherlich eleganter geschrieben werden. 😎