Gelöst Suche Hilfe zum Thema Dotliquid / SQL / For-Schleife / Stückliste

MirkoWK

Sehr aktives Mitglied
14. März 2022
835
305
Hallo zusammen,

wir werden bald auf JTL umsteigen und sind noch in der Vorbereitungsphase. Bei dem folgenden Thema komme ich nicht zum Abschluss und verzweifle dabei gerade etwas.. 😅

Wir verkaufen Möbel, welche oft aus mehreren Teilen bestehen (Packstücke / Stückliste). Die Information zu den Packstücken (Anzahl, Maße, Gewicht) werden aktuell in einem String an unser Shopware gesendet, welches diese Informationen dann dem Kunden im Frontend anzeigt.

Nun versuche ich diesen String per JTL Workflow mit Dotliquid und SQL-Query zu reproduzieren:

Hier meine erweiterte Eigenschaft:
Code:
{% capture query -%}
SELECT
    tArtikelBeschreibung.cName AS 'name',
    CAST(tStueckliste.fAnzahl AS decimal(18,2)) AS 'quantity',
    CAST(aname.fHoehe AS decimal(18,2)) AS 'height',
    CAST(aname.fBreite AS decimal(18,2)) AS 'width',
    CAST(aname.fLaenge AS decimal(18,2)) AS 'length',
    CAST(aname.fArtGewicht AS decimal(18,2)) AS 'weight'
FROM
    dbo.tArtikel
    INNER JOIN dbo.tStueckliste ON tStueckliste.kVaterArtikel = tArtikel.kArtikel
    INNER JOIN dbo.tArtikel AS aname ON tStueckliste.kArtikel = aname.kArtikel
    INNER JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tStueckliste.kArtikel
WHERE
    tArtikel.cArtNr = '{{ Vorgang.Allgemein.Stammdaten.ArtNrSku | SqlEscape }}'
{% endcapture -%}
[{% assign ausgabe = query | DirectQuery -%}
    {%- for item in ausgabe.Daten -%}{"name":"{{ item.name }}","quantity":{{ item.quantity }},"measurements":[{"type":"height","value":{{ item.height }},"unit":"cm"},{"type":"width","value":{{ item.width }},"unit":"cm"},{"type":"depth","value":{{ item.length }},"unit":"cm"},{"type":"weight","value":{{ item.weight }},"unit":"kg"}]},{% endfor -%}
]{{ ausgabe }}

2 Probleme habe noch:
  • Die Zahlen sollen ein "." als Dezimaltrennzeichen haben (alternativ müsste es shopwareseitig angepasst werden)
  • das letzte "," vor dem schließenden "]" muss weg
    • mit replace hatte ich keinen Erfolg
    • auch habe ich versucht irgendwie zu schauen, was der letzte Schleifendurchlauf ist, um dann das "," nicht zu setzen .. leider ebenso erfolglos

Das Ergebnis sieht aktuell so aus:
[{"name":"Packstücke-Name-1","quantity":2,00,"measurements":[{"type":"height","value":90,00,"unit":"cm"},{"type":"width","value":182,00,"unit":"cm"},{"type":"depth","value":45,00,"unit":"cm"},{"type":"weight","value":90,00,"unit":"kg"}]},{"name":"Packstücke-Name-2","quantity":1,00,"measurements":[{"type":"height","value":78,00,"unit":"cm"},{"type":"width","value":68,00,"unit":"cm"},{"type":"depth","value":13,00,"unit":"cm"},{"type":"weight","value":9,00,"unit":"kg"}]},{"name":"Packstücke-Name-3","quantity":1,00,"measurements":[{"type":"height","value":80,00,"unit":"cm"},{"type":"width","value":42,00,"unit":"cm"},{"type":"depth","value":30,00,"unit":"cm"},{"type":"weight","value":21,00,"unit":"kg"}]},{"name":"Packstücke-Name-4","quantity":1,00,"measurements":[{"type":"height","value":185,00,"unit":"cm"},{"type":"width","value":45,00,"unit":"cm"},{"type":"depth","value":35,00,"unit":"cm"},{"type":"weight","value":44,00,"unit":"kg"}]},]

Hat hierzu vielleicht jemand eine Idee, oder schon ähnliche Erfahrungen gemacht?

Ich hoffe, ich konnte mein Problem transportieren ^^.

Viele Grüße
Mirko
 

