Hallo Thorsten,
mit
SetVar() und
GetVar() wirst Du nicht glücklich werden, denn die sind entweder schon von Combit (List & Label) selbst oder aber von JTL fehlerhaft implementiert oder umgesetzt und man kann damit nicht arbeiten, weil sowohl die Initalisierung wie auch der Scope instabil sind. Das führt dann genau zu solchen Problemen wie Du sie hast.
Die gute Nachricht ist aber, dass eigentlich alles, was man mit
SetVar() und
GetVar() machen will auch direkt auf der Datenbank geht und meistens sogar viel einfacher - und das gilt auch hier und für Dein sehr interessantes Vorhaben.
Entsprechend benutze ich hier
JTL_DirectQuery() Konstrukte, um die Werte aus der Datenbank zu holen und das ist gerade hier besonders einfach, weil Deine Abschnittssummen- und Zwischensummen-Zeilen in der DB natürlich 0€-Werte enthalten, man kann sie beim direkten Summieren in der Datenbank also einfach ignorieren. Damit werden die SQL Queries noch einmal viel einfacher.
Da Du ja mit Hilfs-Artikeln für Deine Abschnitts- und Zwischensummen arbeitest, bietet es sich an, in den SQL Queries direkt darauf Bezug zu nehmen, denn dann kannst Du den jeweiligen Zeilen eine beliebige Bezeichnung geben, ohne dass die Erkennbarkeit der Artikel für die SQL Query leidet.
Da Du selbst keine angibst habe ich unten folgende Artikelnummern für die Hilfsartikel angenommen:
Abschnittssumme=BS-999997 und
Zwischensumme=BS-999998. Die änderst Du natürlich in den jeweiligen Codezeilen auf Deine eigenen Hilfsartikelnummern ab.
1. Abschnittsumme
Code:
LocCurr$(JTL_DirectQuery("SELECT SUM(fVKNetto) FROM tbestellpos WHERE nSort>ISNULL((SELECT TOP 1 nSort FROM tbestellpos WHERE nSort<"+ToString$(Count(Auftragspositionen.InterneAuftragspositionnummer, false))+" AND cArtNr='BS-999997' AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)+" ORDER BY nSort DESC),0) AND nSort<"+ToString$(Count(Auftragspositionen.InterneAuftragspositionnummer, false))+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))
Die einzige "Schwierigkeit" dabei ist, dass man von der letzten Abschnittsumme (oder vom Anfang) bis zur aktuellen Abschnittsumme summieren muß und dazu muß ich rückwärts suchen, was in der mit ISNULL() eingerahmten Subquery gemacht wird.
2. Zwischensumme
Code:
LocCurr$(JTL_DirectQuery("SELECT SUM(fVKNetto) FROM tbestellpos WHERE nSort<"+ToString$(Count(Auftragspositionen.InterneAuftragspositionnummer, false))+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))
3. Dann wäre da noch die Positionsnummer. Die wird bei Dir bei den Abschnitts- und Zwischensummen-Zeilen einfach weitergezählt, obwohl das ja keine Positionen sind. Das kann man leicht wie folgt ändern...
Code:
Fstr$(JTL_DirectQuery("SELECT COUNT(nSort) FROM tbestellpos WHERE nSort<"+ToString$(Count(Auftragspositionen.InterneAuftragspositionnummer, false)+1)+" AND cArtNr NOT IN ('BS-999997','BS-999998') AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)),"##&")
Hinweis: Will man das Problem mit den Positionsnummern auch für die Freipositionen lösen, die man ja manchmal als Kommentare oder als Bereichstrenner benutzen will, dann wäre das mit einer Mini-Erweiterung der Query auch lösbar, dann aber für die Freipositionen auf Basis von Erkennungsmerkmalen im Beschreibungstext, also mit weiteren Vergleichen auf bestimmte Wörter, die im Bezeichnungstext auftauchen können. Das ist immer ein bißchen heikel, denn wer sagt mir dass in keiner meiner Artikelbeschreibungen jemals die Wörter "Erklärung", "Information", "Erläuterung", etc. auftauchen werden. - Deshalb habe ich das für mich so gelöst, dass ich mir einfach einen weiteren Hilfsartikel für Kommentare angelegt habe und dessen Artikelnummer taucht dann bei mir in der Liste der Artikelnummern, auf die geprüft wird, mit auf...
Die Abfragen von oben würden jetzt aber in Deiner Vorlagen an zahlreichen Stellen auftauchen, was der Übersicht nicht zuträglich ist. Man legt den Code von oben deshalb am Besten in Benutzervariablen (Bereich
Projekt in der Vorlage) an, z.B. die Abschnittssumme als
@AbschnittNetto und in der Vorlage schreibst Du dann einfach nur noch @AbschnittNetto, was die Definition in der Benutzervariable referenziert, die daraufhin ausgeführt wird und den aktuellen Wert aus der Datenbank holt, Bingo!
Und da die Abfragen damit so schön aus dem Weg sind, kann man für den Fall, dass man manchmal Brutto (B2C) und manchmal Netto (B2B) braucht, gleich mehrere Varianten anlegen, um beim obigen Beispiel zu bleiben also
@AbschnittNetto und
@AbschnittBrutto, wobei bei den "Brutto" Variablen dann im Code von oben nur
SUM(fVKNetto) gegen
SUM(fVKPreis) ausgetauscht werden muss, fertig.
Und dann muss man in der Vorlage natürlich auch noch für fast jede Spalte der Tabellen abgefragt werden, ob es sich aktuell um eine Abschnittsummen-Zeile oder eine Zwischensummen-Zeile handelt, weil man dann keine Stückzahl, keine Artikelnummer, etc. ausgegeben bekommen möchte. Und zumindest an einer Stelle, nämlich bei der Ausgabe der Zeilen-Gesamtsumme, muss man dann doch noch genau wissen, ob es sich um eine Abschnittssumme oder eine Zwischensumme handelt.
Hierfür habe ich also drei weitere Benutzervariablen angelegt, die
@isAbschnittSumme,
@isZwischenSumme und
@doNotShow heißen und der Code hierfür ist ...
Code:
@isAbschnittSumme
Auftragspositionen.Artikelnummer="BS-999997"
Code:
@isZwischenSumme
Auftragspositionen.Artikelnummer="BS-999998"
... und ...
Code:
@doNotShow
StrPos("BS-999997,BS-99998",Auftragspositionen.Artikelnummer)>-1
Damit hast Du dann alles beisammen, was Du brauchst, um Deine Abschnittssummen und Zwischensummen leicht "zusammenzustöpseln". Grob gesprochen sind über die reine Definition der Benutzervariablen von oben hinaus nur noch drei Schritte hierfür nötig ...
1. Positionsnummer: Der aktuelle Code wird ersetzt durch....
Code:
Cond(@doNotShow,"",@PositionsNummer)
2. Alle weiteren Zeilen bis auf die Zeile mit der Artikelbezeichnung, die überhaupt nicht verändert wird und die Letzte mit der Zeilengesamtsumme, die komplett geändert wird, werden wie folgt eingebettet...
Code:
Cond(@doNotShow,"",<AlteVorlagenZeile>)
3. Die Zeile mit der Zeilen-Gesamtsumme wird komplett ersetzt und zwar durch...
Code:
Cond(@isAbschnittSumme,Cond(Vorgabe.NettoPreiseBenutzen,@AbschnittNetto,@AbschnittBrutto),
Cond(@isZwischenSumme,Cond(Vorgabe.NettoPreiseBenutzen,@ZwischenNetto,@ZwischenBrutto),
Cond(Vorgabe.NettoPreiseBenutzen,LocCurr$(Auftragspositionen.NettopreisGesamt),LocCurr$(Auftragspositionen.BruttopreisGesamt))))
Dann sieht das Ganze wie im angehängten Screenshot aus. Zum besseren Verständnis habe ich Dir auch noch meine Testvorlage angehängt. Dabei handelt es sich um eine ansonsten komplett unveränderte "Standard" Auftragsvorlage, in die ich lediglich die Modifikationen von oben eingepflegt habe, sonst nichts.
Ok, ich geb's zu, ein bißchen mehr Arbeit war das schon, als es gewesen wäre, wenn SetVar() und GetVar() funktionieren würden, aber dafür ist das hier endlos mächtiger und läßt sich auf vieles andere übertragen ...
Gruß,
Ingmar