Wie kann ich den Einkaufspreis zu einem verkauften Artikel ermitteln?

Hallo,

Wir haben bei uns eine komplexe Provisionsberechnung für die ich den Ver- und Einkaufspreis eines Artikels zu jeder verkauften Bestellung wissen muss (zum Zeitpunkt der Bestellung). Wie kann ich die zu den jeweiligen Artikeln einer Bestellung ermitteln (Shopware 5.1.5) ?

Ich habe in der Datenbank eine s_articles_prices Tabelle gefunden in der es einen baseprice gibt. Ist das der Einkaufspreis?

Wenn ja: wie kann ich den zur Bestellung zuordnen? Über articleID scheint es nicht zu gehen, da erhalte ich mehrere Einträge für 1 articleID.

Hallo @SFeldbinder‍,

soweit mir bekannt ist der Einkaufspreis das Datenbankfeld purchaseprice in der Tabelle s_articles_details.

Das kann man auf der Artikeldetailseite unter Stammdaten pflegen (rechts oben wo man MwSt., Template usw. pflegt.)

 

und warum kann man das nicht über die ID zuordnen?

SQL Lösung:

  1. Du hast doch eine OrderID in s_order.
    Da verjoinst du die ID mit der orderID aus der Tabelle s_order_details und du hast 
    deine Artikel IDs (articleID) der Bestellung.

  2. Darauf ein SUM auf s_articles_details (purchaseprice) mit einem WHERE articleID IN (articleIDs aus der ersten Abfrage) und 
    zack hast du den Einkaufspreis berechnet.

PS: Feld quantity aus s_order_details nicht vergessen. Kann ja sein, dass jemand einen Artikel mehrfach bestellt.

 

Hallo Martin und danke für deine Antwort, leider hilft sie mir nicht mein Problem zu lösen.In der Tabelle s_articles_details habe ich kein purchaseprice oder irgendwas ähnliches.

 

Hmmmmm, dann scheint das wohl in 5.2 neu hinzugekommen zu sein. Sorry, alle meine betreuten Shops sind schon auf 5.2.

 

Wenn ich du wäre würde ich mal den baseprice pflegen.

Hier die Doku http://community.shopware.com/Artikel-anlegen_detail_807.html

 

 

Auch wenn es sich um den baseprice in der Tabelle s_articles_prices handelt, kann man auch diesen ermitteln.

Die Tabelle hat ja auch eine articleID.

Man müsste dann 

  1. wie oben beschrieben OrderID aus s_order mit s_order_detailt verjoinen.

  2. Dann in der s_articles_prices die Artikel ermitteln, die sich zwischen den Feldern „from“ und „to“ befinden (falls sich euer Einkaufspreis „baseprice“ je je nach Einkaufsmenge bei euch ändert)

baseprice (aus s_articles_prices) * quantity (aus s_order)

in einer Schleife für alle Artikel aus der Order 

und man hat auch das Ergebnis.

 

 

Wahlweise die Ergebnisse summieren und man hat Einkaufspreis uns Verkaufspreis einer Bestellung.
 

 

Ok also der baseprice ist tatsächlich der Einkaufspreis, schon mal gut zu wissen.

Jetzt hab ich nur noch das Problem, dass es für eine artikelID mehrere zutreffende Einträge in s_articles_prices gibt. Ist das jetzt eine Fehlkonfiguration unsererseits oder ist das durchaus normal?

Sehr gut.

Und nein, keine Fehlkonfiguration.

Wenn ihr mehrer Artikelpreise habt, die sich nach Anzahl der bestellten Artikel richten, dann sieht das so aus

Bestellt ein Kunde zwischen 1 und 10 Artikel, kostet der Artikel mehr als wenn dieser Kunde im Rahmen 11 bis 20 Artikel bestellt.

Mann kann ja Rabatte nach Bestellmenge definieren.

 

Deshalb habe ich oben geschrieben, dass du aus der Order die Bestellmenge mitschleifen musst (quantity) und mit abfragen.

… WHERE s_order.quantity BETWEEN s_articles_prices.from AND s_articles_prices.to;

Dann bekommst du den richtigen Artikel mit dem richtigen Staffelpreis.

 

Den Fall haben wir nicht. Bei uns geht alles von 1 bis ‘beliebig’

ok ich sehe schon.
Das sind Varianten.

Dann in s_order_details nicht über articleID sondern über „articleordernumber“ gehen. == Die ist in „s_articles_details“ die „ordernumber“
Daraus (also aus s_articles_details) die ID nehmen und in s_articles_prices die „articledetailsID“ selektieren und man 
hat die korrekte Variante
 

PS: Falls noch was unlar ist bin ich in einer Stunde wieder online.

VG,

Martin 

Ok ich hab jetzt folgendes:

FROM shopware.s_order_details od ON od.ordernumber = 123
INNER JOIN shopware.s_order o ON o.id = od.orderID
INNER JOIN shopware.s_articles_details ad ON ad.ordernumber = od.articleordernumber
INNER JOIN shopware.s_articles_prices ap ON ap.articleID = ad.articleID AND ap.articledetailsID = ad.id AND ap.pricegroup = 'EK'

Damit ist meine Anzahl Rückgabewerte allerdings von 339 auf 250 reduziert was mich stutzig macht.

 Jetzt bin ich aber wirklich weg für eine Stunde: Habe mal ein wenig rumgespielt: [SELECT](http://dev.mysql.com/doc/refman/5.5/en/select.html) [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber, [SUM](http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_sum)(([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).price + ([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).price / 100 \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).tax\_rate)) \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).quantity), [SUM](http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_sum)([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).baseprice \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).quantity) FROM [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details) INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order) ON [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).id = [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).orderID INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details) ON [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).articleordernumber = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).ordernumber INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices) ON [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).articleID = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).articleID [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and)[s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).articledetailsID = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).id [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and) [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).pricegroup = 'EK' WHERE [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber != 0 [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and)[s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber = 20003 GROUP BY [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber 

Beispiel bezieht sich auf eine meiner ordern 20003

Lässt man die weg, dann kommt 1 Datensatz pro Bestellung

 

PS: Keine Gewährleistung :smiley:

Ok, klingt so als wäre mein SQL oben richtig. Danke für die Hilfe!