pixiPutIntoBox
Scannt eine einzelne Auftragsposition in eine Box ein (Scan-In mit Pickliste), teilt die Position bei Bedarf und prüft Charge und MHD.
Führt den Scan-In einer Auftragsposition in eine Versandbox durch, so wie es der Pixi-Versandclient beim Scan-In mit Pickliste tut. Der Aufruf arbeitet mit genau der Auftragsposition aus OrderlineKey.
Ablauf:
- Prüft, ob die Einstellung
Premium_APIaktiv ist. Andernfalls wird eine Fehlerzeile geliefert. - Liest Artikel und Lager der Auftragsposition. Ist die Einstellung
BatchManagementgleich1, wird geprüft, ob der Artikel das Chargen-Tag (TagId-6) oder das MHD-Tag (TagId-7) trägt. Ohne eines dieser Tags gilt die Chargenverwaltung für diesen Artikel als deaktiviert. - Ist die Chargenverwaltung deaktiviert, aber
BatchNumberoderBestBeforeDatewerden übergeben, endet der Aufruf mitWrong Batch Management data. - Ist die Chargenverwaltung aktiv, werden die aktiven Picklistenpositionen (
PLitem,Expired = 0) der Auftragsposition gezählt, deren Lagerplatz-Artikel genau die übergebene Charge und das übergebene MHD haben. Gibt es keine, endet der Aufruf mit einem Fehler. - Ist
PickListNrgleich0, die Auftragsposition liegt aber auf einer aktiven Pickliste, endet der Aufruf mitItem is part of picklist: …. - Sucht die Auftragsposition über die Scan-In-Suchlogik, eingeschränkt auf diese Position und die übergebene Pickliste. Die Position muss einen Status haben, der Scan-In erlaubt, darf nicht zu einem gesperrten Kunden oder einer gesperrten Adresse gehören (außer der Benutzer hat die Berechtigung
SHILC) und muss bei Angabe einer Pickliste auf dieser liegen. Wird nichts gefunden:No order found!. - Ermittelt die Menge, die in die Box gelegt wird:
- die Picklistenmenge der Position, bei aktiver Chargenverwaltung begrenzt auf die Anzahl passender Chargen-Positionen;
- ist
ScannedQtyungleich0, darf sie diese Menge nicht überschreiten und ersetzt sie.
- Ist die Positionsmenge größer als diese Menge, wird die Auftragsposition geteilt, sodass der gescannte Teil die ermittelte Menge behält (
GOSBreakOrderline). - Ruft die interne Logik zum Einlegen in die Box auf (
Pixi_PutIntoBox). Sie verwendet die LagerbewegungsoperationScanInWithPicklistder AnwendungShippingClient_Aund den Log-GrundAPI - ScanIn with picklist. Die Logik:- übernimmt
FromBox/ToBoxaus dem Picklistenkopf, falls dort ein Boxbereich hinterlegt ist; - sucht eine Box für den Kunden oder führt eine interne Umlagerung durch, wenn das Auftragslager vom letzten Auftragslager abweicht;
- prüft, dass die Box keine Artikel eines anderen Kunden enthält und der Auftrag nicht bereits in einer anderen offenen Box liegt;
- aktualisiert die Auftragsposition für den Scan-In und gibt die Picklistenpositionen vom Lagerplatz frei;
- veröffentlicht das Message-Queue-Ereignis
ScanInPutIntoBoxundScanInBoxFull, wenn die Box nun voll ist.
- übernimmt
Ergebnis ist eine Zeile mit der Box und einem Wert in Action. IN BOX LEGEN bedeutet Erfolg; andere Werte beschreiben, warum der Artikel nicht in eine Box gelegt wurde.
Hinweise
- Erfordert die Einstellung
Premium_API. - Alle Lesezugriffe verwenden
NOLOCK. - Der Aufruf hat keine eigene Transaktion. Die Teilung der Auftragsposition in Schritt 8 läuft in einer eigenen Transaktion (mit Application-Lock auf der Position) und wird vor dem Einlegen in die Box festgeschrieben. Schlägt das Einlegen danach fehl, bleibt die Teilung bestehen.
- Ohne Pickliste (
PickListNr = 0) liefert die Scan-In-Suche eine Picklistenmenge von0. JedeScannedQtyungleich0wird dann abgelehnt, und die Teilung wird mit der neuen Menge0aufgerufen. Was die Teilung in diesem Fall tut, hängt vonGOSBreakOrderline_Baseab, das nicht vorliegt. Der Aufruf ist für den Scan-In mit Pickliste gedacht. - Jede
SupplOrderNrungleich0lässt die interne Positionssuche scheitern. Das Ergebnis ist dannFEHLERmit0010. BESTELL. GEANDERT !. - Ist
SupplGroupleer und der PositionsstatusSHL, wird stattdessen die an der Position gespeicherte Lieferantengruppe (SupplGroupScanIn) verwendet. Der Wert wird alsvarchar(4)weitergegeben. BestBeforeDatewird als 1900-01-01 weitergegeben, wenn es nicht übergeben wird. Ist die globale EinstellungBatchManagementgleich1und hat die PicklisteDaysBeforeBBDgesetzt, kann dieses Datum zuMHD nicht zulässigführen.- Die Einstellung
OnlyPicklistScanIn = 1ohne Pickliste liefert die AktionKeine Pickliste. - Deadlocks (Fehler 1205) beim Einlegen in die Box werden bis zu 10-mal wiederholt. Andere Fehler werden abgefangen, in
LogTableprotokolliert und als Aktionszeile statt als SQL-Fehler geliefert. - Mehrere aufgerufene Objekte liegen nicht vor:
Pixi_ShipToCustomer,Pixi_ShipIntern,GOSUpdateOrderlineForScanIn,Pixi_ReleasePLitemFromBin,GOSBreakOrderline_Base,pixi.FullBoxesGetundPixi_MQ_EventPublish. Deren genaue Datenänderungen und ob sie weitere Ergebnismengen oder Fehler erzeugen, sind nicht ersichtlich. - Bei einer internen Umlagerung (Auftragslager weicht vom letzten Auftragslager ab) wird kein Box-Schlüssel ermittelt, das Ergebnis zeigt daher
BoxNr= 0. - Der Text
MHD nicht zulässigist im Quellcode falsch kodiert und kann alsMHD nicht zulässigankommen.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
OrderlineKey
Pflicht
|
int | – |
Schlüssel der Auftragsposition, die in eine Box gescannt wird. Beispiel: |
SupplGroup
Pflicht
|
varchar(5) string |
– |
Lieferantengruppe, die beim Scan-In gespeichert wird. Ist sie leer und der Positionsstatus |
Username
Pflicht
|
varchar(50) string |
– |
Pixi-Benutzer, der den Scan-In durchführt. Wird für Berechtigungen, Protokollierung und die Aktualisierung der Position verwendet. Beispiel: |
SupplOrderNr
|
int | 0 |
Lieferantenbestellnummer. Muss Beispiel: |
FromBox
Pflicht
|
int | – |
Niedrigste zu verwendende Boxnummer. Wird durch den Boxbereich der Pickliste ersetzt, falls der Picklistenkopf einen definiert. Beispiel: |
ToBox
Pflicht
|
int | – |
Höchste zu verwendende Boxnummer. Wird durch den Boxbereich der Pickliste ersetzt, falls der Picklistenkopf einen definiert. Beispiel: |
SerialNr
Pflicht
|
varchar(200) string |
– |
Seriennummer des gescannten Artikels. |
PickListNr
|
int | 0 |
Picklistennummer ( Beispiel: |
IsPersonalizedScanIn
|
bit boolean |
0 |
Kennzeichnet den Scan-In eines personalisierten Artikels (Tag -1). Muss zum Tag des Artikels passen, sonst wird eine Fehleraktion geliefert. Erlaubte Werte
Beispiel: |
BinRef
|
int | 0 |
Lagerplatz-Schlüssel, der beim Freigeben der Picklistenpositionen vom Lagerplatz weitergegeben wird. Beispiel: |
BatchNumber
|
varchar(50) string |
NULL |
Charge des gescannten Artikels. Nur erlaubt, wenn die Chargenverwaltung für den Artikel aktiv ist; muss zu einer Picklistenposition der Auftragsposition passen. Beispiel: |
BestBeforeDate
|
datetime dateTime |
NULL |
MHD des gescannten Artikels. Nur erlaubt, wenn die Chargenverwaltung für den Artikel aktiv ist; muss zu einer Picklistenposition der Auftragsposition passen. Beispiel: |
ScannedQty
|
int | 0 |
Gescannte Menge. Beispiel: |
Antwort
Result-Set 1 · Wenn eine Prüfung vor dem Einlegen in die Box fehlschlägt (Einstellung, Chargendaten, Pickliste, Positionssuche, Menge).
Fehlerstatuszeile. In diesem Fall werden keine Daten geändert.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(5) string |
Immer |
StatusMessage
|
varchar string |
Fehlertext. |
Result-Set 2 · Wenn alle Prüfungen bestanden sind (geliefert von der internen Logik zum Einlegen in die Box).
Eine Zeile mit der Box und dem Ergebnis des Einlegens in die Box.
| Spalte | Typ | Beschreibung |
|---|---|---|
BoxKey
Kann leer sein |
int |
Schlüssel der Box; |
BoxNr
|
int |
Boxnummer; |
BoxColor
Kann leer sein |
varchar(7) string |
Farbe der Box; leer, wenn keine Box verwendet wurde. |
Action
|
varchar(200) string |
Ergebnis: |
DESCRIPTION
|
varchar(200) string |
Boxbeschreibung bei Erfolg, sonst der Fehler- bzw. Infotext. |
PackageId
Kann leer sein |
int |
Paket-ID einer Rechnungsentwurfs. Bei diesem Aufruf immer |
Beispielantwort
<SqlRowSet1>
<row>
<Status>ERROR</Status>
<StatusMessage>Item is part of picklist: 4711</StatusMessage>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | Setting "Premium_API" is not enabled. | Die Einstellung `Premium_API` ist nicht aktiv. Sie muss in Pixi aktiviert werden. |
| ERROR | Wrong Batch Management data | `BatchNumber` oder `BestBeforeDate` wurde übergeben, aber die Chargenverwaltung ist global deaktiviert oder der Artikel hat weder das Chargen- noch das MHD-Tag. Für solche Artikel beide Werte weglassen. |
| ERROR | Item(s) with selected batch number and/or best before date not on stock. Please enter the correct values. | Die Chargenverwaltung ist für den Artikel aktiv, aber keine aktive Picklistenposition der Auftragsposition hat die übergebene Charge und das MHD. Die Werte des gepickten Bestands übergeben. |
| ERROR | Item is part of picklist: {PLIheaderRef} | `PickListNr` ist `0`, aber die Auftragsposition liegt auf einer aktiven Pickliste. Diese Picklistennummer übergeben. |
| ERROR | No order found! | Die Scan-In-Suche hat die Auftragsposition nicht gefunden: falscher Status, nicht auf der übergebenen Pickliste, gesperrter Kunde/gesperrte Adresse oder abweichendes Lager. |
| ERROR | ScannedQty is higher than quantity on picklist | `ScannedQty` übersteigt die Picklistenmenge der Position (begrenzt auf passende Chargen-Positionen). Ohne Pickliste ist die Picklistenmenge `0`, daher wird nur `ScannedQty = 0` akzeptiert. |
| Keine Pickliste | Keine Pickliste | Die Einstellung `OnlyPicklistScanIn` ist `1` und es wurde keine Pickliste übergeben (geliefert in `Action`/`DESCRIPTION`). |
| MHD nicht zulässig | MHD nicht zulässig | Das MHD liegt vor dem heutigen Datum plus `DaysBeforeBBD` der Pickliste. |
| FEHLER | 0014. No Order Found!! | Die Pickliste enthält keine Position für den Artikel der Auftragsposition. |
| FEHLER | 0012. FEHLER: PERSONALISIERTER ARTIKEL NICHT AKTIVIERT! | `IsPersonalizedScanIn = 1`, aber der Artikel (bzw. sein Bundle) ist nicht als personalisiert markiert. |
| FEHLER | 0013. FEHLER: PERSONALISIERTER ARTIKEL OHNE BESTELLREFERENZ! | Der Artikel ist personalisiert, aber `IsPersonalizedScanIn` ist `0`. |
| FEHLER | 0010. BESTELL. GEANDERT ! | Die Auftragsposition hat keinen Scan-In-Status mehr, oder `SupplOrderNr` ist nicht `0`. |
| FEHLER | 0011. KEINE BOX GEFUNDEN! | Im Boxbereich `FromBox`–`ToBox` wurde keine freie Box gefunden. |
| FEHLER | Pixi_PutIntoBox problem check {boxes} orderlineKey={OrderlineKey} {Username} boxNr={BoxNr} | Die gewählte Box enthält Artikel eines anderen Kunden (`FB …`), oder der Auftrag liegt bereits in einer anderen offenen Box. |
| FEHLER | Der gescannte Artikel wurde bereits verarbeitet. | Der Artikel ist bereits in den Boxpositionen enthalten (doppelter Schlüssel in `boxitems`). |
| Bitte wiederholen! | Mehrfache Auslagerung | Die Auslagerung schlug mit Fehler 57251 fehl (mehrfache Auslagerung). Den Scan wiederholen. |
| FEHLER ... Exc. | {Info} | Beim Einlegen in die Box trat ein unerwarteter SQL-Fehler auf; Details werden in `LogTable` protokolliert. |
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:pixiPutIntoBox>
<OrderlineKey>123456</OrderlineKey>
<SupplGroup>?</SupplGroup>
<Username>api_user</Username>
<!-- <SupplOrderNr>0</SupplOrderNr> -->
<FromBox>1</FromBox>
<ToBox>200</ToBox>
<SerialNr>?</SerialNr>
<!-- <PickListNr>4711</PickListNr> -->
<!-- <IsPersonalizedScanIn>0</IsPersonalizedScanIn> -->
<!-- <BinRef>0</BinRef> -->
<!-- <BatchNumber>CH-2024-001</BatchNumber> -->
<!-- <BestBeforeDate>2025-12-31T00:00:00</BestBeforeDate> -->
<!-- <ScannedQty>2</ScannedQty> -->
</ns1:pixiPutIntoBox>
</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:pixiPutIntoBox>
<OrderlineKey>123456</OrderlineKey>
<SupplGroup>?</SupplGroup>
<Username>api_user</Username>
<!-- <SupplOrderNr>0</SupplOrderNr> -->
<FromBox>1</FromBox>
<ToBox>200</ToBox>
<SerialNr>?</SerialNr>
<!-- <PickListNr>4711</PickListNr> -->
<!-- <IsPersonalizedScanIn>0</IsPersonalizedScanIn> -->
<!-- <BinRef>0</BinRef> -->
<!-- <BatchNumber>CH-2024-001</BatchNumber> -->
<!-- <BestBeforeDate>2025-12-31T00:00:00</BestBeforeDate> -->
<!-- <ScannedQty>2</ScannedQty> -->
</ns1:pixiPutIntoBox>
</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 = [
'OrderlineKey' => '123456',
'SupplGroup' => '?',
'Username' => 'api_user',
// 'SupplOrderNr' => '0',
'FromBox' => '1',
'ToBox' => '200',
'SerialNr' => '?',
// 'PickListNr' => '4711',
// 'IsPersonalizedScanIn' => '0',
// 'BinRef' => '0',
// 'BatchNumber' => 'CH-2024-001',
// 'BestBeforeDate' => '2025-12-31T00:00:00',
// 'ScannedQty' => '2',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiPutIntoBox', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiPutIntoBox