Announcement

Collapse
No announcement yet.

Durchlaufen einer Tabelle, Bestellungen mit negatvem Bestand

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Durchlaufen einer Tabelle, Bestellungen mit negatvem Bestand

    Hallo,
    ich habe eine Tabelle mit folgenden Feldern TeileNr, BestellNr, Stückzahl, Bestelldatum. Dabei kann es mehrere Bestellungen pro Teilenummern geben. Sortiert ist die Tabelle nach Teilenummer, Bestelldatum aufsteigend. In einer anderen Tabelle habe ich den Bestand zu den Teilenummern. Nun möchte ich für alle Teilenummern, die zugehörigen Sätze in der Bestellung durchlaufen und jeweils sie Stückzahl vom Bestand abziehen. Als Ergebnis benötige ich die Bestellungen, bei denen sich ein negativer Bestand ergibt.
    Das ganze geht warscheinlich mit einer SP zu realisieren. Ich weiß nur leider noch nicht wie. Vielleicht kann mir da jemand einen Tip dazu geben.
    Gruß
    Gerald

  • #2
    Hallo,

    jede Aufgabe kann im SQL Server auf zwei prinzipiell unterschiedlichen Wegen umgesetzt werden:
    1. Mengenorientierte Implementierung: Eine Ergebnisrelation (SELECT-Abfrage) verküpft über JOIN's die beteiligten Tabellen, wobei die gleiche Tabelle als Derived Table (Inline-View) mit variabler WHERE-Einschränkung mehrfach eingebunden werden kann, damit alle Kriterien berücksichtigt werden.
    2. Datensatzorientierte Implementierung: Ein CURSOR durchläuft die Ergebnisrealation einer Abfrage, um für jeden vorgefundenen Datensatz zusätzliche Schritte auszuführen.

    Generell ist ein CURSOR immer nur die 2. Wahl, so dass ein CURSOR nur dann genutzt werden sollte, wenn die Aufgabe auf dem mengenorientierten Weg nicht umgesetzt werden kann.

    Nun möchte ich für alle Teilenummern, die zugehörigen Sätze in der Bestellung durchlaufen ..
    Diese Anforderung erfüllt ein JOIN.

    ..jeweils die Stückzahl vom Bestand abziehen.
    Auch Berechnungen wie zum Beispiel SELECT 100 - 99 AS Ergebnis können direkt über T-SQL in der SELECT-Abfrage vorgenommen werden.

    Comment


    • #3
      Hallo,
      vielen Dank für den Tip. Ich werde es mal so ausprobieren.
      Gruß
      Gerald

      Comment


      • #4
        Hallo,
        also wie ich die Sache hier sehe, geht das Ganze wirklich nur mit einem Cursor. Es gibt ja mehrere Sätze in den Bestellungen, welche ich für jede Teilenummer einzeln durchgehen muß. Der Bestand verringert sich also mit jedem Datensatz und ich müßte ihn in einer Variablen abspeichern. Diese müßte dann für die nächste Teilenummer wieder mit dem Bestand aus der anderen Tabelle gefüllt werden. Am Ende möchte ich nur die Datensätze angezeigt bekommen, ab denen der Wert in der Variable negativ wird.
        Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt
        Vielleicht kann mir ja mal jemand erläutern, wie das mit einem Cursor funktioniert.
        Gruß
        Gerald

        Comment


        • #5
          Hallo,

          Vielleicht kann mir ja mal jemand erläutern, wie das mit einem Cursor funktioniert.
          ein CURSOR ist für die Datenbank eine "gefährliche" Sache, so dass ich dringend zu einem Buch rate, das dieses Thema abdeckt.

          Das folgende Beispiel durchläuft alle Datensätze einer Ergebnismenge, um jeden einzelnen Datensatz über den FETCH NEXT-Aufruf abzuholen und über eine separate gespeicherte Prozedur weiterzuverarbeiten:

          [highlight=SQL]
          DECLARE @id INT;
          DECLARE @datum VARCHAR(10);
          DECLARE @Cr CURSOR;
          SET @Cr = CURSOR LOCAL FAST_FORWARD
          FOR SELECT id, datum FROM UglyDates;
          OPEN @Cr
          BEGIN TRY
          FETCH NEXT FROM @Cr INTO @id, @datum;
          WHILE (@@FETCH_STATUS = 0)
          BEGIN
          EXEC dbo.spCheckInputSQL2005 @id, @datum;
          FETCH NEXT FROM @Cr INTO @id, @datum;
          END
          CLOSE @Cr
          END TRY
          BEGIN CATCH
          IF (CURSOR_STATUS('variable','@Cr') = 1)
          BEGIN
          CLOSE @Cr;
          PRINT 'Uups';
          END
          END CATCH
          DEALLOCATE @Cr;
          [/highlight]

          Comment

          Working...
          X