Beantwortet

BERICHT 125 Umsatz pro Artikel (Erweitert)


Benutzerebene 5
Abzeichen +2

Hallo,

gibt es hier jemanden der diesen Bericht nutzt. Ich wollte gerne die Deckungsbeiträge esportieren. Wundere mich aber über die Zahlen extrem.

Beispiel: Ich habe ein Produkt, bei dem sich die Kosten aus mehreren Bestandteilen zusammensetzten. Daher gibt es zu dem Produkt eine Stückliste (Produkt, Dienstleistung, etc.). In den jeweiligen Stücklistenbestandteilen ist der EK hinterlegt. Beim Produkt selbst ist kein EK, sondern ich habe ich der Kalkulation den EK geladen (aus den Elementen der Stückliste).

Es ergibt sich ein kalkulierter preis von EUR 4,86.

In dem Bericht steht im EK aber 21,25. Ich habe keine Ahnung wo Xentral diesen Preis heranzieht. Demensprechend stimmt auch der DB nicht. 

Wie kann das sein?


Hat jemand Erfahrungen damit?

Danke!

LG
Merima

icon

Beste Antwort von Daniel Schmidtchen 15 September 2022, 09:33

Original anzeigen

21 Antworten

Benutzerebene 7
Abzeichen +5

Hier nutzt Xentral folgende Felder aus rechnung_position (rp)

    ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,
    ROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,

Du benötigt aber artikel.berechneterek

Benutzerebene 7
Abzeichen +5

Da hat direkt DER Experte geantwortet!! 👍

Benutzerebene 5
Abzeichen +2

Hi! :-)

Danke,

das heißt ich passe die Formel so an?
ROUND(SUM(rp.artikel.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,

Benutzerebene 5
Abzeichen +2

ROUND(SUM(rp.artikel.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS berechneterek,

mit dem Klappt es bei mir leider nicht - was mache ich falsch 😅

DANKE :-)

Benutzerebene 5
Abzeichen +2

Hm okay - rp wird auch falsch sein bei mir, wenn es aus dem Artikel ziehen soll… ich versuchs mal weiter, aber falls hier wer schneller die richtige Formel hat, sag ich danke :-)

 

Benutzerebene 7
Abzeichen +5

genau, es würde wenn dann so funktionieren rp.berechneterek, wenn der in der Tabelle rechnung_position enthalten wäre. Da er das aber nicht ist, musst du die Artikel Tabelle per JOIN anbinden und kann dann auf artikel.berechneterek zugreifen.

Benutzerebene 5
Abzeichen +2

Update:

mit  ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS berechneterek,

steht jetzt bei der Spalte berechneter EK 0.00 und der DB ist noch immer negativ. Also zieht das irgendwie noch immer nicht den richtigen kalkulierten preis 

 



 

Benutzerebene 5
Abzeichen +2

genau, es würde wenn dann so funktionieren rp.berechneterek, wenn der in der Tabelle rechnung_position enthalten wäre. Da er das aber nicht ist, musst du die Artikel Tabelle per JOIN anbinden und kann dann auf artikel.berechneterek zugreifen.

Alles klar - ich versuche das Mal. Hab null SQL skills, aber orientiere mich an den vorhandenen Berichten, dann sollte das mit dem joinen wohl klappen. :-) Danke schon mal

 

Benutzerebene 5
Abzeichen +2

@Daniel Schmidtchen 

wie ist das bei SQL:

Das bedeutet vermutlich “ aus den Daten “rechnung” ziehe bitte den Artikel etc.,
FROM rechnung r
JOIN rechnung_position rp on r.id = rp.rechnung
JOIN artikel ar ON ar.id = rp.artikel
..

Somit muss ich irgendwie definieren:

FROM artikel ar
   JOIN berechneterek (aber wie geht es weiter?)

Ich weiß leider nicht, wo ich die Datenbank Arikel “joinen” darf und wie ich das verknüpfen muss. wie gesagt: Die einzigen Skills die ich habe, ist das was ich aus den vorhandenen Tabellen lese ^^.

Kannst du mir bitte helfen? Danke!
 

Benutzerebene 7
Abzeichen +5

Update:

mit  ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS berechneterek,

steht jetzt bei der Spalte berechneter EK 0.00 und der DB ist noch immer negativ. Also zieht das irgendwie noch immer nicht den richtigen kalkulierten preis 

 



 

Sehe gerade, das im Bericht die Artikel Tabelle schon gejoint ist. Also hätte es so funktionieren müssen. 
Du hast in der Zeile “AS berechneterek” geschrieben. In Tabelle ist die Spaltenbezeichnung aber “EK”?

Benutzerebene 5
Abzeichen +2

Update:

mit  ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS berechneterek,

steht jetzt bei der Spalte berechneter EK 0.00 und der DB ist noch immer negativ. Also zieht das irgendwie noch immer nicht den richtigen kalkulierten preis 

 



 

Sehe gerade, das im Bericht die Artikel Tabelle schon gejoint ist. Also hätte es so funktionieren müssen. 
Du hast in der Zeile “AS berechneterek” geschrieben. In Tabelle ist die Spaltenbezeichnung aber “EK”?




Also ich habe den SQL Spaltennamen geändert von ek zu berechneterek, habe nur den Namen noch nicht geändert

Das Problem ist eher, dass iche ben 0 SQL wissen habe und nicht weiß, wie ich die Datenbank hinzufügen kann, damit der berechnete ek abgeglichen wird. Ich denke diese Tabelle fehlt bzw der Querverweis



 

 

Benutzerebene 5
Abzeichen +2


Ich suche noch nach der richtigen stelle, wo ich ar joinen kann bzw. wie :-)

