Gelöst [WAWI-16430] [WAWI-20025] DotLiquid: Abfrage gibt seltsamen String aus

SebiW

Sehr aktives Mitglied
2. September 2015
2.420
1.013
Hallo zusammen,
ich komme wohl gerade wieder einmal an meine DotLiquid Grenzen und wollte fragen ob einer von Euch vielleicht behilflich sein kann.

Ich bastele an einer automatischen Kalkulation. In Schritt 1 möchte ich erstmal nur Vorschalgswerte erzeugen. Dazu setze ich mit folgender erweiterten Eigenschaft einen Wert in ein Funktionsattribut der Klasse "Preis":

{% assign EK = Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | FormatNumber: 'N4', 'de-DE' -%}
{% if EK <= 0,01 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 9 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,01 and EK <= 0,02 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 6.5 | FormatNumber: 'N4', 'de-DE'}}
.
.
.
{% else -%}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 2.17 | FormatNumber: 'N4', 'de-DE'}}
{% endif %}

Daraus ableitend wollte ich nun in einem weiteren Workflow einen Mindestabverkaufspreis in ein weiteres Funktionsattribut vom Typ Preis folgendermaßen setzen:

{{Vorgang.Attribute.Global.Autokalkulation.KALK-Abverkauf.Einsprachig | Times: 0.79 | FormatNumber: 'N4', 'de-DE'}}

Allerdings ist der Wert, der hier aus Vorgang.Attribute.Global.Autokalkulation.KALK-Abverkauf.Einsprachig ausgelesen wird eine 15stellige Zahl. Ich vermute mir fehlt hier nur irgendein Parameter? Der Wert beim Artikel öffnen und in allen sonstigen Abgleichen sieht richtig aus und funktioniert problemlos.

Ich habe ein ähnliches Problem hier dokumentiert gefunden:
https://forum.jtl-software.de/threa...eines-artikels-vom-typ-fliesskommazahl.98022/

Ist das tatsächlich ein Bug?
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
@SebiW - Dann würde ich Dich bitten, hier Deinen kompletten DotLiquid Code zu posten, denn dann probiere ich gerne schnell durch, ob das Problem in der 1.3.3.0 tatsächlich gelöst ist...
 

SebiW

Sehr aktives Mitglied
2. September 2015
2.420
1.013
Hi Gutberle, klar kein Problem:

Als Vorarbeit habe ich zwei Funktionsattribute des Datentyps "Preis" mit den Namen KALK-Mindestpreis und KALK-Abverkauf erzeugt. Diese befülle ich in zwei Schritten. KALK-Mindestpreis befülle ich so:

{% assign EK = Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | FormatNumber: 'N4', 'de-DE' -%}
{% if EK <= 0,01 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 9 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,01 and EK <= 0,02 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 6.5 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,02 and EK <= 0,04 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 5 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,04 and EK <= 0,1 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 4 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,1 and EK <= 0,5 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 3 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 0,5 and EK <= 1 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 2.3 | FormatNumber: 'N4', 'de-DE'}}
{% elsif EK > 1 and EK <= 5 %}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 2.2 | FormatNumber: 'N4', 'de-DE'}}
{% else -%}
{{Vorgang.Allgemein.PreiseEinheiten.Ø_Einkaufspreis-Netto | Times: 2.17 | FormatNumber: 'N4', 'de-DE'}}
{% endif %}

In einem zweiten Workflow Schritt lese ich dann das Feld aus um es modifiziert in KALK-Abverkauf zu schreiben:

{{ Vorgang.Attribute.Global.Autokalkulation.KALK-Mindestpreis.Einsprachig | TIMES: 0.66 | FormatNumber: 'N4', 'de-DE'}}

In meinem Beispiel Artikel wird hier aus dem Wert 7,92 entspannt die Zahlt 792.000.000.000.000,0000

