Probleme bei einer bestimmenden Auswertung

Kroni92

Benutzer
Beiträge
6
Habe folgendes Problem:

Ich habe einen Artikelstamm mit ca. 50.000 Artikeln. Ich möchte alle Artikeln auswerten können die ein Hauptartikel sind und nichts mit dem Lieferanten GFI zu tun haben.
Unter der Artikelnummer "Testartikel" ist der Lieferant "GFI" hinterlegt. Wenn hier ein Preiswartungsartikel oder wie im Beispiel ein Verbundener Hauptartikel "Testartikel2" hinterlegt ist, darf dieser nicht mehr aufscheinen. Hier ist eine Verbindung zwischen dem "Testartikel" und dem Testartikel2". Wenn dann im "Testartikel2" auch ein Preiswartungsartikel oder ein Verbundener Hauptartikel hinterlegt ist, darf dieser ebenfalls nicht ausgewertet werden. (Bei gewissen Artikeln haben wir sogar 4 Verbindungen).
Laut dem angehängtem Beispiel sollte nur der "Testartikel4" überbleiben (Steht nicht in Verbindung mit Lieferantenkennzeichen "GFI" , hatt keinen Preiswartungsartikel und Hauptartikel die mit "GFI" in Verbindung stehen und ist ein Hauptartikel).

Ist das möglich?


upload_2018-2-26_11-46-19.png
select
sart.nr as Artikelnummer,
sart.lfkz as Lieferant,
sart.kzhauptart as KennzeichenHauptartikel,
sart.hauptartnr as VerbundenerHauptartikel,
sart.pwartnr as Preiswartungsartikel

from sart

.............................................
............................................
.............................................???????



mfg Kronreif Michael
 
Werbung:
Das geht auf jeden Fall, die Frage ist welchen Aufwand man genau betreiben möchte.

Du sagst, es dürfen nur Hauptartikel ausgewertet werden, die haben in deinem Beispiel sowieso keine Verb. Hauptart Einträge, das gewünschte Ergebnis sollte also leicht zu erzielen sein:
Code:
WHERE sart.hauptartnr = 'J' AND sart.lfkz != 'GFI'
Gibt es andere Konstellationen mit Hauptartikeln die verbundene Hauptartikel haben?
 
So einfach ist das leider nicht:

upload_2018-2-26_14-14-15.png

Es dürften hier dann der "Artikel-GFI" und "Kühl Artikel M" auch nicht mehr aufscheinen (Bild aus DEMO-Version).

Wenn man zu meinem Beispiel schaut dürfte hier dann der "Testartikel2" auch nicht mehr aufscheinen, da er im "Testartikel1" im Verbund vorkommt.

Ich beziehe die Daten aus dem Database Explorer 18
upload_2018-2-26_14-23-12.png
 
Also das wäre (zumindest theoretisch) eine rekurisve Abfrage die du benötigst. Die ist natürlich mit einigen Schwierigkeiten verbunden, hauptsächlich kann sie sehr Performance hungrig werden je nach Tabelle und Indexe. Daher wäre es z.B. gut wenn du sagst es gibt nur eine Tiefe von sagen wir maximal 4 oder 5 Artikeln, dann wäre vielleicht ein Join der Tabelle schneller, das kann ich aber nicht sicher sagen.

Ich hab mich mal an dem Code versucht, den kannst du mal testen:
Code:
WITH t(mr,lfkz,kzhauptart,hauptnr,pwartnr,lieferkette) AS (
   SELECT   sart.nr,
       sart.lfkz,
       sart.kzhauptart,
       sart.hauptartnr,
       sart.pwartnr,
       cast(sart.lfkz AS VARCHAR(8000))
   FROM   sart
   WHERE   sart.kzhauptart = 'J'
   UNION ALL
   SELECT   s.nr,
       s.lfkz,
       s.kzhauptart,
       s.hauptartnr,
       s.pwartnr,
       cast(t.lieferkette + '\' + s.lfkz AS VARCHAR(8000))
   FROM   t
   INNER JOIN sart s
   ON     t.nr = s.hauptartnr
   AND     s.kzhauptart = 'N'
   )
SELECT   t.nr AS Artikelnummer,
     t.lfkz AS Lieferant,
     t.kzhauptart AS KennzeichenHauptartikel,
     t.hauptartnr AS VerbundenerHauptartikel,
     t.pwartnr AS Preiswartungsartikel
FROM   t
WHERE   t.lieferkette NOT LIKE '%GFI%'
 
Bei dieser abfrage kann er leider den wert with t (....) nicht zuordnen...
Habe es etwas vereinfachen können - ES GIBT KEINEN PREISWARTUNGSARTIKEL MEHR!

upload_2018-2-28_15-49-11.png

Habe das aus meiner SQL Abfrage kopiert.

Links sind die Artikel (ist immer nur ein Wert) . Dieser kann einem Hauptartikel zugeordnet sein (kann in der Spalte öfters vorkommen.
Wenn ich jetzt eine Auswertung machen will von allen Hauptartikeln die nicht mit dem Lieferanten 'GFI' im Zusammenhang stehen, dann müssten mehrer Artikel nicht mehr aufscheinen.
(Siehe Screenshot) :

"Kühlmaschiene" GFI mit Liefernat "GFI" ist "N" und einem Hauptartikel Kühl Artikel M" zugeordnet.

Daher darf der "Kühl Artikel M" auch nicht mehr in die Auswertung.
Da dies ein Hauptartikel ist mit dem Kennzeichen "J" kann es sein das weitere Artikel diesem zugeordnet sind. In diesem Fall ist es der Artikel "4378237-S" und soll auch nicht mehr in die Auswertung.

Das selbe würde genau so beim Artikel "Kaffemaschiene G" ablaufen.

In der Auswertung sollte dann zb.: "NURSCHAECKE" übrig bleiben da es ein Hauptartikel ist und in keinem Zusammenhang mit "GFI" steht.

-----------------------------------

Danke für eure Bemühungen, lg Michi
 
Wenn die WITH-Syntax bei deinem Client nicht funktioniert wird das bei Rekursion zu einem Problem. Teste mal bitte mit dem MS SQL Management Studio. Wenn es da läuft, kann man sich auch eine Sicht erstellen und damit weiter arbeiten.
 
Da wir mit PSQL (Pervasive) arbeiten wird das etwas schwierig werden. Finde hier unter Engine Reference im Actian PSQL Control Center auch keinen Eintrag das eine With Syntax unterstützt wird.


lg Michi
 
Nun ohne CTE mit WITH ist rekursion nach meinem Kenntnisstand nicht möglich. Dann bleibt dir nur von einer maximalen Baumtiefe auszugehen und entsprechend viele Joins zu machen, dann wird das Query etwas länger aber geht natürlich auch.
 
Kannst du mir dazu ein Beispiel geben wie ich den Code aufbauen muss ? Oder wie der Code aussehen sollte ???

Habe es schon versucht, aber ich komme da nicht auf das richtige Ergebnis......
 
Code:
SELECT
s1.nr AS Artikelnummer,
s1.lfkz AS Lieferant,
s1.kzhauptart AS KennzeichenHauptartikel,
s1.hauptartnr AS VerbundenerHauptartikel,
s1.pwartnr AS Preiswartungsartikel
FROM sart s1
LEFT JOIN sart s2
ON s1.nr = s2.hauptartnr
LEFT JOIN sart s3
ON s2.nr = s3.hauptartnr
LEFT JOIN sart s4
ON s3.nr = s4.hauptartnr
LEFT JOIN sart s5
ON s4.nr = s5.hauptartnr
WHERE s1.lfkz NOT LIKE '%GFI%'
AND s2.lfkz NOT LIKE '%GFI%'
AND s3.lfkz NOT LIKE '%GFI%'
AND s4.lfkz NOT LIKE '%GFI%'
AND s5.lfkz NOT LIKE '%GFI%'
in etwa so
 
Werbung:
Hier bekomme ich leider kein Ergebnis....

Wenn ich mit dem Query so Beginne:
Code:
SELECT
SELECT 
s1.nr AS Artikelnummer,
s1.lfkz AS Lieferant,
s1.kzhauptart AS KennzeichenHauptartikel,
s1.hauptartnr AS VerbundenerHauptartikel

FROM sart s1
LEFT JOIN sart s2
ON s1.nr = s2.hauptartnr


WHERE s1.lfkz NOT LIKE '%GFI%'
AND s2.lfkz NOT LIKE '%GFI%'

bekomme ich als Wert:
upload_2018-3-5_10-58-33.png
Artikel-GFI und Kühl Artikel M kommen immer noch, da der Artikel mit dem Hauptartikelkennzeichen 'J' nicht in Verbindung mit dem Artikel gebracht werden kann wo Hauptartikelkennzeichen 'N' ist und der VerbundeneHauptartikel Artikel-GFI und Kühl Artikel M ist....

Und mir fehlen dann die anderen Hauptartikel: (s1.kzhauptart = 'J')

upload_2018-3-5_10-59-49.png
mit *select distinct* bekkomme ich die doppelten weg , nur mein Probleme ist noch immer die Verbindung zwischen Artikel und Verbunden Hauptartikel wenn diese einen gewissen Lieferanten aufweisen wie zb.: 'GFI'.......
 

Anhänge

  • upload_2018-3-5_10-54-3.png
    upload_2018-3-5_10-54-3.png
    15,2 KB · Aufrufe: 2
Zurück
Oben