Ich habe eine vorhandene gespeicherte Prozedur, die Einkaufswagen Artikel als einzelne Zeilen zurückgibt, mit einem der Felder ist der genannten Artikel.Nur bis zu einer maximalen Anzahl einfügen?
Im Falle eines Werbeangebots, zum Beispiel kaufen 2 und erhalten noch 2 kostenlos, dann wird das gleiche Produkt als zwei Zeilen zurückgegeben, mit einem separaten Preis und einer Menge für jeden. In diesem Fall 2 Zeilen mit einer Anzahl von 2 in jeder Zeile.
Die Prozedur prüft dann jede Zeile mit der Menge auf Lager und ändert die Zeile, falls erforderlich, durch Einfügen in eine neue Tabelle für die aktualisierte Bestellung. Normalerweise befinden sich viele Artikel für jedes Produkt auf einmal, aber in seltenen Situationen (normalerweise für Endlaufprodukte) können weniger Artikel auf Lager sein, als der Warenkorb insgesamt zulassen sollte.
In diesem Beispiel sagen wir, es gibt 3 übrig. Das Verfahren würde jede Reihe als normal vergleichen und sehen, dass es 3 auf Lager gibt und die Reihe nur nach 2 sucht. So besteht jede Reihe die Prüfung, obwohl wir eine kurze sind.
Das Problem, das ich habe, ist, wie kann ich eine laufende Summe von wie viel Elemente sind in den Warenkorb, wenn jede Reihe einzeln verglichen wird? Kann ich für jede Einfügung einen int-Wert deklarieren und aktualisieren?
bearbeiten Beispieldaten Problem zu veranschaulichen:
sagen können, die Auftragsnummer 1 kehrt das gleiche Produkt auf 3 Reihen. Die volle Preis, günstige und frei (wahrscheinlich keine realistische Situation, aber eine, die mein Chef will mir sowieso berücksichtigen)
LineID | ProductID | Price | Quantity | Note
001 | 00001 | 100 | 2 |
002 | 00001 | 50 | 2 |
003 | 00001 | 0 | 2 |
Diese Zeilen in einer temporären Tabelle sind item
, die zu den Produkten products
Tabelle von ProductID
verbunden ist die wie folgt aussehen würde:
ProductID | BasePrice | QuantityAvailable
00001 | 100 | 3
Dann werden die Produkte mit dieser Abfrage geprüft werden:
UPDATE item
SET
note =
CASE WHEN product.quantityAvailable <= 0 THEN 'This item is no longer available'
WHEN item.quantity > product.quantityAvailable THEN 'Not Enough Stock'
WHEN product.quantityAvailable > item.Quantity THEN REPLACE(note, 'Not Enough Stock', '')
ELSE 'Not Enough Stock' END
, quantity =
CASE WHEN product.quantityAvailable < item.Quantity THEN product.quantityAvailable
ELSE item.Quantity END
OUTPUT inserted.ID, deleted.note, inserted.note, deleted.quantity, inserted.quantity,
INTO @modifiedItems
FROM item
INNER JOIN product ON product.ProductID = item.ID
Das Endziel ist für die Positionstabelle die maximale Anzahl verfügbar in allen Reihen, mit dem Ergebnis, entsprechend aktualisiert werden:
LineID | ProductID | Price | Quantity | Note
001 | 00001 | 100 | 2 |
002 | 00001 | 50 | 1 | Not enough stock
003 | 00001 | 0 | 0 | Not enough stock
bearbeiten 2: Electric Boogaloo
habe ich versucht, zu verwenden, eine lokale Variable, um eine laufende Summe zu berechnen, aber diese scheint direkt auf den Gesamtwert zu springen. Beispiel unten:
DECLARE @runningTotalQuantity int = 0
UPDATE item
SET
note =
CASE WHEN product.quantityAvailable <= 0 THEN 'This item is no longer available'
WHEN item.quantity > product.quantityAvailable THEN 'Not Enough Stock'
WHEN product.quantityAvailable > item.Quantity THEN REPLACE(note, 'Not Enough Stock', '')
ELSE 'Not Enough Stock' END
, quantity =
CASE WHEN @runningTotalQuantity != 0 AND @runningTotalQuantity <= ItemLimits.limitedQty AND (@runningTotalQuantity + Item.Quantity) <= ItemLimits.limitedQty then Item.Quantity
WHEN (@runningTotalQuantity + Item.quantity) >= ItemLimits.limitedQty THEN (ItemLimits.limitedQty - @runningTotalQuantity) WHEN product.quantityAvailable < item.Quantity THEN product.quantityAvailable
ELSE item.Quantity END
, @runningTotalQuantity = @runningTotalQuantity + item.Quantity
OUTPUT inserted.ID, deleted.note, inserted.note, deleted.quantity, inserted.quantity,
INTO @modifiedItems
FROM item
INNER JOIN product ON product.ProductID = item.ID
Aber dies folgendes Ergebnis hat:
LineID | ProductID | Price | Quantity | Note
001 | 00001 | 100 | 2 |
002 | 00001 | 50 | 6 |
003 | 00001 | 0 | 6 |
Es anderen helfen könnte Ihre Frage, ob yo zu verstehen Sie enthalten einige Beispieldaten, die das Problem veranschaulichen. –