Da ich jetzt mit der Umsetzung dieses Systems nicht beliebig warten kann werde ich wohl mit einem Freitextfeld arbeiten müssen. Das macht die ganze Geschichte gleich nochmal komplizierter, sehr unfein. Jetzt dachte ich endlich das letzte große Problem der Wawi für uns behoben zu haben und dann grätscht so ein Mist dazwischen, verdammich :(
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
Hallo @SebiW,

an Deinen DotLiquid Künsten liegt es nicht, das Einzige, was Du am oberen Teil noch verbessern kannst, ist hinten am Ende der {% elseif ... %} Zweige jeweils ein "-" zu ergänzen, denn aktuell wird vor dem eigentlichen Preis noch eine Leerzeile erzeugt. Das schluckt der Workflow aber wie's scheint auch wie es aktuell ist, der Vorschlag ist also eher "kosmetisch", oder sagen wir mal "hygienisch" ... ;)

Das Funktionsattribut KALK-Mindestpreis wird bei mir sowohl in der 1.2.3.7 wie auch in der 1.3.3.0 BETA2 korrekt gesetzt, aber da wo die 1.2.3.7 bei der Abfrage des KALK-Mindestpreis Wertes noch immer eine ~verdammt große Zahl~ mit 12 Nullen vor dem Komma daraus macht, ist (zumindest) dieser Fehler in der 1.3.3.0 BETA2 behoben.

Aber zu früh gefreut, denn was auch in der 1.3.3.0 BETA2 nicht funktioniert ist das Multiplizieren des Wertes mit 0.66. Egal, was ich für einen Teiler nehme, also Dezimal- oder Ganzzahl, um auch das zu prüfen ...
Code:
{{ Vorgang.Attribute.Global.Autokalkulation.KALK-Mindestpreis.Einsprachig | TIMES: 0.66 | FormatNumber: 'N4', 'de-DE'}}
... der Rückgabewert ist und bleibt immer gleich dem aus KALK-Mindestpreis gelesenen Originalwert.

@Rico Giesler - Hier ist definitiv ein Bug Zuhause. Soll ich das im Rahmen des Pilotprogramms berichten, oder willst Du das prüfen und dann ggfls. intern machen?

Gruß,
Ingmar
 

SebiW

Sehr aktives Mitglied
2. September 2015
2.420
1.013
Hallo Gutberle,

danke für Dein Feedback. Da das meine erste größere DotLiquid Aktion ist lag es erstmal Nahe von einem Fehler meinerseits auszugehen. Gut zu wissen, dass ich erstmal grundsätzlich nichts falsch gemacht habe.

Danke auch für Deinen Tip mit dem -%, ich hab mich wirklich schon gewundert wo das her kam, mir jetzt aber einfach mit nemm Zwischenworkflow geholfen gehabt:

{{ Vorgang.Attribute.Global.Autokalkulation.KALK-Mindestpreis.Einsprachig | StripNewlines }}

Wenn Du vielleicht noch 2 Tipps für mich hättest wäre ich enorm dankbar:
Wie krieg ich denn das Leerzeichen nach dem Datenfeld weg? Derzeit sieht die Ausgabe bei mir so aus:
"7,9200
"
und wenn ich mir obigen Workaround sparen kann spar ich ihn mir lieber. Ich vermute da fehlt am Ende des Datenfeldes einfach noch ein Endzeichen, richtig?

Und zweitens:
Eigentlich hatte ich vor die Ergebnisse gleich noch zu runden, dann in eine csv zu schreiben und via Ameise automatisch wieder importieren zu lassen (da man ja, warum auch immer, nur den Nettopreis via Workflow setzen kann).
Dazu hatte ich eigentlich die nötigen Funktionen ceil / floor und round ausgemacht. Ich kriege die aber ums verrecken nicht zum funktionieren. Sind die in JTL vielleicht gar nicht implementiert? Spätestens dann wirds mit der Autokalkulation langsam aber sicher wirklich schwierig...
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
@SebiW - Das Leerzeichen hinter dem Wert ist auch noch ein Newline und die grundsätzliche Regel lautet, dass alle Zeilen, die bei ihrer Ausgabe KEIN Newline erzeugen sollen, mit einem "-" abgeschlossen werden, das gilt also auch für Deine Zuweisungen. Hinter jedes "... DE'" muss also noch ein "-".

Die DotLiquid Funktionen round, ceil und floor (siehe hier) scheint es in der Wawi tatsächlich nicht zu geben, genau wie auch alle andere Math Filter aus der Liquid Sprache. Wenn Du im Editor Fenster hinter Deiner Variable nur ein "|" eingibst und dann einen (kurzen) Moment wartest, dann wird Dir ja ein Intellisense Fenster mit allen verfügbaren Funktionen angezeigt. Dort sind die drei aber natürlich auch nicht dabei, was extrem schade ist, aber dieses Fenster erspart Dir zumindest das Rätselraten.

Ich mache es normalerweise so, dass ich mir damit behelfe, das ganze in SQL nachzubilden, denn dort gibt es natürlich mit CEILING(Value2Ceil), FLOOR(Value2Floor) und ROUND(Value2Round,Decimals2Round) die notwendigen Funktionen. Das jetzt aber hier auszuführen, geht an einem Arbeitstag mit (gottseidank) eingehenden Aufträgen leider nicht. - Vielleicht finde ich Heute Abend die Zeit, Dir hier ein paar Beispiele zu posten ... ;)
 
Zuletzt bearbeitet:

SebiW

Sehr aktives Mitglied
2. September 2015
2.420
1.013
Hallo Gutberle,

danke nochmal für Deine Hilfe. Ich habs ja schon fast befürchtet, aber gut zu wissen, dass ich im Endeffekt an dieser Stelle mit der Arbeit aufhören kann. Von SQL Aktionen in einer erweiterten Eigenschaft habe ich leider keinerlei Ahnung.

Leider sind auch die Rundungsgruppen in der Ameise für uns nicht zu gebrauchen, da ein Gutteil unserer Artikel unter 10 Euro kostet und hier schlicht eine "Runde auf auf x,x9" Rundung fehlt.
Die Preiskalkulation in JTL bleibt also für uns weiterhin ein Drama, dass sich dank ständig variierender EKs immer weiter verschärft. Mist.

Wieso eine sonst do flexible und moderne Wawi eine solch RIESEN Lücke hat erschließt sich mir absolut nicht.
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.292
395
Hi @SebiW,

ok, hier also nun wie versprochen ein paar Beispiele, wie man mit SQL Queries die in JTL's DotLiquid Implementierung fehlenden Funktionen ceil, floor und round "nachrüsten" kann. Erst kommen drei Code-Stücke, die jeweils einen der Werte zurückliefern und danach noch eine ökonomischere Variante, die alle drei Werte gleichzeitig berechnet und zurückliefert ...

CEILING(<Value>)
Code:
{% assign Value = Vorgang.Allgemein.PreiseEinheiten.VK-Brutto | FormatNumber: 'N14','en-US' -%}
{% assign CeilValue = 'SELECT CEILING(' | Append: Value | Append: ')' | DirectQueryScalar -%}

CeilValue({{ Value }})={{ CeilValue }}
>> CeilValue(5.39070024967194)=6
FLOOR(<Value>)
Code:
{% assign Value = Vorgang.Allgemein.PreiseEinheiten.VK-Brutto | FormatNumber: 'N14','en-US' -%}
{% assign FloorValue = 'SELECT FLOOR(' | Append: Value | Append: ')' | DirectQueryScalar -%}

FloorValue({{ Value }})={{ FloorValue }}
>> FloorValue(5.39070024967194)=5
ROUND(<Value>,<Decimals>)
Code:
{% assign Value = Vorgang.Allgemein.PreiseEinheiten.VK-Brutto | FormatNumber: 'N14','en-US' -%}
{% assign Decimals = '2' -%}
{% assign RoundValue = 'SELECT ROUND(' | Append: Value | Append: ',' | Append: Decimals | Append: ')' | DirectQueryScalar -%}

RoundValue({{ Value }},{{ Decimals }})={{ RoundValue | FormatNumber: 'N2','de-DE' }}
>> RoundValue(5.39070024967194,2)=5,39

Zur Funktion:

1. In der ersten Zeile lade ich meine Wunschvariable aus DotLiquid, hier also den VK-Brutto meines Artikels in eine Variable namens "Value" und formatiere sie gleich mit 14 Nachkommastellen und im US Format. Das klingt dämlich, aber was ich hier tatsächlich mache, ist die Variable so zu belassen, wie sie in der Datenbank vorliegt, nur eben als String, also als Text und mit Dezimalpunkt, denn so braucht es die SQL Abfrage.
2. Bei der ROUND() Funktion definiere ich in der zweiten Zeile noch die Dezimalstellen, auch als String=Text.
3. Dann stückele ich mir den SQL Query-String zusammen, bei CEILING() und FLOOR() noch nur mit Klammern um den Wert "Value" bei ROUND() auch noch mit den Dezimalstellen, mit Komma getrennt. Das ganze ergibt aber nur einen einfachen Textstring, der dann auch gleich über "DirectQueryScalar" als SQL Befehl ausgeführt wird.
4. In der jeweils letzten und etwas abgesetzten Zeile gebe ich das Ganze formatiert aus. Das sieht vielleicht kompliziert aus, sieht aber nur so aus, weil ich eine ganze Zeile mit Definition und Wert ausgeben. In Wirklichkeit wird der CeilValue z.B. völlig normal nur mit {{ CeilValue }} ausgegeben, die anderen ebenso einfach.

Ökonomischere Variante ...

Und hier noch eine Variante, bei der gleichzeitig alle drei Werte berechnet und dann zusammen in einer einfach abzufragenden Struktur zurückgeliefert ...
Code:
{% assign Value = Vorgang.Allgemein.PreiseEinheiten.VK-Brutto | FormatNumber: 'N14','en-US' -%}
{% assign Decimals = 2 -%}
{% capture query -%}
SELECT CEILING({{ Value}}) CeilVal, FLOOR({{ Value}}) FloorVal, ROUND({{ Value}},{{ Decimals }}) RoundVal
{% endcapture -%}
{% assign SQLValues = query | DirectQuery -%}
Wie Du siehst, ist die eigentliche Abfrage aller drei Werte in einer einzigen SQL Abfrage eigentlich sogar kürzer und leichter zu verstehen. Das liegt daran, dass ich hier mit dem DotLiquid Befehl "capture" arbeite, der es mir erlaubt, Text viel einfacher aus einzelnen Teilen zusammenzustückeln.

Die Werte werden dann wie folgt abgefragt ...
Code:
Value={{ Value }}
>> Value=5.39070024967194
Decimals={{ Decimals }}
>> Decimals=2
CeilVal({{ Value }})={{ SQLValues.Daten[0].CeilVal }}
>> CeilVal(5.39070024967194)=6
FloorVal({{ Value }})={{ SQLValues.Daten[0].FloorVal }}
>> FloorVal(5.39070024967194)=5
RoundVal({{ Value }},{{ Decimals }})={{ SQLValues.Daten[0].RoundVal | FormatNumber: 'N2','de-DE' }}
>> RoundVal(5.39070024967194,2)=5,39

Die Abfrage dieser Werte gestaltet sich ein bißchen anders, weil hier ein Vektor von Werten zurückgegeben wird. Deshalb greift man hier z.B. mit SQLValues.Daten[0].CeilVal auf den Ceiling Wert zu. Ist ja aber auch einfach, oder? ;)

Gruß,
Ingmar
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SebiW

SebiW

Sehr aktives Mitglied
2. September 2015
2.420
1.013
Wo Gutberle,

vielen Dank für diesen riesen Block Information. Zu meinem Erschrecken scheine ich sogar teilweise zu begreifen wie ich das umsetze :D

Im Ernst, Wahnsinn, danke. Sieht so aus als würde ich meine Autokalkulation doch noch umsetzen können.

Vielen, vielen Dank!
 