MirkoWK

Sehr aktives Mitglied
14. März 2022
835
305
Falls jemand ein ähnliches/ gleiches Problem hat - ich konnte beide offenen Punkte nun doch selbst lösen, indem ich die Zusammenstellung der Daten bereits in der SQL-Abfrage vornehme.
Um den letzten oder ersten Eintrag anders zu behandeln, habe ich eine Variable mit der Anzahl der Ergebnisse deklariert und vergleiche diesen Wert dann mit der Ergebniszeile:

Code:
{% capture query -%}
DECLARE @ZEILENCOUNTER INT
SET @ZEILENCOUNTER =
(
    SELECT
        COUNT(tStueckliste.fAnzahl)
    FROM
        dbo.tArtikel
        INNER JOIN dbo.tStueckliste ON tStueckliste.kVaterArtikel = tArtikel.kArtikel
        INNER JOIN dbo.tArtikel AS aname ON tStueckliste.kArtikel = aname.kArtikel
        INNER JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tStueckliste.kArtikel
    WHERE
        tArtikel.cArtNr = '{{ Vorgang.Allgemein.Stammdaten.ArtNrSku | SqlEscape }}'
)
SELECT
    ROW_NUMBER() OVER(ORDER BY tStueckliste.fAnzahl DESC) AS 'Zeile',
    CASE
         WHEN ROW_NUMBER() OVER(ORDER BY tStueckliste.fAnzahl DESC) = 1 THEN CONCAT('{"name":"',tArtikelBeschreibung.cName, '","quantity":',CAST(tStueckliste.fAnzahl AS decimal(18,2)), ',"measurements":[{"type":"height","value":', CAST(aname.fHoehe AS decimal(18,2)), ',"unit":"cm"},{"type":"width","value":', CAST(aname.fBreite AS decimal(18,2)), ',"unit":"cm"},{"type":"depth","value":', CAST(aname.fLaenge AS decimal(18,2)), ',"unit":"cm"},{"type":"weight","value":', CAST(aname.fArtGewicht AS decimal(18,2)),'"unit":"kg"}]}' )
         WHEN @ZEILENCOUNTER = ROW_NUMBER() OVER(ORDER BY tStueckliste.fAnzahl DESC) THEN CONCAT('"name":"',tArtikelBeschreibung.cName, '","quantity":',CAST(tStueckliste.fAnzahl AS decimal(18,2)), ',"measurements":[{"type":"height","value":', CAST(aname.fHoehe AS decimal(18,2)), ',"unit":"cm"},{"type":"width","value":', CAST(aname.fBreite AS decimal(18,2)), ',"unit":"cm"},{"type":"depth","value":', CAST(aname.fLaenge AS decimal(18,2)), ',"unit":"cm"},{"type":"weight","value":', CAST(aname.fArtGewicht AS decimal(18,2)),'"unit":"kg"}]}' )
         ELSE CONCAT('"name":"',tArtikelBeschreibung.cName, '","quantity":',CAST(tStueckliste.fAnzahl AS decimal(18,2)), ',"measurements":[{"type":"height","value":', CAST(aname.fHoehe AS decimal(18,2)), ',"unit":"cm"},{"type":"width","value":', CAST(aname.fBreite AS decimal(18,2)), ',"unit":"cm"},{"type":"depth","value":', CAST(aname.fLaenge AS decimal(18,2)), ',"unit":"cm"},{"type":"weight","value":', CAST(aname.fArtGewicht AS decimal(18,2)),'"unit":"kg"}]},' )
    END AS name    
FROM
    dbo.tArtikel
    INNER JOIN dbo.tStueckliste ON tStueckliste.kVaterArtikel = tArtikel.kArtikel
    INNER JOIN dbo.tArtikel AS aname ON tStueckliste.kArtikel = aname.kArtikel
    INNER JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tStueckliste.kArtikel
WHERE
    tArtikel.cArtNr = '{{ Vorgang.Allgemein.Stammdaten.ArtNrSku | SqlEscape }}'
{% endcapture -%}
[{% assign ausgabe = query | DirectQuery -%}
    {%- for item in ausgabe.Daten -%}{{ item.name }}{% endfor -%}
]{{ ausgabe }}

Ich hoffe, dass kann auch jemanden anderen helfen.

Viele Grüße
Mirko
 

Ähnliche Themen