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
ParameterXMLnicht leer, ersetzt esXML. - 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/INVBINgelesen. JedesINVBINergibt eine Zeile. Die ArtikelfelderITEMNRINT,ITEMKEY,EANUPCundOVERWRITESTOCKstammen aus dem übergeordnetenITEM. - Leere Werte für
SMTREF,SMOREF,BATCHNUMBERundBESTBEFOREDATEwerden als NULL behandelt.
Artikelermittlung Der Artikel wird in dieser Reihenfolge ermittelt:
- über
ITEMKEY - über
ITEMNRINT, falls kein Schlüssel gefunden wurde - ü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 undBESTBEFOREDATE. - Ist
STOCKangegeben, wird die Differenz zum aktuellen Bestand auf dem Lagerplatz berechnet. Eine positive Differenz wird zuStockAdd, eine negative zuStockRemove. Ohne Differenz wird eine Zeile mit Status 1 undNo stock change needederfasst. - Fehlt
SMOREFoderSMTREF, werden Standardwerte verwendet:- für Zugänge: Operation
API/PutToStockund Bewegungsart0201 - für Abgänge: Operation
API/TakeOutund Bewegungsart0301
- für Zugänge: Operation
- Die Lagerbewegungsoperation muss zur Anwendung
APIgehö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 mitPixi_InvBinScanIneingebucht. Andernfalls wird beiStockRemove> 0 mitPixi_InvBinTakeOutausgebucht. Als Lager dient dieBinLocIDdes 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.ItemRecalculateStockQueueeingetragen.
Hinweise
- Zusätzliche Ergebnismengen: Für jede verarbeitete Zeile führt der Code ein
SELECTohne Alias auf den aktuellenSMTREF-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 letzteSqlRowSetN. - 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 FelderStockAdd/StockRemove. Ein im XML übergebenesSTOCKADDkann daher bei negativer oder fehlender Differenz trotzdem eine Einbuchung auslösen.STOCKdaher nicht mitSTOCKADD/STOCKREMOVEkombinieren. - Variable
@deltawird nicht je Zeile zurückgesetzt: Bei Zeilen ohneSTOCKverwenden 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:
NEUTRALINVENTORYwird gelesen, aber nicht verwendet. Die EinstellungFilterStockOperationsWithLocationwird 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 1ohne 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_BaseundPixi_InvBinTakeOut_Baseliegen nicht vor, deren genaue Prüfungen und Meldungen sind daher unbekannt. Es gilt das MengenlimitMaxStockOperationLimit. - Stammdaten werden mit
NOLOCKgelesen.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
XML
|
varchar(max) xml |
NULL |
XML-Dokument mit Artikeln, deren Lagerplätzen und Bestandswerten. Wird ignoriert, wenn Beispiel:
|
ParameterXML
|
varchar(max) xml |
NULL |
Alternative Eingabe mit derselben Struktur wie Beispiel:
|
Username
|
varchar(50) string |
pipiSetStockMultiple |
Benutzername, der bei den Lagerbewegungen protokolliert wird. Beispiel: |
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. |
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. |
Beispielantwort
<SqlRowSet1>
<row>
<Column1>12</Column1>
</row>
</SqlRowSet1>
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>
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_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>
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><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>',
// 'ParameterXML' => '<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>',
// 'Username' => 'ShopImport',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiSetStockMultiple_AH', $soapArguments);
Verwandte Calls
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiSetStockMultiple_AH