Ähnliche Themen
Titel Forum Antworten Datum
Wawi Pickliste und WMS Pickliste Kombinieren JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 0
Serverproblem? Unerträglich langsames Tempo der Wawi 1.7.11.0 - seit gestern abend JTL-Wawi 1.7 0
Neu 2 JTL-Shops (B2B + B2C) in der Wawi User helfen Usern - Fragen zu JTL-Wawi 3
[JTL-WAWI API] Fragen zur Dokumentaion JTL-Wawi 1.8 2
Neu Umsatzreport nach Quartal aus der Wawi (1.5.55) User helfen Usern - Fragen zu JTL-Wawi 6
Neu JTL Wawi 1.8: Globale Vorlagensets, bedingte Mailanhänge? Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Lieferantenretouren - siehe https://issues.jtl-software.de/issues/WAWI-14278 JTL-Wawi - Ideen, Lob und Kritik 0
Mit Wawi nur auf dem Server arbeiten oder auf Server-Client Betrieb umstellen? JTL-Wawi 1.8 4
Neu JTL Wawi berücksichtigt bei Bestellvorschlag indirekten Zulauf aus angemeldeter Retoure nicht JTL-Wawi - Ideen, Lob und Kritik 0
JTL-WAWI API: Authorization has been denied for this request. (Keine Rechte) JTL-Wawi 1.8 11
Wawi Datenbank Zertifikat abgelaufen JTL-Wawi 1.8 10
Rechnungserstellung verschiedener Firmierungen innerhalb eines Wawi Mandanten JTL-Wawi 1.6 4
JTL WAWI 1.8.12.2 Shopware 6 / Connector Abgleich Fehler Gelöste Themen in diesem Bereich 3
Neu Wawi 1.8: Was tun, wenn die Listanzeigen waagerecht durchlaufen? JTL-Wawi - Fehler und Bugs 3
Neu Wawi 1.9.4.0 Ausgabe ohne Funktion JTL-Wawi - Fehler und Bugs 1
Fehlermeldung bei JTL-Connector/JTL-Wawi WooCommerce-Connector 1
JTL WaWi Download nicht möglich JTL-Wawi 1.8 3
Neu Shopware 5 Bilder werden nicht übertragen nach Update auf Wawi 1.7.15.6 Shopware-Connector 0
Neu Wie kann ich mit der Wawi Ebay Rechnungen erstellen und nach ebay hochladen? eBay-Anbindung - Fehler und Bugs 3
Neu 👉 JTL-Wawi 1.9 Open Beta Release - Aktuell 1.9.4.0 Releaseforum 1
Artikel per Ameise mehreren Kategorien zuordnen - Artikeldatenimport in WaWi nicht mehr vorhanden JTL-Wawi 1.8 6
Artikelbeschreibung standardisiert von JTL-Wawi ziehen - Positionsname JTL-Wawi 1.8 11
Neu Der Shop schickt die Aufträge nicht mehr an die Wawi JTL-Shop - Fehler und Bugs 1
Verwendung der Statistik in Wawi 1.8: JTL-Wawi 1.8 3
Download Wawi Version 1.8.5.1 JTL-Wawi 1.8 5
Neu Änderung Kundennummern in WaWi - welche Auswirkungen? Gelöste Themen in diesem Bereich 3
Neu Datenmigration von anderer WaWi auf JTL-WaWi Starten mit JTL: Projektabwicklung & Migration 12
Beschaffung Bestandsplanung in JTL Wawi 1.8.10 JTL-Wawi 1.8 0
Neu Workflow bei Login in WMS / WAWI starten User helfen Usern - Fragen zu JTL-Wawi 10
Neu JTL POS wird nicht an WaWi angebunden Einrichtung / Updates von JTL-POS 2
Neu JTL Shop 5 Daten - In "leere" JTL Wawi Datenbank importieren - Ist das möglich? User helfen Usern - Fragen zu JTL-Wawi 8
Neu Woocomnerce Aufträge werden in WAWI erstellt aber nicht als bezahlt markiert Gelöste Themen in diesem Bereich 3
Neu ecomdata down? Hosting JTL Wawi nicht erreichbar User helfen Usern - Fragen zu JTL-Wawi 46
Kennzahlen Übersicht für JTL Wawi - Wirtschaftliche Auswertung JTL-Wawi 1.8 0
[JTL-WAWI API] MandatoryApiScopes / OptionalApiScopes JTL-Wawi 1.8 3
Neu Migration Shopware 5 auf 6 mit JTL-Wawi ohne Datenverlust Shopware-Connector 1
Neu Datenumzug von Xentral ERP Software auf JTL-Wawi Schnittstellen Import / Export 4
Neu Suche Download JTL WAWI 1.3.20.0 User helfen Usern - Fragen zu JTL-Wawi 8
[JTL-WAWI API] Bestellung mit Stücklistenartikel JTL-Wawi 1.8 5
Neu JTL-Wawi 1.9 Open Beta User helfen Usern - Fragen zu JTL-Wawi 6
Neu Verkaufspreis Differenz Shop und Wawi JTL-Shop - Fehler und Bugs 4
Wie kann ich etwas in der WAWI Datenbank per SQL ändern? JTL-Wawi 1.8 2
Testmandantenumgebung in Wawi als Duplikat vom Echtzeitmandanten erstellen? JTL-Wawi 1.8 5
In Diskussion Zahlungsart Kartenzahlung bleibt in Wawi als Auftrag ohne Rechnung Allgemeine Fragen zu JTL-POS 4
Grundeinstellung WaWi Gramm statt Kilogramm JTL-Wawi 1.8 3
Neu Was steckt hinter der Zahl von 53 Bildern auf Ebay bei Variationsartikeln (und einer unsinnigen Fehlermeldung der Wawi)? eBay-Anbindung - Fehler und Bugs 5
Neu JTL Wawi [1.5.33] Startet nicht mehr JTL-Wawi - Fehler und Bugs 8
Neu Wechsel WAWI Hosting von JTL mit RDP auf ecomDATA User helfen Usern - Fragen zu JTL-Wawi 2
WAWI 1.8.12.0 stürzt ab, wenn die Verbindung zur Datenbank unterbrochen wurde JTL-Wawi 1.8 23
Neu Neue Oberfläche Wawi 1.8.12.2 (Beta) JTL-Wawi - Ideen, Lob und Kritik 0

Ähnliche Themen