Neu Wieso funktioniert DividedBy unter diesen Umständen nicht?

Ahok

Gut bekanntes Mitglied
11. September 2023
345
17
Hallo zusammen,

weiß jemand warum das DividedBy im Code ganz unten nicht funktioniert? Sobald ich das in eine Mail schreibe, kommt diese leer an.
Code:
{% assign AnzahlVPE = item.fAnzahl | DividedBy: item.nVPEMenge | FormatNumber: 'N0' -%}

item.fAnzahl kommt aus der Tabelle Verkauf.tAuftragPosition und ergibt in meinem Testbeispiel 72,0000000000000.
item.nVPEMenge kommt aus der Tabelle dbo.tliefartikel und ergibt in meinem Testbeispiel 12,0000000000000.
Beide haben den Typ DECIMAL(25, 13).

Schreibe ich folgenden Code, kommt die Mail korrekt an:
Code:
{% assign AnzahlVPE = item.fAnzahl | DividedBy: 12 | FormatNumber: 'N0' -%}

Hier kommt es ebenfalls korrekt an:
Code:
{% assign AnzahlVPE = item.fAnzahl | DividedBy: item.fAnzahl| FormatNumber: 'N0' -%}

Hier ebenfalls:
Code:
{% assign AnzahlVPE = 72 | DividedBy: item.fAnzahl | FormatNumber: 'N0' -%}

Hier ebenfalls:
Code:
{% assign AnzahlVPE = item.nVPEMenge | DividedBy: 12 | FormatNumber: 'N0' -%}

Hier jedoch nicht:
Code:
{% assign AnzahlVPE = item.nVPEMenge | DividedBy: item.nVPEMenge | FormatNumber: 'N0' -%}

Und hier auch nicht:
Code:
{% assign AnzahlVPE = 72 | DividedBy: item.nVPEMenge | FormatNumber: 'N0' -%}

Was hat DotLiquid gegen nVPEMenge als Divisor? Vor allem wenn es sich um den gleichen Typ handelt wie fAnzahl, das aber ohne Probleme funktioniert?
 

John

Sehr aktives Mitglied
3. März 2012
4.219
1.093
Berlin
Verschachtelte Anweisungen sind keine gute Idee. Das geht regelmäßig schief.
Splitte das mal in Einzelschitte auf und lass dir ggf. die Zwischenergebnisse anzeigen.

Vielleicht ist item.nVPEMenge auch mal DBNULL? Ist ja keine Pflichteigenschaft eines Artikels...
 
  • Gefällt mir
Reaktionen: Ahok

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.873
562
@John hat einen sehr guten Tipp gegeben: nämlich die Variablen einzeln zu befüllen und Schritt für Schritt vorzugehen.
Ich gehe noch einen Schritt weiter und behaupte, dass alles was über ein einfaches "Gib an dieser Stelle die und die Variable aus" nicht gerade die Stärke von Liquid bzw. DotLiquid ist.
Liquid ist was es ist: eine Template Sprache, dazu gedacht, Werte aus einer Datenbank auszugeben. Es gibt wohl einige Filter, aber sobald es komplexer werden soll, wirds doof. Fehlermeldungen und ähnliches gibts nicht oder sind obskur. Auch sind die DotLiquid Filter nicht wirklich kaskadierbar.
Lange Rede, kurer Sinn. Mein Rat ist Berechnungen und ähnliches direkt von der Datenbank erledigen zu lassen. Und dann das Ergebnis per DotLiquid ausspielen, denn das kann DotLiquid gut.

Also sowas in der Art:
Code:
{% capture query -%}
select ...
{% endcapture -%}
{% assign wert = query | DirectQueryScalar -%}
{{ wert }}
 
  • Gefällt mir
Reaktionen: Ahok

Ähnliche Themen