pixiBinUpdate
Aktualisiert einen oder mehrere bestehende Lagerplätze aus einer XML-Liste und liefert je Lagerplatz eine Statuszeile.
Aktualisiert bestehende Lagerplätze in InvBin. Lagerplätze werden über BinKey identifiziert; neue Lagerplätze werden nicht angelegt.
- Ist
BinsXMLleer oder nicht als XML lesbar, wird eine einzelneERROR-Zeile geliefert und nichts geändert. - Jedes Element
/Bins/Binwird gelesen:BinKey,Name,LocId,Group,SortNr,MaxItems,TransportBin. - Jeder Lagerplatz wird geprüft. Ein Lagerplatz, der eine Prüfung nicht besteht, erhält
Status=ERRORund eine Meldung und wird übersprungen. Die erste fehlgeschlagene Prüfung gilt. Die Prüfungen sind:BinKeyfehlt oder ist0.SortNroderMaxItemsist keine ganze Zahl oder ist negativ.LocIdweicht vom aktuellen Lager ab und der Lagerplatz hat noch Bestand (InvBinItem).- Der resultierende Name existiert bereits bei einem anderen Lagerplatz:
- im selben Lager, immer geprüft;
- in einem anderen Lager, nur geprüft, wenn die Einstellung
FilterStockOperationsWithLocationden Wert0hat; - bei übergebenem
TransportBin= 1 unter allen Transportlagerplätzen.
- Die angegebene
LocIdexistiert nicht inLocation. - Es gibt keinen Lagerplatz mit diesem
BinKey.
- Alle gültigen Lagerplätze werden in einer Transaktion aktualisiert. Nicht übergebene Elemente behalten ihren aktuellen Wert. Die Aktualisierung setzt
BinName,BinLocID,BinGroup,BinSortNum,BinMaxItemsundTransportBinsowieUpdateEmpundUpdateDate. - Pro
Bin-Element wird eine Zeile geliefert, sortiert nach der Position im XML (Row). Jede Zeile hatStatus=UPDATEDoderERROR.
Hinweise
- Beibehaltene Werte: Die meisten Elemente werden über
text()gelesen. Ein leeres Element (z. B.<SortNr/>) gilt daher als nicht übergeben, und der aktuelle Wert bleibt erhalten.Groupwird ohnetext()gelesen: Ein leeres<Group/>setzt die Gruppe auf einen Leerstring. - Gelieferte Werte: Die Ergebniszeilen enthalten die Werte wie im XML übergeben, nicht die zusammengeführten, in
InvBingespeicherten Werte. Nicht übergebene Felder werden alsNULLgeliefert. - Transportlagerplätze: Die Duplikatprüfung für Transportlagerplätze schließt den Lagerplatz selbst nicht aus. Wird
TransportBin= 1 für einen Lagerplatz übergeben, der bereits Transportlagerplatz ist, wird daherBin Name not updated (Duplicated).gemeldet. - Duplikate innerhalb eines Aufrufs: Namen werden nur gegen bestehende Zeilen in
InvBingeprüft, nicht gegen andereBin-Elemente desselben Aufrufs. - Wirkungslose Prüfung: Die Prüfung
Bin not updated. Name is empty.greift nur bei Zeilen ohneBinKey. Solche Zeilen scheitern bereits an derBinKey-Prüfung, die Meldung tritt daher praktisch nicht auf. - Konvertierungsfehler: Ein nicht ganzzahliger
BinKeyoder ein ungültigerTransportBin-Wert (alles außer0,1,true,false) schlägt beim Lesen des XML fehl. Das geschieht vor demTRY-Block und kommt alsSqlMessagezurück.SortNrundMaxItemswerden mitTRY_PARSEgelesen und erzeugen stattdessen Statuszeilen. - Lesehinweise: Die Prüfungen lesen
InvBin,InvBinItemundLocationmitNOLOCK. - Transaktion: Die Aktualisierung erfolgt mit
ROWLOCKin einer eigenen Transaktion bzw. einem Savepoint, wenn bereits eine Transaktion offen ist. - Unerwartete Fehler: Der Fehler wird über
log.InsertErrorprotokolliert (nicht beigefügt), die Transaktion zurückgerollt und eine ZeileStatus=ERRORgeliefert. DerenMessageenthält@@ERRORnach dem Protokollaufruf, also eine Zahl (meist0) und nicht den Fehlertext. - UpdateEmp: Ein leerer Wert für
UpdateEmpwird durchAPIersetzt.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
BinsXML
Pflicht
|
varchar(max) xml |
– |
XML-Liste der zu aktualisierenden Lagerplätze, Wurzel Beispiel:
|
UpdateEmp
|
varchar(50) string |
API |
Benutzername, der in Beispiel: |
Antwort
Result-Set 1 · Wenn BinsXML leer ist oder nicht als XML gelesen werden kann.
Einzelne Fehlerzeile; es wird nichts aktualisiert.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(5) string |
Immer |
Message
|
varchar(21) string |
Fehlertext. |
Result-Set 2 · Nach der Prüfung und erfolgreicher Aktualisierung.
Eine Zeile je Bin-Element der Eingabe, sortiert nach Position, mit den übergebenen Werten und dem Aktualisierungsstatus.
| Spalte | Typ | Beschreibung |
|---|---|---|
Row
|
int |
Position des |
BinKey
Kann leer sein |
int |
Lagerplatz-Schlüssel wie übergeben. |
BinName
Kann leer sein |
varchar(50) string |
Lagerplatzname wie übergeben; |
LocId
Kann leer sein |
varchar(3) string |
Lager-ID wie übergeben; |
BinGroup
Kann leer sein |
varchar(20) string |
Lagerplatzgruppe wie übergeben; |
SortNr
Kann leer sein |
int |
Gelesene Sortiernummer; |
MaxItems
Kann leer sein |
int |
Gelesene maximale Artikelanzahl; |
Status
|
varchar(10) string |
|
Message
|
varchar(50) string |
Fehlermeldung; Leerstring bei aktualisierten Lagerplätzen. |
TransportBin
Kann leer sein |
bit boolean |
Transportlagerplatz-Kennzeichen wie übergeben; |
Result-Set 3 · Wenn bei der Aktualisierung ein unerwarteter Fehler auftritt.
Fehlerzeile, nachdem der Fehler protokolliert und die Transaktion zurückgerollt wurde.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(5) string |
Immer |
Message
|
int |
Wert von |
Beispielantwort
<SqlRowSet1>
<row>
<Row>1</Row>
<BinKey>1234</BinKey>
<BinName>A-01-02</BinName>
<LocId>001</LocId>
<BinGroup>Regal A</BinGroup>
<SortNr>10</SortNr>
<MaxItems>50</MaxItems>
<Status>UPDATED</Status>
<Message/>
<TransportBin>false</TransportBin>
</row>
<row>
<Row>2</Row>
<BinKey>9999</BinKey>
<SortNr>20</SortNr>
<Status>ERROR</Status>
<Message>Bin not updated (Bin does not exist).</Message>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | XML contains no data. | `BinsXML` ist NULL oder leer. Ein `Bins`-Dokument übergeben. |
| ERROR | Cannot parse XML | `BinsXML` ist kein wohlgeformtes XML. |
| ERROR | Bin not updated. Bin key is empty. | `BinKey` fehlt oder ist `0` in einem `Bin`-Element. |
| ERROR | Bin not updated. Datatype error (SortNr). | `SortNr` ist keine ganze Zahl. |
| ERROR | Bin not updated. SortNr should be positive. | `SortNr` ist negativ. |
| ERROR | Bin not updated. Datatype error (MaxItems). | `MaxItems` ist keine ganze Zahl. |
| ERROR | Bin not updated. MaxItems should be positive. | `MaxItems` ist negativ. |
| ERROR | Bin not updated. Name is empty. | Zeile ohne `BinKey` und ohne Namen. Praktisch scheitern solche Zeilen bereits an der `BinKey`-Prüfung. |
| ERROR | Bin Location not updated. Bin has stock. | `LocId` weicht vom aktuellen Lager ab, der Lagerplatz hat aber noch Bestand. Den Lagerplatz vor dem Lagerwechsel leeren. |
| ERROR | Bin Name not updated (Duplicated). | Der resultierende Name wird bereits von einem anderen Lagerplatz verwendet. Das gilt für: dasselbe Lager; ein anderes Lager bei `FilterStockOperationsWithLocation` = 0; jeden Transportlagerplatz bei übergebenem `TransportBin` = 1. |
| ERROR | Bin not updated (Location does not exist). | Die angegebene `LocId` existiert nicht in `Location`. |
| ERROR | Bin not updated (Bin does not exist). | Es existiert kein Lagerplatz mit dem angegebenen `BinKey`. |
| ERROR | {@@ERROR} | Unerwarteter SQL-Fehler bei der Aktualisierung. Der Fehler wird protokolliert und die Transaktion zurückgerollt; `Message` enthält eine Zahl, nicht den Fehlertext. |
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:pixiBinUpdate>
<BinsXML><![CDATA[<Bins><Bin><BinKey>1234</BinKey><Name>A-01-02</Name><LocId>001</LocId><Group>Regal A</Group><SortNr>10</SortNr><MaxItems>50</MaxItems><TransportBin>0</TransportBin></Bin><Bin><BinKey>1235</BinKey><SortNr>20</SortNr></Bin></Bins>]]></BinsXML>
<!-- <UpdateEmp>WMS</UpdateEmp> -->
</ns1:pixiBinUpdate>
</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:pixiBinUpdate>
<BinsXML><![CDATA[<Bins><Bin><BinKey>1234</BinKey><Name>A-01-02</Name><LocId>001</LocId><Group>Regal A</Group><SortNr>10</SortNr><MaxItems>50</MaxItems><TransportBin>0</TransportBin></Bin><Bin><BinKey>1235</BinKey><SortNr>20</SortNr></Bin></Bins>]]></BinsXML>
<!-- <UpdateEmp>WMS</UpdateEmp> -->
</ns1:pixiBinUpdate>
</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 = [
'BinsXML' => '<Bins><Bin><BinKey>1234</BinKey><Name>A-01-02</Name><LocId>001</LocId><Group>Regal A</Group><SortNr>10</SortNr><MaxItems>50</MaxItems><TransportBin>0</TransportBin></Bin><Bin><BinKey>1235</BinKey><SortNr>20</SortNr></Bin></Bins>',
// 'UpdateEmp' => 'WMS',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiBinUpdate', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiBinUpdate