Bedingung in einer View bevor gerechnet wird

Springstil

Benutzer
Beiträge
17
Hallo zusammen,

kurze Sache vor weg :) Ich habe nicht besonders viel Ahnung von Datenbanken, mir macht es allerdings ziemlich viel Spaß Sachen auszuprobieren und zu tüfteln (natürlich immer mit einem vorherigem Backup :p)

Nun ist es so, das in unserer Firma die Warenwirtschaft ziemlicher schrott ist und erst gegen ende des Jahres endlich ausgetauscht wird. Allerdings haben wir ein großes Problem mit einigen Abfragen wo etwas falsch berechnet wird. Ich hoffe das man mir hier weiterhelfen kann.

Es gibt eine ViewLagerSummen diese berechnet beständige aus 2 Lägern zusammen.
ViewlagerSummen.png

Nun wird das aber Falsch berechnet! Und zwar wird der SummevonAuftragsbestand Doppelt gezählt und bei SummevonDispobestand wird doppelt abgezogen.

Er greift zum berechnen auf STLager zu
STLarger.png

Dort sind beide Läger aufgeführt also 1 und 2. Lager 0 ist beide zusammen.

Nun soll er sich eigendlich nur die werte von Lager 0 holen und berechnen... Aber irgendwas geht da wohl schief denn er rechnet in dem Falle z.b Lager 2 und 0 zusammen, bzw zieht es von SummevonDsipobestand wieder ab. Hier ist der Code der ViewLagerSummen

Code:
SELECT TOP
    ( 100 ) PERCENT ArtikelNr,
    SUM ( Dispo ) AS SummevonDispobestand,
    SUM ( Lager ) AS SummevonLagerbestand,
    SUM ( Auftrag ) AS SummevonAuftragsbestand,
    SUM ( Bestell ) AS SummevonBestellbestand,
    SUM ( Schwimm ) AS SummevonSchwimmbestand,
    SUM ( Inventur ) AS SummevonInventurbestand,
    SUM ( ZugangUnbewertet ) AS SummevonZugangUnbewertet,
    SUM ( MEfuerLS ) AS SummevonLagerLieferschein 
FROM
    (
    SELECT
        ArtikelNr,
        Dispobestand AS Dispo,
        Lagerbestand AS Lager,
        Auftragsbestand AS Auftrag,
        Bestellbestand AS Bestell,
        Schwimmbestand AS Schwimm,
        Inventurbestand AS Inventur,
        ZugangUnbewertet,
        MEfuerLS 
    FROM
        dbo.STLager 
    WHERE
        ( LagerNr > 0 ) 
        AND ( Stueckliste IS NULL ) 
        OR ( LagerNr > 0 ) 
        AND ( Stueckliste = 0 ) UNION
    SELECT
        ArtikelNr,
        Lagerbestand - Auftragsbestand - AuftragsbestandEinzel AS Dispo,
        Lagerbestand AS Lager,
        Auftragsbestand + AuftragsbestandEinzel AS Auftrag,
        Bestellbestand AS Bestell,
        Schwimmbestand AS Schwimm,
        Inventurbestand AS Inventur,
        ZugangUnbewertet,
        MEfuerLS 
    FROM
        dbo.STLager AS STLager_1 
    WHERE
        ( LagerNr = 0 ) 
        AND ( Stueckliste = 1 ) 
        AND ( Lagerbestand - Auftragsbestand - AuftragsbestandEinzel >= 0 ) UNION
    SELECT
        ArtikelNr,
        0 AS Dispo,
        Lagerbestand AS Lager,
        Auftragsbestand + AuftragsbestandEinzel AS Auftrag,
        Bestellbestand AS Bestell,
        Schwimmbestand AS Schwimm,
        Inventurbestand AS Inventur,
        ZugangUnbewertet,
        MEfuerLS 
    FROM
        dbo.STLager AS STLager_1 
    WHERE
        ( LagerNr = 0 ) 
        AND ( Stueckliste = 1 ) 
    AND ( Lagerbestand - Auftragsbestand - AuftragsbestandEinzel < 0 )) AS derivedtbl_1 
GROUP BY
    ArtikelNr 
ORDER BY
    ArtikelNr


Meine frage ist jetzt, da dieser Code nicht von mir ist und ich ihn auch nicht so richtig verstehe bzw durch blicke, ob mir das jemand ändern könnte das er nur mit Lager 0 arbeitet und nicht mit beiden lägern. Und mir dann vielleicht versuchen kann zu erklären wieso weshalb er das doppelt rechnet. Denn eigendlich müsste es doch richtig sein oder?

Lg Springstil
 
Werbung:
Das ist schwer zu sagen, ich müsste selbst erstmal die Intention dahinter verstehen. Die Summen werden ja aus einer Ergebnismenge berechnet in der drei Selects per UNION verbunden sind und das scheinbar aus anderen Gründen. In welchem Zusammenhang stehen denn LagerNr und Stückliste? Das ist mir nicht klar. Ich kann dir das selbe zweifelsohne kürzer formulieren aber Sinn ergibt die Abfrage für mich nicht. Ist die individuell von oder für euch erstellt worden oder arbeitet die WaWi standardmäßig damit?
 
Mir ist als die Antwort kam auch was aufgefallen was die Stücklisten angeht...

Lager 0 gibt es NUR wenn es ein Stücklisten Artikel ist. Das Bedeutet also, dass ein Stücklisten Artikel aus anderen Artikeln zusammen gesetzt werden. Wenn es z.b 2 Artikel sind werden die als 1 Stücklisten Artikel verkauft. Also z.b ein Strauß Rosen (Stücklisten Artikel) besteht aus 2 einzelnen Artikel.

Daher auch der AuftragsbestandEinzel! Haben wir von der Lila Rose 1 da, aber von der Roten Rose keinen, dann ist Stücklisten Menge = 0. Das fragt der AuftragsbestandEinzeln ab wenn ich das richtig gesehen habe.


Die WaWi (Eigendlich eine Frechheit das Programm so zu nennen :p) Errechnet das Selber im Programm. Die View ist für Abfragen gebaut worden von dem ehemaligen Entwickler der Software, der aber nicht mehr in diesem hause Tätig ist. Er hat auch bis heute nicht verstanden was ein Stücklisten Artikel ist...
 
Also wenn die View nur für diesen einen Zweck gebaut wurde kann es ja nicht schaden den Code auf einen sinnvollen Select zu beschränken, also z.B. alles außer Lager 0 zählen. Die Stücklisten sind ja im äußeren Select unerheblich wenn ich das richtig sehe.
 
Was heißt schon einfacher, was heißt Fehler ausbügeln. Wenn ich das richtig verstehe muss doch einfach nur viel Code raus, also mal hart gekürzt:
Code:
SELECT TOP
   ( 100 ) PERCENT ArtikelNr,
   SUM ( Dispobestand ) AS SummevonDispobestand,
   SUM ( Lagerbestand ) AS SummevonLagerbestand,
   SUM ( Auftragsbestand ) AS SummevonAuftragsbestand,
   SUM ( Bestellbestand ) AS SummevonBestellbestand,
   SUM ( Schwimmbestand ) AS SummevonSchwimmbestand,
   SUM ( Inventurbestand ) AS SummevonInventurbestand,
   SUM ( ZugangUnbewertet ) AS SummevonZugangUnbewertet,
   SUM ( MEfuerLS ) AS SummevonLagerLieferschein
FROM dbo.STLager
WHERE LagerNr > 0
GROUP BY
   ArtikelNr
ORDER BY
   ArtikelNr
 
Lager = 0 wird nicht berücksichtig, Lager > 0 sollte es ja immer geben, ob Stücklistenartikel oder nicht. Also zähle nur Lager > 0 und ignoriere den Rest, müsste ausreichen.
 
Sry für die späte Antwort.
Ich habe mir das ganze jetzt noch mal genauer angeschaut.... ich würde am liebsten diese View neu schreiben, aber das ist ziemlich Kompliziert und ich habe keine Ahnung wie ich das in einer SQL lösen solle.

Wenn ein Stücklisten Artikel die Artikel Nummer: 4711 hat, dann stehen hinter diesem Artikel z.b 5 Weitere Artikel die sich zu der 4711 zusammen setzen. Also z.b

4711 besteht aus: 3214 x 3 4566 x 6 4568 x 1

X steht hier für die Menge des Artikels.
Demen sprechend besteht 4711 aus 10 einzel Artikel !

für diese 3 Artikel gibt es natürlich Verfügbarkeiten. Soll heißen

3214 ist 300 mal auf lager
4566 ist 250 mal auf lager
und 4568 ist 800 mal auf lager

Nun müsste die View hingehen und folgendes Rechnen

(artikel 3214) 300 / 3 = 100
(artikel 4566) 250/ 6 = 41 (abrunden)
(artikel 4568 ) 800/ 1 = 800

Soweit würde ich das ja noch hinbekommen. ABER der kleinste wert ist hier die 41. Bedeutet 4711 kann NUR 41 mal hergestellt werden da der Rest ja fehlt. Und da habe ich absolut keine Ahnung wie ich das Bewerkstelligung soll...
 
Nun Stücklisten sind eine tolle Sache aber recht komplex wegen der rekursiven Abfrage. Ich kann nicht ganz erkennen wie du das machst aber mal als Beispiel:
Stücklisten Auflistung MSSQL
Wenn du letzteres tatsächlich schon hast ist es doch nur noch ein GROUP BY nach dem Hauptartikel mit min() um die maximal mögliche Stückzahl nach der am schlechtesten verfügbaren Komponente zu finden.
 
Das könnte wirklich eine einfache Lösung sein nur frage ich mich wie ich das mit min einsetzen soll. Glaube da geht es schon los das meine Kenntnisse versagen. Hast du vielleicht ein Beispiel wie man das gestalten könnte. denke ein Versuch ist es wert.


Edit: was ich nicht verstehe ist, ich gehe von dem Stücklisten Artikel Nummer aus. Dahinter stehen ja weitere Artikel Nummern. Und von denen muss ich min() auswerten. Oder?
 
Also ich bin soweit das ich alles richtig berechne was die Stückzahlen angeht. Nun habe ich aber das Problem mit MIN()

ich habe folgenden Spalten:

ArtikelNr, ArtikelStueckliste, Gesamtemenge


nun möchte ich hier den Min befehl anwenden. Nur verstehe ich nicht ganz wie ich ihn an meine Bedienung knüpfen kann.

Der Min soll auf Gesamtmenge ausgeführt werden WENN ArtikelNr gleich ist. und dann auch nur einmal die ArtikNr mit Min ausgeben.

Code:
SELECT

ArtikelNr,
ArtikelStueckliste,
MIN (Gesamt) over (PARTITION BY ArtikelStueckliste) as GesamtMenge


FROM
dbo.[Kevin_Stückliste_Berechnen]

GROUP BY ArtikelNr, ArtikelStueckliste,gesamtmenge

gibt trotzdem doppelte werte in ArtikelNr. aus ...
 
Zuletzt bearbeitet:
Werbung:
Das PARTITION BY ist überflüssig, aggregiert wird sowieso nur der Teil der auch zur Gruppierung gehört.

Die ArtikelNr verhindert, das nur nach Stückliste gruppiert wird aber genau das musst du tun.
Code:
SELECT
ArtikelStueckliste,
MIN (Gesamt) AS Gesamt
FROM dbo.[Kevin_Stückliste_Berechnen]
GROUP BY ArtikelStueckliste
Aus Daten wie
(Stückliste 4711) (artikel 3214) 300 / 3 = 100
(Stückliste 4711) (artikel 4566) 250/ 6 = 41
(Stückliste 4711) (artikel 4568 ) 800/ 1 = 800
wird dann 4711 = 41 und das ist die maximale Stückzahl die von 4711 produziert werden kann. Die Information, wieviel von den anderen Komponenten gebaut werden könnten, ist hier nicht relevant. Das mit einzubauen wäre komplexer.
 
Zuletzt bearbeitet:
Zurück
Oben