Inaktiv [gelöst] Fehlerhafte Ausgabe von GetVar() / Zwischensumme bilden

ThorstenR1

Aktives Mitglied
31. März 2017
38
9
Moers
JTL WaWi Version: 1.2.2.5
OS: Windows 7 Professionell 64 Bit
Problem: Werte werden im List & Label Editor angezeigt, im produktiven Druck nicht.

Um an beliebiger Stelle im Angebot/Auftrag/Rechnung etc. eine Zwischensumme anzeigen zu lassen, benutze ich den Hilfsartikel "Zwischensumme". Ich prüfe in den Druckvorlagen, ob aktuelle Position dieser Artikel ist, und zeige anstelle der Artikelposition die Zwischensumme an, Formel:
Code:
sum(Auftragspositionen.BruttopreisGesamt,false)
Das funktioniert einwandfrei.

Um nun separate Zwischensummen anzeigen zu lassen, in denen die Positionen bis zur letzten Zwischensumme nicht berücksichtigt werden, habe ich ähnliches mit einer "Abschnittssumme" gemacht. Formel:
Code:
(sum(Auftragspositionen.BruttopreisGesamt,False)- GetVar("iABS_Wert")) + (SetVar("iABS_Wert", sum(Auftragspositionen.BruttopreisGesamt, False), False))
Ich benutze hier eine Variable, die mit SetVar gefüllt und mit GetVar ausgelesen wird.
Auch das funktioniert einwandfrei, allerdings nur in der Vorschau im List & Label Editor. Beim echten Druck bzw. Vorschau wird der Wert der ersten "Abschnittsumme" nicht gedruckt.

Editor - Wert wird angezeigt:
Editor.jpg

Produktiv - Wert nicht angezeigt

Produktiv.jpg
 
Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
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
 

Anhänge

  • Vorlage_AbschnittZwischenSummen_Beispiel_01072017.jpg
    Vorlage_AbschnittZwischenSummen_Beispiel_01072017.jpg
    107,1 KB · Aufrufe: 101
  • Vorlage_Auftrag_AbschnittZwischensumme_01072017_gutberle.vlg
    24,9 KB · Aufrufe: 59
Zuletzt bearbeitet:

ThorstenR1

Aktives Mitglied
31. März 2017
38
9
Moers
Hallo Ingmar,

vielen Dank für Deine ausführliche Antwort.

Ich habe dies fast 1:1 erfolgreich umgesetzt.

Dank Deiner Ausführungen war es nun einfach, Deinen Lösungsansatz auszubauen. Ich habe die SQL Abfragen soweit angepasst, dass nun auch die Artikelmengen und Rabatte berücksichtigt werden.

Ich habe dazu
Code:
SUM(fVKPreis)
gegen
Code:
SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100)))
ersetzt.

Außerdem wurden die Summen falsch berechnet, wenn im Auftrag ein Stücklistenartikel vorhanden war. Ich habe dies gelöst, in dem ich
Code:
ToString$(Count(Auftragspositionen.InterneAuftragspositionnummer, false))
gegen
Code:
ToString$(Auftragspositionen.Sortierung)
ersetzt habe.

Da meine Artikelnummern anders lauten, habe ich diese natürlich auch entsprechend geändert.

txtzws = Zwischensumme
txtabs = Abschnittsumme

Meine vollständigen Abfragen lauten nun:

Code:
@Abschnittsbrutto
LocCurr$(JTL_DirectQuery("SELECT SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100))) FROM tbestellpos WHERE nSort>ISNULL((SELECT TOP 1 nSort FROM tbestellpos WHERE nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND cArtNr='txtabs' AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)+" ORDER BY nSort DESC),0) AND nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))

Code:
@AbschnittsNetto
LocCurr$(JTL_DirectQuery("SELECT SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100))) FROM tbestellpos WHERE nSort>ISNULL((SELECT TOP 1 nSort FROM tbestellpos WHERE nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND cArtNr='txtabs' AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)+" ORDER BY nSort DESC),0) AND nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))

