Postman-Collection
Stock Schreiben

pixiSetStockMultiple_AH

Setzt, erhöht oder verringert den Bestand mehrerer Artikel auf Lagerplätzen in einem Aufruf anhand eines XML-Dokuments mit Bestandswerten je Lagerplatz.

Verarbeitet ein XML-Dokument mit einem oder mehreren Artikeln und deren Lagerplätzen und bucht die Bestandsänderungen als Lagerbewegungen.

Eingabe

  • Ist ParameterXML nicht leer, ersetzt es XML.
  • Der gesamte XML-Text wird vor dem Parsen in Großbuchstaben umgewandelt. Das betrifft Elementnamen und alle Werte, auch Lagerplatznamen und Chargennummern.
  • Zeilen werden aus /ITEMSTOCK/ITEM/INVBINS/INVBIN gelesen. Jedes INVBIN ergibt eine Zeile. Die Artikelfelder ITEMNRINT, ITEMKEY, EANUPC und OVERWRITESTOCK stammen aus dem übergeordneten ITEM.
  • Leere Werte für SMTREF, SMOREF, BATCHNUMBER und BESTBEFOREDATE werden als NULL behandelt.

Artikelermittlung Der Artikel wird in dieser Reihenfolge ermittelt:

  1. über ITEMKEY
  2. über ITEMNRINT, falls kein Schlüssel gefunden wurde
  3. über EANUPC, falls weiterhin kein Schlüssel gefunden wurde

Artikelschlüssel, Artikelnummer und EAN werden anschließend aus dem Artikelstamm übernommen.

Überschreibmodus Ist OVERWRITESTOCK = 1 für einen Artikel, wird für jeden weiteren Lagerplatz dieses Artikels eine Zeile mit Zielbestand 0 ergänzt. Das gilt für Lagerplätze, die aktuell Bestand haben (Summe > 0) und nicht im XML stehen. Diese Lagerplätze werden geleert.

Verarbeitung je Zeile Nur Zeilen mit ermitteltem Artikel und existierendem Lagerplatznamen werden einzeln verarbeitet:

  • Hat der Artikel das Chargen-Tag, aber die Zeile keine BATCHNUMBER, wird die Zeile ohne Meldung übersprungen. Ohne Chargen-Tag wird eine angegebene Charge ignoriert. Dieselbe Regel gilt für das MHD-Tag und BESTBEFOREDATE.
  • Ist STOCK angegeben, wird die Differenz zum aktuellen Bestand auf dem Lagerplatz berechnet. Eine positive Differenz wird zu StockAdd, eine negative zu StockRemove. Ohne Differenz wird eine Zeile mit Status 1 und No stock change needed erfasst.
  • Fehlt SMOREF oder SMTREF, werden Standardwerte verwendet:
    • für Zugänge: Operation API/PutToStock und Bewegungsart 0201
    • für Abgänge: Operation API/TakeOut und Bewegungsart 0301
  • Die Lagerbewegungsoperation muss zur Anwendung API gehören, und das Paar aus Operation und Bewegungsart muss in der Zuordnungstabelle für Lagerbewegungen existieren. Andernfalls wird die Zeile nicht gebucht.
  • Bei StockAdd > 0 wird mit Pixi_InvBinScanIn eingebucht. Andernfalls wird bei StockRemove > 0 mit Pixi_InvBinTakeOut ausgebucht. Als Lager dient die BinLocID des ersten Lagerplatzes mit diesem Namen.

Ergebnis und Folgeverarbeitung

  • Die abschließende Ergebnismenge listet die verarbeiteten Zeilen mit Status und Meldung.
  • Zeilen, deren Artikel oder Lagerplatz nicht gefunden wurde, werden mit Status 0 ergänzt.
  • Alle ermittelten Artikel werden zur Bestandsneuberechnung und zum Export in pixi.ItemRecalculateStockQueue eingetragen.

Hinweise

  • Zusätzliche Ergebnismengen: Für jede verarbeitete Zeile führt der Code ein SELECT ohne Alias auf den aktuellen SMTREF-Wert aus. Jedes davon wird als eigene Ergebnismenge geliefert. Die eigentliche Status-Ergebnismenge kommt daher zuletzt, nach je einer zusätzlichen Ergebnismenge pro verarbeiteter Zeile. Auszuwerten ist das letzte SqlRowSetN.
  • Großschreibung: Da das XML in Großbuchstaben umgewandelt wird, werden Chargennummern in Großbuchstaben gebucht.
  • Element STOCK: Ein leeres <STOCK/> wird zu 0 und leert den Lagerplatz. Ist kein absoluter Wert gemeint, das Element weglassen.
  • Kombination von Feldern: Bei Angabe von STOCK überschreibt die berechnete Differenz nur eines der Felder StockAdd/StockRemove. Ein im XML übergebenes STOCKADD kann daher bei negativer oder fehlender Differenz trotzdem eine Einbuchung auslösen. STOCK daher nicht mit STOCKADD/STOCKREMOVE kombinieren.
  • Variable @delta wird nicht je Zeile zurückgesetzt: Bei Zeilen ohne STOCK verwenden die Prüfungen die Differenz der vorherigen Zeile. Bei der ersten solchen Zeile ist der Wert NULL, die SMO-Prüfung entfällt dann.
  • Fehlende Zeilen im Ergebnis: Zeilen, die wegen fehlender Charge oder fehlendem MHD übersprungen werden, und Zeilen, die an der Prüfung "SMO not assigned to API" scheitern, erzeugen keine Ergebniszeile.
  • Nicht ausgewertet: NEUTRALINVENTORY wird gelesen, aber nicht verwendet. Die Einstellung FilterStockOperationsWithLocation wird gelesen, aber nicht weitergegeben.
  • Aktueller Bestand: Die Differenz wird über alle Lagerplätze gleichen Namens und über alle Chargen berechnet. Das Lager wird per TOP 1 ohne Sortierung ermittelt, doppelte Lagerplatznamen in verschiedenen Lagern können daher zu unerwarteten Buchungen führen.
  • Transaktionen: Es gibt keine Gesamttransaktion. Jede Buchung läuft in einer eigenen Transaktion innerhalb von Pixi_InvBinScanIn/Pixi_InvBinTakeOut. Eine fehlerhafte Zeile macht frühere Zeilen nicht rückgängig.
  • Aufgerufene Prozeduren: Pixi_InvBinScanIn_Base und Pixi_InvBinTakeOut_Base liegen nicht vor, deren genaue Prüfungen und Meldungen sind daher unbekannt. Es gilt das Mengenlimit MaxStockOperationLimit.
  • Stammdaten werden mit NOLOCK gelesen.

Parameter

Parameter Typ Standardwert Beschreibung
XML
varchar(max)
xml
NULL

XML-Dokument mit Artikeln, deren Lagerplätzen und Bestandswerten. Wird ignoriert, wenn ParameterXML nicht leer ist.

Beispiel:

<ITEMSTOCK>
  <ITEM>
    <ITEMNRINT>A-1001</ITEMNRINT>
    <ITEMKEY>12345</ITEMKEY>
    <EANUPC>4006381333931</EANUPC>
    <OVERWRITESTOCK>0</OVERWRITESTOCK>
    <INVBINS>
      <INVBIN>
        <BINNAME>A-01-01</BINNAME>
        <STOCK>25</STOCK>
        <STOCKADD>0</STOCKADD>
        <STOCKREMOVE>0</STOCKREMOVE>
        <NEUTRALINVENTORY>0</NEUTRALINVENTORY>
        <SMTREF/>
        <SMOREF/>
        <BATCHNUMBER>CH-2024-001</BATCHNUMBER>
        <BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE>
      </INVBIN>
    </INVBINS>
  </ITEM>
</ITEMSTOCK>
ParameterXML
varchar(max)
xml
NULL

Alternative Eingabe mit derselben Struktur wie XML. Hat Vorrang vor XML, wenn nicht leer.

Beispiel:

<ITEMSTOCK>
  <ITEM>
    <ITEMNRINT>A-1001</ITEMNRINT>
    <ITEMKEY>12345</ITEMKEY>
    <EANUPC>4006381333931</EANUPC>
    <OVERWRITESTOCK>1</OVERWRITESTOCK>
    <INVBINS>
      <INVBIN>
        <BINNAME>A-01-01</BINNAME>
        <STOCK>10</STOCK>
        <STOCKADD>0</STOCKADD>
        <STOCKREMOVE>0</STOCKREMOVE>
        <NEUTRALINVENTORY>0</NEUTRALINVENTORY>
        <SMTREF/>
        <SMOREF/>
        <BATCHNUMBER/>
        <BESTBEFOREDATE/>
      </INVBIN>
    </INVBINS>
  </ITEM>
</ITEMSTOCK>
Username
varchar(50)
string
pipiSetStockMultiple

Benutzername, der bei den Lagerbewegungen protokolliert wird.

Beispiel: ShopImport

Antwort

Result-Set 1 · Einmal je verarbeiteter Zeile, d. h. je Zeile mit ermitteltem Artikel und existierendem Lagerplatz, die nicht durch die Chargen-/MHD-Prüfung übersprungen wurde.

Unbeabsichtigte Debug-Ausgabe: der SMTREF-Wert der aktuellen Zeile vor Anwendung der Standardwerte. Die Spalte hat in SQL keinen Namen; der Client vergibt einen generischen Namen.

Spalte Typ Beschreibung
Column1
Kann leer sein
int

Referenz der Lagerbewegungsart der aktuellen Zeile, NULL wenn nicht angegeben.

Result-Set 2 · Immer, als letzte Ergebnismenge.

Status je Artikel/Lagerplatz. Der erste Teil enthält verarbeitete Zeilen mit erfasster Meldung. Der zweite Teil enthält Zeilen, deren Artikel oder Lagerplatz nicht gefunden wurde, mit Status 0.

Spalte Typ Beschreibung
ItemNrInt
Kann leer sein
varchar(50)
string

Interne Artikelnummer.

ItemKey
Kann leer sein
int

Artikelschlüssel, NULL wenn der Artikel nicht gefunden wurde.

Ean
Kann leer sein
varchar(13)
string

EAN/UPC des Artikels.

BinName
Kann leer sein
varchar(50)
string

Lagerplatzname (in Großbuchstaben).

Stock
Kann leer sein
int

Zielbestand laut XML bzw. 0 für durch den Überschreibmodus ergänzte Lagerplätze.

StockAdd
Kann leer sein
int

Zugangsmenge laut XML, nicht die berechnete Differenz.

StockRemove
Kann leer sein
int

Abgangsmenge laut XML, nicht die berechnete Differenz.

Error
Kann leer sein
varchar(8000)
string

Meldung der Buchung oder Prüfung, z. B. No stock change needed, Item not found.

Reason
Kann leer sein
varchar(50)
string

Leer für XML-Zeilen; bei durch den Überschreibmodus ergänzten Zeilen der am Lagerplatzartikel hinterlegte Grund.

SmoRef
Kann leer sein
int

Referenz der Lagerbewegungsoperation laut XML.

SmtRef
Kann leer sein
int

Referenz der Lagerbewegungsart laut XML.

status
Kann leer sein
int

Erfolgskennzeichen: 1 = Erfolg, 0 = Fehler; bei Buchungen der Rückgabewert der Ein-/Ausbuchungsprozedur.

BatchNumber
Kann leer sein
varchar(50)
string

Chargennummer laut XML.

BestBeforeDate
Kann leer sein
datetime
dateTime

Mindesthaltbarkeitsdatum laut XML.

Fehlermeldungen

Status Meldung Ursache
RAISERROR Error Message: API pipiSetStockMultiple: SMO is not assigned to API! Die Lagerbewegungsoperation in `SMOREF` (bzw. der Standard) gehört nicht zur Anwendung `API`. Wird mit Schweregrad 10 (informativ) ausgelöst; die Zeile wird nicht gebucht und erscheint nicht im Ergebnis. Eine SMO der Anwendung `API` verwenden.
0 Error Message: API pipiSetStockMultiple: SMT is not matched to SMO - please check Control Center - Stock Movements matching table! ItemKey = {ItemKey}, BinName = {BinName} Die Kombination aus `SMOREF` und `SMTREF` fehlt in der Zuordnungstabelle für Lagerbewegungen. Die Meldung wird zusätzlich in `LogTable` geschrieben und mit Schweregrad 1 ausgelöst. Zuordnung im Control Center pflegen.
0 Item and Bin not found Weder der Artikel (über Schlüssel, Nummer oder EAN) noch der Lagerplatzname wurde gefunden.
0 Item not found Der Artikel konnte weder über `ITEMKEY`, `ITEMNRINT` noch `EANUPC` ermittelt werden.
0 Bin not found Es existiert kein Lagerplatz mit dem angegebenen `BINNAME`.
RAISERROR Stock can not be set, scan in stock quantity is greater than limit of setting: MaxStockOperationLimit! Wird vom aufgerufenen `Pixi_InvBinScanIn` ausgelöst, wenn die Zugangsmenge die Einstellung `MaxStockOperationLimit` übersteigt.
RAISERROR Stock can not be set, take out stock quantity is greater than limit of setting: MaxStockOperationLimit! Wird vom aufgerufenen `Pixi_InvBinTakeOut` ausgelöst, wenn die Abgangsmenge die Einstellung `MaxStockOperationLimit` übersteigt.

Beispiele

POST https://apigateway.descartes.com/tms/pixi/
Content-Type: text/xml; charset=utf-8
Authorization: Basic BASE64(USERNAME:PASSWORD)

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
  <SOAP-ENV:Body>
    <ns1:pixiSetStockMultiple_AH>
      <!-- <XML><![CDATA[<ITEMSTOCK><ITEM><ITEMNRINT>A-1001</ITEMNRINT><ITEMKEY>12345</ITEMKEY><EANUPC>4006381333931</EANUPC><OVERWRITESTOCK>0</OVERWRITESTOCK><INVBINS><INVBIN><BINNAME>A-01-01</BINNAME><STOCK>25</STOCK><STOCKADD>0</STOCKADD><STOCKREMOVE>0</STOCKREMOVE><NEUTRALINVENTORY>0</NEUTRALINVENTORY><SMTREF></SMTREF><SMOREF></SMOREF><BATCHNUMBER>CH-2024-001</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></XML> -->
      <!-- <ParameterXML><![CDATA[<ITEMSTOCK><ITEM><ITEMNRINT>A-1001</ITEMNRINT><ITEMKEY>12345</ITEMKEY><EANUPC>4006381333931</EANUPC><OVERWRITESTOCK>1</OVERWRITESTOCK><INVBINS><INVBIN><BINNAME>A-01-01</BINNAME><STOCK>10</STOCK><STOCKADD>0</STOCKADD><STOCKREMOVE>0</STOCKREMOVE><NEUTRALINVENTORY>0</NEUTRALINVENTORY><SMTREF></SMTREF><SMOREF></SMOREF><BATCHNUMBER></BATCHNUMBER><BESTBEFOREDATE></BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></ParameterXML> -->
      <!-- <Username>ShopImport</Username> -->
    </ns1:pixiSetStockMultiple_AH>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Verwendete Tabellen

items · Lesen InvBin · Lesen InvBinItem · Lesen StockMovementOperations · Lesen StockMovementTypes · Lesen StockMovementMatching · Lesen Settings · Lesen TagMatch · Lesen LogTable · Schreiben ItemRecalculateStockQueue · Schreiben
SQL-Objekt:
dbo.pipiSetStockMultiple_AH
Prozedur zuletzt geändert am 2026-10-05
Dokumentation von claude-opus-5-5 am 2026-10-30 geschrieben