Eigene Berechnung der Versandkosten - Shopware 5.7.6

Hallo zusammen.

Ich war ziemlich lange inaktiv beim Thema Shopware und kann mich kaum daran erinnern, wie ich die Versandkosten damals eingerichtet habe. Nun stehe ich aber vor dem Problem diese wieder anpacken zu müssen…
Ich soll bei 2 verschiedenen Herstellern Mindermengenzuschläge berechnen. Diese sollen bis 100€ Einkaufswert pro Hersteller gelten. So weit, so gut (Brutto, Netto im Frontend lasse ich mal außer Acht).

attr4 ist das Attribut, welches alle Artikel mit Mindermengenzuschlag haben.
a.supplierID=4 und a.supplierID=5 sind die beiden besagten Hersteller.

Bei Warenkörben mit nur höchstens einem dieser beiden Hersteller bekomme ich mit
IF(SUM(IF(at.attr4=1,b.priceb.quantity,0))<100,10,0) auch die gewünschten 10€ Mindermengenzuschlag hin. Bei Warenkörben mit beiden Herstellern wird dann auch „nur“ draufgeschlagen bis insgesamt 100 € dieser Hersteller erreicht sind. Immer noch alles zu erwarten.
Mit IF(SUM(IF(a.supplierID=4,b.price
b.quantity,0))<110,10,0) klappts bei dem ersten Hersteller, mit
IF(SUM(IF(a.supplierID=5,b.price*b.quantity,0))<110,10,0) klappts bei dem anderen Hersteller. Ich wollte mit jetzt ein paar Varianten sparen und spielte mit folgender Version rum.

IF(SUM(IF(a.supplierID=4,b.priceb.quantity,0))<100,10,0) OR IF(SUM(IF(a.supplierID=5,b.priceb.quantity,0))<100,10,0)

AND oder OR, sei auch mal egal…

Damit sieht es eigentlich schon ganz gut aus. Leider nur eigentlich, denn nach ner Weile fiel mir auf, dass nur noch 1 € statt der 10 € draufgeschlagen wird. Ich kann die verlangten 100 € anpassen und sehe die Anpassung auch im Frontent. Ich kann alles Mögliche verändern (natürlich nur im Rahmen :wink: ) aber dieser blöde 1 € Zuschlag bleibt. Ich kann mir nicht erklären wie er mit den Formeln auf 1 € Mindermengenzuschlag kommt. Ich habe sonst im Backend nirgendwo Zuschläge eingerichtet und auch keine andere Versandart hat irgendwo 1 € als Zuschlag drin. Das System benutzt oben genannte Formel, denn wenn ich sie deaktiviere benutzt er die normale Formel für DHL (ohne Mindermengenzuschlag).

Vielleicht hat ja einer von euch ne Idee wie das System von IF(SUM(IF(at.attr4=1,b.priceb.quantity,0))<100,10,0) bzw. IF(SUM(IF(a.supplierID=4,b.priceb.quantity,0))<100,10,0) mit 10 € berechnetem Mindermengenzuschlag zu IF(SUM(IF(a.supplierID=4,b.priceb.quantity,0))<100,10,0) OR IF(SUM(IF(a.supplierID=5,b.priceb.quantity,0))<100,10,0) mit nur 1 € berechnetem Mindermengenzuschlag kommt.

Ich mache mal für heute Feierabend und wünsche euch allen ein schönes WE.

Lös deine Formel doch mal auf - Du rechnest dann z.B 10 OR 10, und das ergibt 1 (Booleans in der DB sind 0 oder 1). Nimm anstelle OR die Funktion MAX(), dann ist das Ergebnis 10, sobald einer der beiden Werte 10 ist. Und wenn die MMZ jeweils separat und ggf. auch doppelt berechnet werden sollen, nimmst Du SUM() um diese zu addieren. Also einfach:

MAX( IF(SUM(IF(a.supplierID=4,b.priceb.quantity,0))<100,10,0), IF(SUM(IF(a.supplierID=5,b.priceb.quantity,0))<100,10,0))

Oder du packst das OR direkt in den inneren IF bei der Abfrage der supplierID.

LG Phil

Hallo Phil. Vielen Dank für die schnelle Antwort! Besonders für den Hinweis „Du rechnest dann z.B. 10 OR 10“. Damit wäre die vermaledeite 1 als Mindermengenzuschlag ja endlich erklärt. Vielen Dank! Logik war nie Meins und Mathe bzw. MySQL ist lange her :wink: . Vielleicht könntest Du mir nochmal etwas erklären? Wenn ich dann MAX(IF(SUM(IF(a.supplierID=4,b.price*b.quantity,0))<100,10,0),IF(SUM(IF(a.supplierID=5,b.price*b.quantity,0))<100,10,0)) als „Eigene Berechnung“ eintrage bekomme ich leider den Fehler:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚IF(SUM(IF(a.supplierID=5,b.price*b.quantity,0))<100,10,0))) as calculation_value‘ at line 1

