Abfrage: Zeige alle GP's, Wert aus Preisliste, Wert Sonderpreis falls vorhanden. Auswahl nach Artike

Dtechnik2013

Benutzer
Beiträge
11
Hallo

versuche schon etwas länger eine SAP Abfrage zu erstellen.

Die Abfrage soll alle Geschäftspartner auflisten und die VK's für einen "bestimmten Artikel" aus der Preisliste "1" anzeigen.
Zusätzlich sollen die Sonderpreise falls vorhanden angezeigt werden.


Die folgende Abfrage gibt nur die Geschäftspartner aus, die einen Sonderpreis hinterlegt haben

Code:
SELECT T0.[CardCode], T1.[CardName], T2.[ItemName], T0.[Discount], T0.[Price], T3.[Price], T0.[Currency] 
FROM OSPP T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode 
INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode 
INNER JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist
WHERE T0.[ItemCode]  = [%ItemCode] AND
T3.[ItemCode]  = [%ItemCode]
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
Die ersten beiden Probleme sind schonmal das du A eigentlich gar keine Frage gepostet hast und B ich kein SAP kann bzw. je angefasst habe. Ohne deine Tabellenstruktur jetzt zu kennen denke ich aber mal das dein Problem bei der Wahl des JOINs liegt. LEFT JOIN dürfte dein Freund sein.
 

Dtechnik2013

Benutzer
Beiträge
11
Hallo,

es handelt sich ja auch um eine Problemstellung. Left Join funktioniert leider nicht. Das grundlegende Problem ist, dass die Ausgabe sich aufgrund der Sonderpreise reduziert. D.h. Es werden nur kunden mit sonderpreisen angezeigt.
 

ukulele

Datenbank-Guru
Beiträge
4.394
Dann poste mal mehr Infos zur Tabellenstruktur. Kommt dein Sonderpreis aus ITM1? Warum läßt sich das nicht per LEFT JOIN lösen? Gibt er eventuell trotzdem was aus, gibt er gar nichts aus oder kommt eine Fehlermeldung?
Code:
SELECT    T0.[CardCode],
        T1.[CardName],
        T2.[ItemName],
        T0.[Discount],
        T0.[Price],
        T3.[Price],
        T0.[Currency]
FROM    OSPP T0
INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
LEFT JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist
WHERE    T0.[ItemCode]  = [%ItemCode]
AND    (    T3.[ItemCode]  = [%ItemCode]
OR        T3.[ItemCode] IS NULL )
 

Dtechnik2013

Benutzer
Beiträge
11
Ok, Sorry,

So hier die Strucktur:

OCRD T1 = Geschäftspartner/ Kundenkarteikarte (CardCode, CardName, ListNum)
OITM T2 = Arikelstammdaten (ItemCode, ItemName,
ITM1 T3 = Preislisten (ItemCode, PriceList, Price)
OSPP = Sonderpreise (ItemCode, CardCode, Price, ListNum, Discount)

Ich hoffe dass es ausreichend ist. Der oben genannte Code gibt leider wieder nur die Geschäftspartner aus, die einen Sonderpreis hinterlegt haben.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Ok, Sorry,

So hier die Strucktur:

OCRD T1 = Geschäftspartner/ Kundenkarteikarte (CardCode, CardName, ListNum)
OITM T2 = Arikelstammdaten (ItemCode, ItemName,
ITM1 T3 = Preislisten (ItemCode, PriceList, Price)
OSPP = Sonderpreise (ItemCode, CardCode, Price, ListNum, Discount)

Ich hoffe dass es ausreichend ist. Der oben genannte Code gibt leider wieder nur die Geschäftspartner aus, die einen Sonderpreis hinterlegt haben.

Ich hoffe, ich hab Dich richtig verstanden. Dazu mal Deine Tabellen mit wenigen Datensätzen angelegt.

Code:
test=*# select * from t1;
cardcode | cardname | listnum
----------+----------+---------
        1 | kunde 1  |      1
        2 | kunde 2  |      2
(2 rows)
 
Time: 0,174 ms
test=*# select * from t2;
itemcode | itemname
----------+-----------
        1 | artikel 1
        2 | artikel 2
(2 rows)
 
Time: 0,190 ms
test=*# select * from t3;
itemcode | pricelist | price
----------+-----------+-------
        1 |        1 |    10
        1 |        2 |    12
        2 |        1 |    20
        2 |        2 |    22
(4 rows)
 
Time: 0,170 ms
test=*# select * from t4;
itemcode | cardcode | price | listnum | discount
----------+----------+-------+---------+----------
        1 |        1 |    9 |      1 |      10
(1 row)
 
Time: 0,154 ms
test=*# select t1.cardcode, t1.cardname, default_price.itemname, t3.price as defaultprice, t4.price as speciaprice, coalesce(t4.price,t3.price) as finalprice from t1 left join t3 on (t1.listnum=t3.pricelist) left join t4 on ((t1.cardcode, t1.listnum, t3.itemcode)=(t4.cardcode,t4.listnum,t4.itemcode)) left join t2as default_price on (default_price.itemcode=t3.itemcode) left join t2 as sonder_price on (sonder_price.itemcode=t3.itemcode);
cardcode | cardname | itemname  | defaultprice | speciaprice | finalprice
----------+----------+-----------+--------------+-------------+------------
        1 | kunde 1  | artikel 1 |          10 |          9 |          9
        2 | kunde 2  | artikel 1 |          12 |            |          12
        1 | kunde 1  | artikel 2 |          20 |            |          20
        2 | kunde 2  | artikel 2 |          22 |            |          22
(4 rows)
 
Time: 0,844 ms
test=*#

Ist es das, was Du suchst? Ich arbeite mit PostgreSQL, sollte aber sich auf Deine Aufgabe und Datenbank mühelos anpassen lassen.

Edit: das auf einen Artikel zu filtern überlasse ich Dir zur Übung ;-)
 

Dtechnik2013

Benutzer
Beiträge
11
Hi akretschmer,

das funktioniert so mit SQL Server leider nicht. Ich habe versucht es etwas umzustellen. Aber das gibt leider auch weitere Fehler aus. Ich werde das später noch mal mit left joins versuchen.

Code:
select OCRD.cardcode, OCRD.cardname, OITM.itemname, ITM1.price, OSPP.price as speciaprice, coalesce(OSPP.price, ITM1.price) as finalprice
from OCRD left join ITM1 on OCRD.listnum=ITM1.pricelist left join OSPP on ((OCRD.cardcode, OCRD.listnum, ITM1.itemcode)=(OSPP.cardcode, OSPP.listnum, OSPP.itemcode)) left join OITM on (OITM.itemcode=ITM1.itemcode) left join OITM on (sonder_price.itemcode=ITM1.itemcode)
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Hi akretschmer,

das funktioniert so mit SQL Server leider nicht. Ich habe versucht es etwas umzustellen. Aber das gibt leider auch weitere Fehler aus. Ich werde das später noch mal mit left joins versuchen.

Code:
select OCRD.cardcode, OCRD.cardname, OITM.itemname, ITM1.price, OSPP.price as speciaprice, coalesce(OSPP.price, ITM1.price) as finalprice
from OCRD left join ITM1 on OCRD.listnum=ITM1.pricelist left join OSPP on ((OCRD.cardcode, OCRD.listnum, ITM1.itemcode)=(OSPP.cardcode, OSPP.listnum, OSPP.itemcode)) left join OITM on (OITM.itemcode=ITM1.itemcode) left join OITM on (sonder_price.itemcode=ITM1.itemcode)

Wenn Du weiter nur so Salamitaktik machst ist es schwer zu helfen. Wie lautet denn die Fehlermeldung? Möglicherweise kennt M$SQL coalesce() nicht.
 

Dtechnik2013

Benutzer
Beiträge
11
Hi,

ja, dass ist klar. Die Fehlermeldung sagt leider nicht viel aus. Die Tabellen werden generell in T1, T2, T3, T4 umbenannt: OCRD, OITM, ITM1, OSPP

So wie hier:
Code:
FROM OSPP T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
INNER JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist

Dann können diese auch mit T1, T2, T3, T4 im select angesprochen werden. Wie: Select T1.CardCode

Fehlermeldung: 1). [Microsoft][SQL Server Native Client 10.0][SQL Server]An expression of non-boolean type specified in a context where a condition is expected, near ','. 2). [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement 'Rahmenvertrag' (OOAT) (s) could not be prepared.


Scheint ja doch etwas problematischer zu sein als ich zunächst dachte. Eigentlich müsste der Left Join doch genau das
richtige sein. Funktioniert allerdings nicht. :confused:
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Hi,

ja, dass ist klar. Die Fehlermeldung sagt leider nicht viel aus. Die Tabellen werden generell in T1, T2, T3, T4 umbenannt: OCRD, OITM, ITM1, OSPP

So wie hier:
Code:
FROM OSPP T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
INNER JOIN OITM T2 ON T0.ItemCode = T2.ItemCode
INNER JOIN ITM1 T3 ON T1 .ListNum = T3.Pricelist

Dann können diese auch mit T1, T2, T3, T4 im select angesprochen werden. Wie: Select T1.CardCode

Fehlermeldung: 1). [Microsoft][SQL Server Native Client 10.0][SQL Server]An expression of non-boolean type specified in a context where a condition is expected, near ','. 2). [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement 'Rahmenvertrag' (OOAT) (s) could not be prepared.


Scheint ja doch etwas problematischer zu sein als ich zunächst dachte. Eigentlich müsste der Left Join doch genau das
richtige sein. Funktioniert allerdings nicht. :confused:

Bei "T1 .ListNum" scheint mir das Leerzeichen nicht nur überflüssig, sondern auch direkt falsch zu sein.
 

ukulele

Datenbank-Guru
Beiträge
4.394
Du hast die Falsche Ausgangstabelle. Du suchst im prinzip nach Sonderpreisen und Joinst darauf die restlichen Informationen. Wenn du aber nach Artikeln suchst und dazu, falls vorhanden per LEFT JOIN die Sonderpreise holst sollte es klappen:
Code:
SELECT    T3.[CardCode],
        T3.[CardName],
        T0.[ItemName] AS Produkt_Name,
        T2.[Discount] AS Rabatt,
        T1.[Price] AS Preis,
        T2.[Price] AS Sonderpreis,
        T2.[Currency]
FROM    OITM T0
INNER JOIN ITM1 T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN OSPP T2 ON T2.ItemCode = T0.ItemCode
LEFT JOIN OCRD T3 ON T3.CardCode = T2.CardCode
WHERE    T0.ItemCode = [%ItemCode]
 

Dtechnik2013

Benutzer
Beiträge
11
Hi,

das passt leider noch nicht ganz. Die Kunden werden mehrfach angezeigt für den gleichen Artikel.Das liegt an der Preisliste.
Dieser Befehl behebt das Problem: T1.[PriceList] = 1

Allerdings werden wieder nur die Kunden angezeigt, die einen Sonderpreis hinterlegt haben. Evtl. müsste die Suche nach Kunden starten. Allerdings konnte ich damit bisher noch kein Ergebnis erzielen.

Code:
SELECT    T3.[CardCode],
        T3.[CardName],
        T0.[ItemName] AS Produkt_Name,
        T2.[Discount] AS Rabatt,
        T1.[Price] AS Preis,
        T2.[Price] AS Sonderpreis,
        T2.[Currency]
FROM    OITM T0
INNER JOIN ITM1 T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN OSPP T2 ON T2.ItemCode = T0.ItemCode
LEFT JOIN OCRD T3 ON T3.CardCode = T2.CardCode
WHERE    T0.ItemCode = [%ItemCode] AND
T1.[PriceList] = 1
 

ukulele

Datenbank-Guru
Beiträge
4.394
Naja klar, ich suche ja mit der Abfrage nach Produkten, hole per INNER JOIN den Preis dazu den es immer gibt, sonst wird mein Produkt nicht angezeigt aufgrund des gewählten INNER JOINs. Per LEFT JOIN hole ich den Sonderpreis, falls es einen gibt. Gibt es einen Sonderpreis, kann ich auch Kundendaten per LEFT JOIN dazu holen. Wenn es aber keinen Sonderpreis gibt, wo kommen dann die Kundendaten her? Das geht aus der Tabellenbeschreibung so noch nicht hervor.
 

Dtechnik2013

Benutzer
Beiträge
11
Hallo ukulele,

das funktioniert in diesem Fall bei sap etwas anders. Die Kunden haben in der Tabelle OSPP jeder eigene Sonderpreise für ein Produkt hinterlegt. Die Kunden haben in der Tabelle OCRD
den Kundenname, Kundennummer und die Info über die Preisliste hinterlegt (Standard VK). Zusätzlich kann man dem Kunden einen Sonderpreis geben in der Tabelle OSPP. Diese werden dann vorrangig verwendet. Ich denke das hier der outer join zu tragen kommt.
Ich werde da auch noch mal ein wenig probieren.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
Okay wenn ich das richtig verstehe (und ich geb mir wirklich Mühe SAP zu verstehen :) ) dann ist OSPP eigentlich ein Kreuzprodukt aus Kunde und Produkt weil jeder Kunde zu jedem Produkt einen eigenen Preis hat. Da die Sonderpreise in der selben Tabelle stehen müsste jeder Kunde pro Produkt mind. einen Preis dort stehen haben kann aber auch mehrere dort haben.

Der Preis aus ITM1 entspricht der Preisliste 1 und ist sowas wie der Ausgangswert für neue Kunden, sollte also den "normalen" Preisen in OSPP entsprechen.

Sind die Annahmen soweit korrekt oder check ich es nicht?
 
Oben