FROM artikel ar
       JOIN berechneterek …?  Sry kenn mich null aus



Das statement lautet:

SELECT 
CASE WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum
    WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)
    WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)
    WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER
    ELSE MAKEDATE(YEAR(r.datum), 1)
    END AS datum,
    ar.name_de AS name_de,
    ar.nummer AS nummer,
    ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,
    ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)/100)),2) AS umsatzohnerabatt,
    ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)/100)),2) AS gesamtrabatt,
    ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,
    ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS berechneterek,
    ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,
    r.waehrung AS waehrung
FROM rechnung r
         JOIN rechnung_position rp on r.id = rp.rechnung
         JOIN artikel ar ON ar.id = rp.artikel
         LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id
WHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')
GROUP BY ar.id, r.waehrung, CASE
    WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum
    WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)
    WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)
    WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER
    ELSE MAKEDATE(YEAR(r.datum), 1)
    END

Benutzerebene 7
Abzeichen +5

Hier ist schon das Tabellen JOIN, d.h. du musst es nicht nochmal machen, sondern kannst so auf alle Felder der Tabelle Artikel (ar) zugreifen. 

Im Artikel wird der kalk. EK aber korrekt angezeigt?

 

Benutzerebene 5
Abzeichen +2

Oh ich danke dir! Da ist der Wurm vermutlich drinnen. Ich habe zwar kalkulierte EK, aber der Haken vorne war nichtg gesetzt. Werde das nun bei allen Artikeln aktualisieren und es dann nochmal versuchen. :-) Besten Dank!

Benutzerebene 5
Abzeichen +2

Das klappt nun, dass hier der richtige “EK” genommen wird. (Muss den Namen noch anpassen, ABER warum ändert sich beim DB nichts? Noch immer negativ)

Hier steht nach wie vor -57,43

 

 

Benutzerebene 7
Abzeichen +5

Weil hier immer noch der errechnete Wert von Xentral gezogen wird:

    ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,

Das musst du ändern in und vom netto umsatz den netto kalk. EK abziehen. 

 

 

Benutzerebene 5
Abzeichen +2

Weil hier immer noch der errechnete Wert von Xentral gezogen wird:

    ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,

Das musst du ändern in und vom netto umsatz den netto kalk. EK abziehen. 

 

 

hmm ich versteh nicht, kannst du mir hier vielleicht auch weiterhelfen?

Das heißt: ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag, ist komplett falsch in der situation? Danke!

Benutzerebene 7
Abzeichen +5

auf die schnelle, müsste dann so aussehen:

ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2)-ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS deckungsbeitrag,

Benutzerebene 5
Abzeichen +2

auf die schnelle, müsste dann so aussehen:

ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2)-ROUND(SUM(ar.berechneterek*(rp.menge-IFNULL(gp.menge,0))),2) AS deckungsbeitrag,

Wahnsinn :-) ich bin dir unendlich dankbar! :-) Endlich kann ich den bericht sinnvoll nutzen :-)

Benutzerebene 7
Abzeichen +5

Das hier war doch mal eine beispiellose Community Hilfe! Vielen Dank für die tollen Fragen @HP Team und die super Antworten und Hilfe @Daniel Schmidtchen ! 

Auch die Geschwindigkeit in der hier hier geschrieben habt, finde ich sehr faszinierend! Es freut mich natürlich auch, dass jetzt am Ende alles geklappt hat und ich kann mir gut vorstellen, dass einige Nutzer, die sich mit SQL auch nicht so gut auskennen, hier auf den Post zurückkommen und sich das mit Freuden durchlesen werden! :) 

Danke also noch mal an euch alle und der Kommentar von @Marcel T. ist auch einfach nur passend und dem kann ich mich nur anschließen!!! ;) 

Benutzerebene 5
Abzeichen +2

Trotzdem noch eine Spezialfrage, weil mir eine weitere Problemstelle aufgefallen ist.

Wir haben einen Lagerartikel (A). Dieser ist einzeln erhältlich. Zeitgleich gibt es die Stückliste (B) = Vorteilspackung in dieser Stückliste ist Lagerartikel (A) 3x erhalten.

SINGLE PRODUKT = Lagerartikel A
VORTEILSPACKUNG = 3x Lagerartikel A

PROBLEM:

Werte ich nun also Umsatz/ DB zu Lagerartikel A aus, dann fallen die Stückzahlen zu hoch aus und der Umsatz zu gering → negativer DB.

Warum?

Nun SQL zieht die Daten ja aus der Rechnung. In dieser steht dann zb:

1x Stückliste B um Preis EUR 20,00 (= PARENT)
(bestehend aus) 3x Lagerartikel A mit Preis 0 (der Verkaufspreis steht ja beim PARENT)


SQL “wertet” dann bei der Stückliste B richtig aus: 1 pcs (parent) um EUR 20 verkauft ergibt abzgl. Steuer und Kalkuliertem EK den DB. Zeitgleich zieht es aber auch die Werte aus dem CHILD: 3x Lagerartikel A verkauft um EUR 0 raus. → das verfälscht das ganze Ergebnis, weil es ja auch Daten aus dem Einzelverkauf von Artikel A gibt. Also zb. 10x Artikel A einzeln verkauft um xy EUR. Da es aber die gleiche Artikelnummer hat rechnet es ja auch die Daten aus der Stückliste hinzu mit “Umsatz 0”. Daher auch der negative DB.

Ich müsste also für den Singelverkauf des Lagerartikels A eine neue Aritkelnr machen und indirekt wieder eine Stückliste machen, damit ich den umsatz/DB aus Einzelverkauf und Vorteilspackung trennen kann… gibt es eine andere Möglichkeit?

Hoffe das war verständlich. :-)

Danke!

LG
Merima

Antworten