Beide IF-Teile funktionieren einzeln aber mit dem MAX davor, und Komma separiert, funktioniert leider etwas nicht. Vielleicht (hoffentlich) ist es nur ein Syntax-Fehler, den ich einfach nicht sehe, und kein grundsätzliches Problem mit meiner SQL-Abfrage im Versandkosten-Modul. So oder so, nochmal vielen Dank für die Auflösung des 1 € Mindermengenzuschlags.

Gruß, Rob

Da ich oben erstmal nicht weiter kam, habe ich noch ein wenig experimentiert.
Kann man nicht diesen Versuch (siehe unten) so anpassen, dass ein Check (IFNULL, IS NULL, IS NOT NULL, (a.supplierID=x)=1)…) eingebaut wird, damit das auch funktioniert, wenn nur ein Hersteller (a.supplierID=4) oder (a.supplierID=5) im Warenkorb ist? Leider fehlt mir auch hier das Wissen über die benötigte Syntax. Und meine zig Versuche führten leider auch erstmal nicht zum Erfolg. Aber der Versuch klappt schon gut solange auch die beiden Hersteller im Warenkorb sind.

CASE
WHEN SUM(IF(a.supplierID=4,b.price*b.quantity,0))<119 THEN 10	  
WHEN SUM(IF(a.supplierID=5,b.price*b.quantity,0))<119 THEN 10    
ELSE 0
END

Sorry, mein Fehler, MAX() und MIN() gehen natürlich nur auf eine Spalte und erwarten folglich nur einen Parameter. Um in MySQL den größeren bzw. kleineren von zwei Werten zu ermitteln, musst Du GREATEST bzw. LEAST verwenden.
SELECT GREATEST(1,2) ergibt 2.

Vorsicht bei Spaltenwerten, die NULL sein können, dann musst Du es so machen: GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))

LG Phil

Danke für deinen Hinweis aber leider sagt mir das nichts. Kannst Du mir da vielleicht mit den Infos von oben ein Beispiel basteln?

Ist es denn möglich in den folgenden Ansatz eine Abfrage, ob a.supplierID=4 oder a.supplierID=5 TRUE/FALSE ist, einzubauen?

CASE 
WHEN SUM(IF(a.supplierID=4,b.price*b.quantity,0))<119 THEN 10	  
WHEN SUM(IF(a.supplierID=5,b.price*b.quantity,0))<119 THEN 10    
ELSE 0
END

Ich habe das Problem jetzt zwar mit den „Eigenen Bedingungen“ und dadurch vielen Versandarten gelöst aber eine elegantere Lösung würde mich schon noch interessieren. Gruß, Rob

So habe ich es jetzt für mich gelöst.

Versandkostenmodul: SQL für Hersteller

Max(IF(a.supplierID = 4,1,0)) AS hersteller1, Max(IF(a.supplierID = 5,1,0)) AS hersteller2, Max(at.attr4='1') as mischkorb

Versandkosten für hersteller1 ODER hersteller2 im Warenkorb:

Eigene Bedingung:

mischkorb && (!hersteller1 or !hersteller2)

Eigene Berechnung:

IF(SUM(IF(at.attr4=1,b.price*b.quantity,0))<100,10,0)

Versandkosten für hersteller1 UND hersteller2 im Warenkorb:

Eigene Bedingung:

hersteller1 && hersteller2

Eigene Berechnung:

CASE 
WHEN ((SUM(IF(a.supplierID=4,b.price*b.quantity,0))<100) AND (SUM(IF(a.supplierID=5,b.price*b.quantity,0))<100)) THEN 20
WHEN SUM(IF(a.supplierID=4,b.price*b.quantity,0))<100 THEN 10	  
WHEN SUM(IF(a.supplierID=5,b.price*b.quantity,0))<100 THEN 10    
ELSE 0
END

Das ist vielleicht nicht elegant, erfüllt aber meine Anforderungen. Wenn nur Hersteller1 ODER Hersteller2 im Warenkorb ist, dann werden 10 € Mindermengenzuschlag berechnet bis 100 € dieses Herstellers im Warenkorb ist. Wenn Hersteller1 UND Hersteller2 im Warenkorb sind, dann werden 20 € berechnet, solange beide unter 100 € sind, wenn nur einer unter 100 € ist werden 10 € berechnet. Das attr4 habe ich unter der Freitext-Verwaltung bei Artikel (s_articles_attributes) eingerichtet (Checkbox und im Backend anzeigen) und den entsprechenden Artikeln der Hersteller zugewiesen. Das at.attr4 könnte man mit Sicherheit auch durch die Hersteller-Abfragen ersetzen aber so it´s bei mir gewachsen und funktioniert auch (Shopware 5.7.6). Wenn jemand hier drüber stolpert, und wie ich auch, Textbausteine zum Testen benötigt, dann hilft das vielleicht. Falls jemandem grobe Fehler auffallen, die ein Shopsystem zum kollabieren bringen, dann bitte ich um Hinweise.

Trotzdem wäre ich noch an einer eleganteren Lösung interessiert @phil. Ich weiß zu wenig von SQL um deine Hinweise zu verstehen aber mit den richtigen Textbausteinen und Beispielen kann ich beim Testen lernen (learning by doing). :wink: