pixiSetStockMultiple
Setzt oder ändert den Bestand von Artikeln auf Lagerplätzen anhand eines XML-Dokuments und liefert je verarbeitetem Lagerplatz-Eintrag eine Ergebniszeile.
Verarbeitet eine Liste von Artikeln mit Lagerplatz-Einträgen und bucht je Eintrag Lagerbewegungen (Einlagern / Auslagern).
Ablauf
- Prüft die Einstellung
API_Stock_Movements. Ist sie nicht aktiviert, wird eine einzelneERROR-Zeile geliefert, ansonsten passiert nichts. - Ist
ParameterXMLnicht leer, ersetzt esXML. Der gesamte XML-Text wird in Großbuchstaben umgewandelt (Elementnamen und Werte). - Das XML wird über
/ITEMSTOCK/ITEM/INVBINS/INVBINgelesen. JeITEM:ITEMKEY,ITEMNRINT,EANUPC,OVERWRITESTOCK. JeINVBIN:BINNAME,STOCK,STOCKADD,STOCKREMOVE,NEUTRALINVENTORY,SMTREF,SMOREF,BATCHNUMBER,BESTBEFOREDATE. Leere Werte fürSMTREF,SMOREF,BATCHNUMBERundBESTBEFOREDATEgelten als NULL. - Der Artikel wird in dieser Reihenfolge ermittelt: über
ITEMKEY, dannITEMNRINT, dannEANUPC. Artikelschlüssel, Artikelnummer und EAN des gefundenen Artikels werden ergänzt. - Bei
OVERWRITESTOCK= 1 wird für jeden weiteren Lagerplatz (nach Name) mit positivem Bestand des Artikels, der nicht im XML steht, ein zusätzlicher Eintrag mit Zielbestand 0 angelegt – der Bestand dort wird also geleert. - Übersteigt der höchste Wert von
STOCK(bzw.STOCKADD, wennSTOCKleer ist) die EinstellungMaxStockOperationLimit, bricht der Aufruf mit einem Fehler ab, bevor Bestand geändert wird. - Jeder Eintrag mit gefundenem Artikel und existierendem Lagerplatznamen wird verarbeitet:
- Ist der Artikel für Charge (Tag -6) markiert, aber kein
BATCHNUMBERangegeben, oder für MHD (Tag -7) markiert, aber keinBESTBEFOREDATEangegeben, wird der Eintrag übersprungen. Ohne entsprechende Markierung wird der Wert ignoriert. - Ist
STOCKgesetzt, wird die Differenz zum aktuellen Bestand auf allen Lagerplätzen dieses Namens berechnet. Eine positive Differenz wird eingelagert, eine negative ausgelagert; bei Differenz 0 entsteht die ErfolgsmeldungNo stock change needed. - Andernfalls werden
STOCKADD/STOCKREMOVEwie angegeben gebucht. - Fehlt
SMOREFoderSMTREF, werden Standardwerte verwendet: LagerbewegungsoperationAPI/PutToStockmit Bewegungsart0201beim Einlagern,API/TakeOutmit Bewegungsart0301beim Auslagern. - Die Kombination aus SMO und SMT muss in der Zuordnungstabelle der Lagerbewegungen existieren, sonst schlägt der Eintrag mit einer Fehlermeldung fehl.
- Die Buchung erfolgt über
Pixi_InvBinScanIn(Einlagern) bzw.Pixi_InvBinTakeOut(Auslagern) mit dem übergebenenUsername, Charge und MHD.
- Ist der Artikel für Charge (Tag -6) markiert, aber kein
- Je Eintrag wird eine Ergebniszeile geliefert: verarbeitete Einträge mit Erfolgs- oder Fehlermeldung, Einträge mit nicht gefundenem Artikel oder Lagerplatz sowie übrige, nicht verarbeitete Einträge mit der Charge/MHD-Meldung.
- Alle ermittelten Artikel werden in
pixi.ItemRecalculateStockQueuezur Bestandsneuberechnung und zum Export eingereiht.
Hinweise
- Keine Gesamttransaktion: Jede Buchung wird einzeln durch
Pixi_InvBinScanIn/Pixi_InvBinTakeOutfestgeschrieben. Ein Aufruf kann teilweise erfolgreich sein;statusist je Zeile zu prüfen. - Das XML wird vollständig in Großbuchstaben umgewandelt, Lagerplatznamen und Chargen werden also in Großschreibung verarbeitet.
- Numerische Elemente besser weglassen statt leer zu senden: ein leeres
STOCKkann als 0 gelesen werden und setzt den Bestand dann auf 0. - Lagerplätze werden nur über
BINNAMEidentifiziert. Existiert derselbe Name in mehreren Lagern, wird der aktuelle Bestand über alle summiert und das Lager von einem beliebigen passenden Lagerplatz (TOP 1) genommen. Die EinstellungFilterStockOperationsWithLocationwird gelesen, aber nicht verwendet. OVERWRITESTOCK= 1 leert den Artikel auf allen anderen Lagerplätzen mit positivem Bestand, in allen Lagern.MaxStockOperationLimitwird hier nur fürSTOCK/STOCKADDgeprüft. Die aufgerufenen Prozeduren prüfen die Menge erneut (auch beim Auslagern); ein solcher Fehler wird abgefangen, protokolliert und als Zeile mitstatus0 und leeremErrorgeliefert.STOCKnicht mitSTOCKADD/STOCKREMOVEim selben Eintrag kombinieren: die expliziten Werte können zusätzlich gebucht werden. Die berechnete Differenz wird zudem zwischen Einträgen nicht zurückgesetzt, was Einträge ohneSTOCKbeeinflussen kann.- Ist die SMO nicht der Anwendung
APIzugeordnet, wird nur eine Informationsmeldung (Schweregrad 10) gesendet; die Zeile erscheint dann mit der irreführenden Charge/MHD-Meldung. - Einträge ohne zu buchende Menge (z. B. nur
NEUTRALINVENTORY, das gelesen, aber nicht verwendet wird) erhalten ebenfalls die Charge/MHD-Meldung. - Im Ergebnis zeigen
STOCKADD/STOCKREMOVE/SMOREF/SMTREFdie Eingabewerte, nicht die berechneten oder Standardwerte.Reasonist bei XML-Einträgen leer und enthält bei durchOVERWRITESTOCKergänzten Einträgen den Grund des Lagerplatz-Bestands. Das Ergebnis hat keine definierte Sortierung. - SMT/SMO-Fehlzuordnungen und abgefangene Fehler werden in
LogTablegeschrieben. Die Meldungstexte der Buchungsprozeduren stammen ausPixi_InvBinScanIn_Base/Pixi_InvBinTakeOut_Base, die nicht beigefügt sind. - Lesezugriffe erfolgen mit
NOLOCK.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
XML
|
varchar(max) xml |
NULL |
XML-Dokument mit Artikeln und deren Lagerplatz-Einträgen (Wurzel Beispiel:
|
ParameterXML
|
varchar(max) xml |
NULL |
Alternative zu Beispiel:
|
Username
|
varchar(50) string |
pipiSetStockMultiple |
Benutzername, der für die Lagerbewegungen erfasst wird. NULL wird durch Beispiel: |
Antwort
Result-Set 1 · Wenn die Einstellung API_Stock_Movements nicht aktiviert ist.
Einzelne Statuszeile; es wird kein Bestand geändert.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(5) string |
Immer |
StatusMessage
|
varchar(72) string |
Fehlertext zur nicht aktivierten Einstellung. |
Result-Set 2 · Wenn die Einstellung aktiviert ist und die Mengenprüfung bestanden wird.
Eine Zeile je Lagerplatz-Eintrag aus dem XML (zuzüglich durch OVERWRITESTOCK ergänzter Einträge) mit dem Verarbeitungsergebnis. Keine definierte Sortierung.
| Spalte | Typ | Beschreibung |
|---|---|---|
ITEMNRINT
Kann leer sein |
varchar(50) string |
Interne Artikelnummer (vom gefundenen Artikel, sonst aus dem XML). |
ITEMKEY
Kann leer sein |
int |
Artikelschlüssel; NULL, wenn der Artikel nicht gefunden wurde. |
EAN
Kann leer sein |
varchar(50) string |
EAN/UPC des Artikels. |
BINNAME
Kann leer sein |
varchar(50) string |
Lagerplatzname (in Großbuchstaben). |
STOCK
Kann leer sein |
int |
Zielbestand aus dem XML (0 bei durch |
STOCKADD
Kann leer sein |
int |
Einzulagernde Menge wie im XML übergeben (nicht die berechnete Differenz). |
STOCKREMOVE
Kann leer sein |
int |
Auszulagernde Menge wie im XML übergeben (nicht die berechnete Differenz). |
Error
Kann leer sein |
varchar(8000) string |
Fehlermeldung, wenn der Eintrag fehlgeschlagen ist oder nicht verarbeitet wurde. |
Reason
Kann leer sein |
varchar(50) string |
Leer bei XML-Einträgen; Grund des Lagerplatz-Bestands bei durch |
SMOREF
Kann leer sein |
int |
Schlüssel der Lagerbewegungsoperation aus dem XML (Standardwerte werden nicht angezeigt). |
SMTREF
Kann leer sein |
int |
Schlüssel der Lagerbewegungsart aus dem XML (Standardwerte werden nicht angezeigt). |
status
Kann leer sein |
bit boolean |
1 = Erfolg, 0 = Fehler oder nicht verarbeitet. |
BATCHNUMBER
Kann leer sein |
varchar(50) string |
Charge aus dem XML. |
BESTBEFOREDATE
Kann leer sein |
datetime dateTime |
MHD aus dem XML. |
SuccessMessage
Kann leer sein |
varchar(8000) string |
Erfolgsmeldung, z. B. |
Beispielantwort
<SqlRowSet1>
<row>
<ITEMNRINT>ART-1001</ITEMNRINT>
<ITEMKEY>1234</ITEMKEY>
<EAN>4006381333931</EAN>
<BINNAME>A-01-01</BINNAME>
<STOCK>25</STOCK>
<STOCKADD>0</STOCKADD>
<STOCKREMOVE>0</STOCKREMOVE>
<Reason/>
<status>true</status>
<SuccessMessage>No stock change needed</SuccessMessage>
</row>
<row>
<ITEMNRINT>ART-1002</ITEMNRINT>
<ITEMKEY>1235</ITEMKEY>
<EAN>4006381333948</EAN>
<BINNAME>Z-99-99</BINNAME>
<STOCKADD>5</STOCKADD>
<Error>Bin not found</Error>
<Reason/>
<status>false</status>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | Setting "API Calls Stock Movements" (API_Stock_Movements) is not enabled. | Die Einstellung `API_Stock_Movements` ist nicht auf 1 gesetzt. In den Pixi-Einstellungen aktivieren. |
| RAISERROR | Stock can not be set, stock quantity is greater than limit of setting: MaxStockOperationLimit! | Der höchste Wert von `STOCK` (bzw. `STOCKADD`) im XML übersteigt `MaxStockOperationLimit`. Der gesamte Aufruf wird ohne Änderungen abgebrochen; Mengen korrigieren oder aufteilen. |
| RAISERROR | Error Message: API pipiSetStockMultiple: SMO is not assigned to API! | Die angegebene `SMOREF` gehört zu keiner Lagerbewegungsoperation der Anwendung `API` und es besteht eine Bestandsdifferenz. Nur Informationsmeldung (Schweregrad 10); der Eintrag wird übersprungen. 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 SMO und SMT fehlt in der Zuordnungstabelle der Lagerbewegungen. Wird in `Error` geliefert, zusätzlich protokolliert und als Meldung mit Schweregrad 1 gesendet. 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`. |
| 0 | Item stock was not updated. Item tagged with Batch Number and/or Best Before Date but no information provided. | Der Artikel erfordert Charge und/oder MHD, der Wert fehlte. Wird auch für Einträge geliefert, die aus anderen Gründen übersprungen wurden (SMO nicht der API zugeordnet, keine zu buchende Menge). |
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>
<!-- <XML><![CDATA[<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></XML> -->
<!-- <ParameterXML><![CDATA[<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></ParameterXML> -->
<!-- <Username>shop-sync</Username> -->
</ns1:pixiSetStockMultiple>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
curl -X POST 'https://apigateway.descartes.com/tms/pixi/' \
--user 'USERNAME:PASSWORD' \
--header 'Content-Type: text/xml; charset=utf-8' \
--data-binary @- <<'XML'
<?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>
<!-- <XML><![CDATA[<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></XML> -->
<!-- <ParameterXML><![CDATA[<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>]]></ParameterXML> -->
<!-- <Username>shop-sync</Username> -->
</ns1:pixiSetStockMultiple>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML
<?php
$soapClient = new SoapClient(null, [
'login' => 'USERNAME',
'password' => 'PASSWORD',
'location' => 'https://apigateway.descartes.com/tms/pixi/',
'uri' => 'https://apigateway.descartes.com/tms/pixi/',
]);
$arguments = [
// 'XML' => '<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>',
// 'ParameterXML' => '<ITEMSTOCK><ITEM><ITEMKEY>1234</ITEMKEY><ITEMNRINT>ART-1001</ITEMNRINT><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-01</BATCHNUMBER><BESTBEFOREDATE>2025-12-31T00:00:00</BESTBEFOREDATE></INVBIN></INVBINS></ITEM></ITEMSTOCK>',
// 'Username' => 'shop-sync',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiSetStockMultiple', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiSetStockMultiple