for i in select ... verschachteln mit if then else?
Hallo!
Kann man innerhalb einer Schleife noch eine Fallunterscheidung unterbringen?
Gruß
Michael
9 Antworten
-
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.
-
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
-
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
-
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 thenalert("Der ausgewählte Vertrag verfügt nicht über den richtigen Status, um an den Rechnungslauf übertragen zu werden!")
elseif 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 dodelete 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 dolet 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" andformat('Rg.-Dat.:', "MM") = myRM]);
RechSum := sum((select Rechnungen)['Rg-Nr.:' = "Abo-Vorgang" andformat('Rg.-Dat.:', "MM") = myRM].Zahlbetrag)
end;
let CC := "======== Voreinstellung für Rechnungsmonat hochzählen ======";
if substr(myMonat, 5, 2) = 12 thenlet 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
-
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
-
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
-
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.
-
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.
Content aside
- vor 2 JahrenZuletzt aktiv
- 9Antworten
- 206Ansichten
-
1
Folge bereits