Abfrage einer Datenbank

DG1912

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich brauche Hilfe bei einer Abfrage einer Tabelle.

Und zwar geht es um ein Werkzeugentnahmesystem.
Wird ein Artikel aus einem Schrank entnommen wird dies in eine Operations-Tabelle geschrieben (als withdraw).
Sollte der Artikel Falsch entnommen worden sein und dieser zurück in den Schrank gelegt werden, wird dies auch in diese Operations-Tabelle geschrieben (als revert).
Die Zeile der vorherigen Entnahme wird dabei nicht aus der Tabelle gelöscht

Um einen Überblick der Entnahmen zu bekommen, mache ich eine Abfrage. Da die Operations-Tabelle alles speichert was gemacht wird, habe ich nach "withdraw" gefiltert. Es werden da dann auch die Artikel angezeigt die zurückgelegt worden sind.
Dabei möchte ich aber, das ein Artikel der zurückgelegt worden ist nicht bei dieser Abfrage erscheint.

Kann mir da einer helfen?

Vielen Dank in Voraus.

Gruß Dennis
 
Werbung:
Code sagt mehr als tausend Worte :-)

Am einfachsten verständlich löst man dieses Problem mit einem LEFT JOIN von "operations" mit sich selbst wo man dann im Nachgang prüft, ob erfolgreich gejoint werden konnte, sprich ob ein revert zum withdraw vorliegt. Ist das so wird der Datensatz gefiltert, die gejointe Tabelle muss also per Definition leer sein.

Wichtige Frage: Kannst du zu jedem revert auch auf den withdraw schließen, z.B. mit einer Art Vorgangsnummer die für beide Vorgänge identisch ist? Oder wird das nur hintereinander geloggt und theoretisch können mehrere identische withdraw und revert Aktionen hintereinander stehen?

Beispiel:
Code:
SELECT o1.*
FROM operations o1
LEFT JOIN operations o2
ON o1.vorgangsnr = o2.vorgangsnr
AND o2.aktion = 'revert'
WHERE o1.aktion = 'withdraw'
AND o2.primary_key IS NULL
 
Das kann ich leider nicht. Es wird keine Vorgangsnummer erstellt.
Ich muss aus den vorherigen Buchungen Artikelnummer, Menge und Fach wo der Artikel gelagert wird vergleichen.

SQL:
Select  o.ArticleNumber as Artikelnummer,
        o.Quantity*-1 as Menge,
        o.SYS_OP_Machine as Masch,
        o.DispenserLabel as Schrank,
        o.compartmentlabel as Fach,
        o.toolstatestock as Bestand,
        o.DateTime,
        o.SYS_OP_Parameter1,
        o.SYS_OP_Reason,
        o.SYS_OP_Parameter2,
        o.articlelabel,
        ((articleview.price/100)*Quantity/articleview.packingunit) as Kosten,
        o.actionname,
        o.idarticle,
        o.toolstatetext,
        articleview.price/100 as Price,
        articleview.articletypetext   


From    operationview as o
Left Join articleview on articleview.idarticle = o.idarticle


Where   o.toolstatetext = "Reground" and
        o.actionname = "withdraw" or
        o.actionname = "revert"
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    180,8 KB · Aufrufe: 1
Okay das macht die Sache etwas komplexer, zumal auch Fehler in den Daten ein Problem werden können.

Ausgehnd davon das alle Artikel richtig eingebucht werden und das ArticleNumber eindeutig ist (keine Typennummer sondern wirklich eine Art Seriennummer) würde ich passend sortieren und mit Window-Funktionen arbeiten (lag() und lead()). Welches DBMS in welcher Version ist das hier?
 
Zuletzt bearbeitet:
Werbung:
Beispiel:
Code:
SELECT    t.*
FROM    (

Select  o.ArticleNumber as Artikelnummer,
        o.Quantity*-1 as Menge,
        o.SYS_OP_Machine as Masch,
        o.DispenserLabel as Schrank,
        o.compartmentlabel as Fach,
        o.toolstatestock as Bestand,
        o.DateTime,
        o.SYS_OP_Parameter1,
        o.SYS_OP_Reason,
        o.SYS_OP_Parameter2,
        o.articlelabel,
        ((articleview.price/100)*Quantity/articleview.packingunit) as Kosten,
        o.actionname,
        o.idarticle,
        o.toolstatetext,
        articleview.price/100 as Price,
        articleview.articletypetext,
        lead(o.actionname) OVER (PARTITION BY o.ArticleNumber ORDER BY o.DateTime) AS lead_actionname


From    operationview as o
Left Join articleview on articleview.idarticle = o.idarticle


Where   o.toolstatetext = "Reground" and
        o.actionname = "withdraw" or
        o.actionname = "revert"

        ) t
WHERE    t.actionname = "withdraw"
AND    (    t.lead_actionname IS NULL
OR        t.lead_actionname <> "revert" )
 
Zurück
Oben