Code:
@ZwischensummeBrutto
LocCurr$(JTL_DirectQuery("SELECT SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100))) FROM tbestellpos WHERE nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))

Code:
@ZwischensummeNetto
LocCurr$(JTL_DirectQuery("SELECT SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100))) FROM tbestellpos WHERE nSort<"+ToString$(Auftragspositionen.Sortierung)+" AND tBestellung_kBestellung="+ToString$(Vorgang.InterneAuftragsnummer)))


Da ich bei allen "Textartikeln" ein "txt" in der Artikelnummer voranstelle, habe ich auch die Variable @doNotShow entsprechend geändert. Das spart das Aufzählen aller Textartikel:
Code:
@doNotShow
contains(Auftragspositionen.Artikelnummer,"txt")

Vielen Dank für Deine Hilfe. Ich hoffe, es gibt es noch mehr User, die mit dieser Lösung etwas anfangen können!

Gruß
Thorsten
 
Zuletzt bearbeitet:

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
Tatsächlich ist das der erste Punkt oben von @ThorstenR1 sehr wohlwollend formuliert, denn tatsächlich habe ich beim früh-samstäglichen Testen in Wawi und Datenbank wohl einen koffeinfreien Kaffee erwischt.
Die Tabelle tbestellpos enthält nämlich ausschließlich die Einzelpreise der Artikel und mir ist das nur deshalb nicht sofort aufgefallen, weil ich überall Anzahl=1 verwendet habe, döööhhh... - Die Formel ...
Code:
SUM(nAnzahl*(fVKPreis-(fRabatt*fVKPreis/100)))
... ist also nicht nur eine Änderung, die @ThorstenR1 "zu seinem Vorteil" gemacht hat, sondern ohne diese Änderung war's auch schlicht falsch... :oops:

@ThorstenR1 - Ich finde das Ganze Thema in der Summe so interessant, dass ich es cool fände, wenn hier am Ende eine Proto-Vorlage stehen würde, die es Anderen erlaubt, das Ganze mit möglichst wenig Aufwand bei sich umzusetzen. Willst Du mal eine solche Proto-Vorlage posten, oder soll ich meine eigene fehlerbereinigen und mit Deinen Änderungen aufpeppen, zumindest mit den massentauglichen Änderungen?

Gruß,
Ingmar
 
  • Gefällt mir
Reaktionen: musikfast

ThorstenR1

Aktives Mitglied
31. März 2017
38
9
Moers
Gerne würde ich die Vorlage hochladen, aber leider tritt dabei immer ein nicht nachvollziehbarer Fehler auf...
 
Zuletzt bearbeitet:
Ähnliche Themen
Titel Forum Antworten Datum
Neu gelöst: Update von 5.3.0 auf 5.3.1 - Dateien hochgeladen - immernoch alte Version Gelöste Themen in diesem Bereich 6
Neu [Gelöst] IT Rechtskanzlei AGB Plugin Fehler "Plugin wurde nicht gefunden" Plugins für JTL-Shop 4
Neu gelöst: PHP Abfrage Versandklasse und passendes Bild aussteuern Betrieb / Pflege von JTL-Shop 2
Neu fehlerhafte Zolldaten an Parcel.One, Lösung für Freipositionen (z.B. US Sales Tax) JTL-ShippingLabels - Fehler und Bugs 0
Verwiesen an Support Fehlerhafte Buchungen Bargeldservice JTL-POS - Fehler und Bugs 1
Neu Nach Migration auf JTL Shop 5 fehlerhafte PayPal Zahlungsmitteilungen Allgemeine Fragen zu JTL-Shop 0
Neu Ausgabe Kundengruppenattribute JTL-Shop 5.3 Allgemeine Fragen zu JTL-Shop 0
Ausgabe Lieferdatum auf Lieferantenbestellung JTL-Wawi 1.8 0
Neu Dot Liquid csv-Ausgabe: Abschneiden / Turncate Gelöste Themen in diesem Bereich 4
Neu Eigene Felder (Kunde) in csv-Datei per Ausgabe (Auftrag oder Lieferschein) Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Auftrag und Rechnung Ausgabe funktioniert nicht Client JTL 1.8.10.0 JTL-Wawi 1.8 9
Beantwortet #GEFUNDEN# Suche jemand , der uns eine (automatische) SQL Abfrage erstellen kann mit Mail Ausgabe Dienstleistung, Jobs und Ähnliches 2
Neu SQL Ausgabe der Varko-Auswahl eines Artikels, mehrsprachig Tabelle zwei mal auf sich Joinen? User helfen Usern - Fragen zu JTL-Wawi 5
Neu Dynamischen Parameter an BAT anfügen zur Ausgabe als Messagebox User helfen Usern - Fragen zu JTL-Wawi 1
Ausgabe per E-Mail geht plötzlich nicht mehr, Testmail aus Wawi aber schon JTL-Wawi 1.6 22
Neu SQL Abfrage wird mehrfach ausgeführt - Ausgabe in der Übersicht falsch Eigene Übersichten in der JTL-Wawi 8
Keine Erweiterung der Ausgabe trotz 1.8.10 JTL-Wawi 1.8 3
Beantwortet Artikel, Minusbuchung, keine Ausgabe Gelöste Themen in diesem Bereich 4

Ähnliche Themen