pixiCreateDelivery
Legt eine Lieferantenlieferung (Wareneingang) mit Status NEW an, entweder aus einer bestätigten Lieferantenbestellung oder aus per XML übergebenen Artikelzeilen.
Der Aufruf legt einen Lieferungskopf in SDelHeader (Status NEW) und die zugehörigen Positionen in SDelDetail an. Es gibt zwei Modi, gesteuert über OrderNr.
Kopfwerte
- Ohne
ParameterXMLwerden die einfachen Parameter verwendet. - Mit
ParameterXMLersetzen die Werte des einzigen Knotens/CREATE_DELIVERY/Deliverydie WerteLocID(Standard001),OrderNr(Standard0),UserName(StandardAPI), die Notiz und die externe Bestellnummer.SupplNraus dem XML hat Vorrang, sonst gilt der ParameterSupplNr.ExternalReceiptNrkann nur im XML übergeben werden. Ist dieLocIDunbekannt, wird eine Fehlerzeile geliefert.
Modus 1: OrderNr <> 0 (Vorlage aus Lieferantenbestellung)
- Der Lieferant wird aus der Bestellung ermittelt (
pixi.SupplierOrder.InternalNumber=OrderNr). Deren Lieferlager mussLocIDentsprechen. - Die Bestellung muss einen lieferbaren Status haben: bestätigt (
IsConfirmed) bei EinstellungConfirmOrderedDocumentOnDelivery=0, bestellt oder bestätigt (IsOrderedConfirmed) bei1. - Es darf noch keine Lieferung im Status
NEWexistieren, die die Bestellnummer referenziert. - Die Lieferung wird über
Pixi_CreateSDeliveryByTemplateerzeugt. Sie erhält je Bestellposition mit offener Menge (bestellt minus geliefert minus nicht geliefert) eine Position. Die gelieferte Menge ist0, Preis und Rabatt stammen aus der Bestellposition.
Modus 2: OrderNr = 0 (freie Lieferung / XML-Positionen)
- Der Lieferant (
SupplNr) muss angegeben sein und existieren. - Jeder Knoten
ITEMS/Itemwird überAddItemsdieses Lieferanten einem Artikel zugeordnet, perItemNrInt,EANoderItemNrSuppl. Zeilen ohne passenden Artikel werden als fehlgeschlagen gemeldet. - Eine Zeile mit
InternalNumberwird der Bestellung mit dieser internen Nummer zugeordnet. Eine Zeile nur mitExternalCodewird der Bestellung mit diesem externen Code zugeordnet. Es zählen nur Bestellungen mit LieferlagerLocID, und der Artikel wird in den Bestellpositionen gesucht. - Zeilen, die eine Zuordnungsregel verletzen (
Error01–Error07), werden als fehlgeschlagen gemeldet und nicht geliefert. Zeilen ohneInternalNumberundExternalCodewerden ohne Bezug zu einer Bestellposition geliefert. - Für jede verbleibende Zeile gilt:
Orderedist der XML-Wert, falls ungleich 0, sonst die Menge der Bestellposition.SupplPriceist der XML-Wert, sonst der Preis der Bestellposition.Deliveredwird mit der Bestelleinheit des Artikels multipliziert, wenn beim LieferantenUsePackingUnitAtCreateDeliverygesetzt ist.- Der Rabatt ist 0.
- Das Kopffeld
PurchaseOrderNrenthält eine kommagetrennte Liste aller zugeordneten Bestellnummern. Wurde keine Bestellung zugeordnet, enthält es die externe Bestellnummer ohne abschließendes;. - Bei fehlgeschlagenen Zeilen wird ein Block
Failed To Import Line Items:mit diesen Zeilen an die Lieferungsnotiz angehängt. Die Notiz ist insgesamt auf 8000 Zeichen begrenzt. - Ohne Positionen wird nur ein Kopf angelegt.
Ergebnis
- Ergebnismenge 1: der angelegte Lieferungskopf.
- Ergebnismenge 2: die Positionen, ergänzt um die Kennungen aus der Anfrage.
- Ergebnismenge 3 (nur bei XML-Positionen in Modus 2): die fehlgeschlagenen Zeilen.
Bei Validierungsfehlern wird statt dieser Ergebnismengen eine einzelne Zeile mit der Spalte ERROR geliefert.
Hinweise
- Keine Transaktion. Kopf und Positionen werden in dieser Prozedur nacheinander ohne explizite Transaktion eingefügt. Ein Laufzeitfehler mittendrin kann einen Kopf mit nur einem Teil der Positionen hinterlassen. Der Vorlagenweg verwendet nur für die Positionen eine eigene Transaktion.
- Vorlagenweg ändert den Bestellstatus. Bei
ConfirmOrderedDocumentOnDelivery=1setztPixi_CreateSDeliveryByTemplatedie Lieferantenbestellung auf den bestätigten Status. Fehler dieser Prozedur werden alsERROR --- …ausgelöst. - Prüfung auf offene Lieferung ist ein Teilstring-Vergleich. Die Prüfung auf eine bestehende
NEW-Lieferung sucht die Bestellnummer als Text inSDelHextOrderNr. Bestellung123wird daher auch durch eine offene Lieferung zu Bestellung1234blockiert. ExternalReceiptNrwird nur aus dem XML gelesen. Duplikate je Lieferant werden abgewiesen.SuplierOrderNRExternalwird meist überschrieben. Mit XML wird der Wert beiOrderNr= 0 aufNULLgesetzt. BeiOrderNr<> 0 wird er gar nicht weitergegeben. Wirksam ist er daher nur ohne XML, als Ersatzwert fürPurchaseOrderNr.- Vorrang der Notiz. Mit XML ersetzt die Notiz aus dem XML (oder ein Leerstring) den Parameter
Note. Im Vorlagenmodus wird bei leerer XML-Notiz auf den ParameterNotezurückgegriffen. LocIDwird nur auf dem XML-Weg geprüft. Ohne XML und mitOrderNr= 0 wird auch bei unbekannterLocIDein Kopf angelegt.- Ignorierte XML-Elemente.
ItemNameundItemKeyin den XML-Positionen werden gelesen, aber ignoriert. Name und Schlüssel stammen immer aus den Artikelstammdaten. - Eine Anfragezeile kann mehrere Lieferpositionen erzeugen. Steht der Artikel mehrfach in der zugeordneten Bestellung, entsteht je Bestellposition eine Lieferposition, jeweils mit der vollen Liefermenge.
- Error02 bei geteilten externen Codes. Die Zuordnung per
ExternalCodefindet auch Bestellungen anderer Lieferanten am selben Lager, und solche Zeilen werden mitError02abgewiesen. - Ungesicherte Lesezugriffe. Die meisten Lesezugriffe verwenden
NOLOCK. - Nummerierung in Kommentaren. Kommentare im Code nennen die Menge der fehlgeschlagenen Zeilen "result set 4", tatsächlich ist es die dritte gelieferte Ergebnismenge.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
LocID
|
varchar(3) string |
001 |
Lager der Lieferung. Wird durch Beispiel: |
OrderNr
|
int | 0 |
Interne Nummer der Lieferantenbestellung. Beispiel: |
SupplNr
|
varchar(4) string |
NULL |
Lieferantennummer. Bei Beispiel: |
SuplierOrderNRExternal
|
varchar(8000) string |
NULL |
Externe Bestellnummer, Ersatzwert für Beispiel: |
UserName
|
varchar(50) string |
API |
Benutzer, der als Ersteller und letzter Bearbeiter gespeichert wird. Wird durch Beispiel: |
Note
|
ntext string |
NULL |
Notiz zur Lieferung, auf 8000 Zeichen gekürzt. Mit XML wird sie durch die XML-Notiz ersetzt; im Vorlagenmodus dient sie als Ersatz bei leerer XML-Notiz. Beispiel: |
ParameterXML
|
xml | NULL |
Optionales XML mit genau einem Kopf Beispiel:
|
Antwort
Result-Set 1 · Bei Erfolg (kein Validierungsfehler)
Kopf der angelegten Lieferung.
| Spalte | Typ | Beschreibung |
|---|---|---|
DeliveryKey
|
int |
Schlüssel der Lieferung ( |
DeliveryNr
Kann leer sein |
string |
Lieferungsnummer ( |
SupplNR
Kann leer sein |
string |
Lieferantennummer. |
DeliveryNote
Kann leer sein |
string |
Lieferungsnotiz, ggf. mit angehängtem Block fehlgeschlagener Zeilen. |
DeliveryNrExternal
Kann leer sein |
string |
Veraltet, immer NULL. |
ExternalReceiptNr
Kann leer sein |
string |
Externe Wareneingangsnummer aus dem XML. |
PurchaseOrderNr
Kann leer sein |
string |
Referenzierte Bestellnummer(n) ( |
Result-Set 2 · Bei Erfolg (kein Validierungsfehler)
Positionen der angelegten Lieferung mit den Kennungen der zugehörigen Anfragezeile (im Vorlagenmodus NULL).
| Spalte | Typ | Beschreibung |
|---|---|---|
SDelDkey
|
int |
Schlüssel der Lieferposition. |
SDelDHref
|
int |
Schlüssel des Lieferungskopfs. |
SDelDItemRef
Kann leer sein |
int |
Artikelschlüssel. |
SDelDItemName
Kann leer sein |
string |
Artikelname. |
SDelDqtyDelivered
Kann leer sein |
int |
Gelieferte Menge (im Vorlagenmodus 0). |
SDelDqtyOrdered
Kann leer sein |
int |
Bestellte Menge. |
SDelDsorderlineRef
Kann leer sein |
int |
Id der verknüpften Bestellposition. |
SDelDsPrice
Kann leer sein |
decimal |
Lieferantenpreis. |
SDelDsDiscount
Kann leer sein |
decimal |
Rabatt in Prozent. |
SDelDsFinalPrice
Kann leer sein |
decimal |
Endpreis nach Rabatt. |
SDelDcreateDate
Kann leer sein |
dateTime |
Erstellungsdatum. |
SDelDcreateEmp
Kann leer sein |
string |
Erstellender Benutzer. |
SDelDupdateDate
Kann leer sein |
dateTime |
Datum der letzten Änderung. |
SDelDupdateEmp
Kann leer sein |
string |
Zuletzt ändernder Benutzer. |
SDelDsAddDiscount
Kann leer sein |
decimal |
Zusatzrabatt (0). |
SDelDsMidPrice
Kann leer sein |
decimal |
Mittelpreis (im XML-Modus 0, im Vorlagenmodus Endpreis). |
BatchNumber
Kann leer sein |
string |
Chargennummer. |
BestBeforeDate
Kann leer sein |
dateTime |
Mindesthaltbarkeitsdatum. |
EAN
Kann leer sein |
varchar(13) string |
EAN aus der Anfragezeile. |
ItemNrSuppl
Kann leer sein |
varchar(50) string |
Lieferantenartikelnummer aus der Anfragezeile. |
ItemNrInt
Kann leer sein |
varchar(50) string |
Interne Artikelnummer aus der Anfragezeile. |
InternalNumber
Kann leer sein |
int |
Interne Bestellnummer aus der Anfragezeile. |
ExternalCode
Kann leer sein |
varchar(50) string |
Externer Bestellcode aus der Anfragezeile. |
Result-Set 3 · Nur wenn OrderNr = 0 und das XML Knoten ITEMS/Item enthielt (ggf. 0 Zeilen)
Nicht importierte Anfragezeilen mit Grund.
| Spalte | Typ | Beschreibung |
|---|---|---|
ERROR
Kann leer sein |
varchar(1000) string |
Grund ( |
EANUPC
Kann leer sein |
varchar(50) string |
EAN der Zeile. |
SupplNr
Kann leer sein |
varchar(4) string |
Lieferantennummer (der Lieferung oder der zugeordneten Bestellung). |
InternalNumber
Kann leer sein |
int |
Interne Bestellnummer. |
ExternalCode
Kann leer sein |
varchar(50) string |
Externer Bestellcode. |
SupplierOrderId
Kann leer sein |
int |
Id der zugeordneten Bestellung, falls vorhanden. |
DeliveryId
Kann leer sein |
int |
Immer NULL. |
ItemNrSuppl
Kann leer sein |
varchar(50) string |
Lieferantenartikelnummer aus der Anfrage. |
ItemNrInt
Kann leer sein |
varchar(50) string |
Interne Artikelnummer aus der Anfrage. |
Qty
Kann leer sein |
int |
Liefermenge aus der Anfrage. |
Result-Set 4 · Bei einem Validierungsfehler, anstelle aller anderen Ergebnismengen
Einzelne Fehlerzeile; es wird nichts angelegt.
| Spalte | Typ | Beschreibung |
|---|---|---|
ERROR
|
varchar string |
Fehlermeldung. |
Beispielantwort
<SqlRowSet1>
<row>
<DeliveryKey>48213</DeliveryKey>
<DeliveryNr>48213</DeliveryNr>
<SupplNR>LIE1</SupplNR>
<DeliveryNote>Lieferung per Spedition</DeliveryNote>
<ExternalReceiptNr>WE-2024-0815</ExternalReceiptNr>
<PurchaseOrderNr>10234</PurchaseOrderNr>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| ERROR | ERROR: More than one delivery defined in the XML structure. | Das XML enthält mehr als einen Knoten `Delivery`. Pro Aufruf nur eine Lieferung senden. |
| ERROR | ERROR: Unknown LocID. | Nur XML-Weg: Die `LocID` existiert nicht in `Location`. |
| ERROR | ERROR: No supplier defined for delivery. | Bei `OrderNr` <> 0 (XML): keine Bestellung mit dieser Nummer am Lager. Bei `OrderNr` = 0: keine `SupplNr` angegeben. |
| ERROR | ERROR: Supplier with supplier number: "{SupplNr}" does not exist. | `OrderNr` = 0 und die Lieferantennummer existiert nicht in `Suppliers`. |
| ERROR | ERROR: For given External Receipt Number already exists an delivery for that same supplier. | Für diesen Lieferanten existiert bereits eine Lieferung mit derselben `ExternalReceiptNr`. |
| ERROR | ERROR: Supplier order already has an open delivery. | Vorlagenmodus: Eine Lieferung im Status `NEW` referenziert die Bestellnummer bereits. Diese zuerst buchen oder löschen. |
| ERROR | ERROR: OrderNr does not exists or does not have status "{CON|BES/CON}"! | Vorlagenmodus: Die Bestellung existiert nicht an diesem Lager oder hat keinen lieferbaren Status (`CON`, bzw. `BES/CON` bei `ConfirmOrderedDocumentOnDelivery` = 1). |
| RAISERROR | ERROR --- {error message} | Ausgelöst von `Pixi_CreateSDeliveryByTemplate`, wenn das Einfügen der Positionen fehlschlägt; das Einfügen der Positionen wird zurückgerollt. |
| ERROR | Item not found: no item matches the supplied identifiers for this supplier | Fehlzeilen: Kein `AddItems`-Eintrag des Lieferanten passt zu `ItemNrInt`, `EAN` oder `ItemNrSuppl`. |
| ERROR | Error01: External Code belongs to multiple Purchase orders | Fehlzeilen: Der `ExternalCode` existiert auf mehreren Bestellungen des Lieferanten. `InternalNumber` verwenden. |
| ERROR | Error02: Purchase order belongs to a different supplier | Fehlzeilen: Die zugeordnete Bestellung gehört zu einem anderen Lieferanten. |
| ERROR | Error03: No Purchase Order match for External Code | Fehlzeilen: Keine Bestellung an diesem Lager hat den `ExternalCode`. |
| ERROR | Error04: Item not found on Purchase Order | Fehlzeilen: Bestellung über `ExternalCode` gefunden, der Artikel ist aber nicht enthalten. |
| ERROR | Error05: Item not found on Purchase Order | Fehlzeilen: Bestellung über `InternalNumber` gefunden, der Artikel ist aber nicht enthalten. |
| ERROR | Error06: Purchase Order is not on proper status | Fehlzeilen: Die zugeordnete Bestellung hat keinen lieferbaren Status. |
| ERROR | Error07: No Purchase Order match for Internal Number | Fehlzeilen: Keine Bestellung an diesem Lager hat die `InternalNumber`. |
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:pixiCreateDelivery>
<!-- <LocID>001</LocID> -->
<!-- <OrderNr>0</OrderNr> -->
<!-- <SupplNr>LIE1</SupplNr> -->
<!-- <SuplierOrderNRExternal>EXT-4711</SuplierOrderNRExternal> -->
<!-- <UserName>WMS</UserName> -->
<!-- <Note>Lieferung per Spedition</Note> -->
<!-- <ParameterXML><![CDATA[<CREATE_DELIVERY><Delivery><LocID>001</LocID><OrderNr>0</OrderNr><SupplNr>LIE1</SupplNr><SupplOrderNrExt>EXT-4711</SupplOrderNrExt><Username>WMS</Username><Note>Lieferung per Spedition</Note><ExternalReceiptNr>WE-2024-0815</ExternalReceiptNr><ITEMS><Item><EAN>4006381333931</EAN><ItemNrSuppl>SUP-100</ItemNrSuppl><ItemNrInt>ART-100</ItemNrInt><Ordered>10</Ordered><Delivered>10</Delivered><SupplPrice>4.95</SupplPrice><ItemName>Kugelschreiber blau</ItemName><ItemKey>0</ItemKey><BatchNumber>L2024-01</BatchNumber><BestBeforeDate>2025-12-31</BestBeforeDate><InternalNumber>10234</InternalNumber><ExternalCode>PO-A-77</ExternalCode></Item></ITEMS></Delivery></CREATE_DELIVERY>]]></ParameterXML> -->
</ns1:pixiCreateDelivery>
</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:pixiCreateDelivery>
<!-- <LocID>001</LocID> -->
<!-- <OrderNr>0</OrderNr> -->
<!-- <SupplNr>LIE1</SupplNr> -->
<!-- <SuplierOrderNRExternal>EXT-4711</SuplierOrderNRExternal> -->
<!-- <UserName>WMS</UserName> -->
<!-- <Note>Lieferung per Spedition</Note> -->
<!-- <ParameterXML><![CDATA[<CREATE_DELIVERY><Delivery><LocID>001</LocID><OrderNr>0</OrderNr><SupplNr>LIE1</SupplNr><SupplOrderNrExt>EXT-4711</SupplOrderNrExt><Username>WMS</Username><Note>Lieferung per Spedition</Note><ExternalReceiptNr>WE-2024-0815</ExternalReceiptNr><ITEMS><Item><EAN>4006381333931</EAN><ItemNrSuppl>SUP-100</ItemNrSuppl><ItemNrInt>ART-100</ItemNrInt><Ordered>10</Ordered><Delivered>10</Delivered><SupplPrice>4.95</SupplPrice><ItemName>Kugelschreiber blau</ItemName><ItemKey>0</ItemKey><BatchNumber>L2024-01</BatchNumber><BestBeforeDate>2025-12-31</BestBeforeDate><InternalNumber>10234</InternalNumber><ExternalCode>PO-A-77</ExternalCode></Item></ITEMS></Delivery></CREATE_DELIVERY>]]></ParameterXML> -->
</ns1:pixiCreateDelivery>
</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 = [
// 'LocID' => '001',
// 'OrderNr' => '0',
// 'SupplNr' => 'LIE1',
// 'SuplierOrderNRExternal' => 'EXT-4711',
// 'UserName' => 'WMS',
// 'Note' => 'Lieferung per Spedition',
// 'ParameterXML' => '<CREATE_DELIVERY><Delivery><LocID>001</LocID><OrderNr>0</OrderNr><SupplNr>LIE1</SupplNr><SupplOrderNrExt>EXT-4711</SupplOrderNrExt><Username>WMS</Username><Note>Lieferung per Spedition</Note><ExternalReceiptNr>WE-2024-0815</ExternalReceiptNr><ITEMS><Item><EAN>4006381333931</EAN><ItemNrSuppl>SUP-100</ItemNrSuppl><ItemNrInt>ART-100</ItemNrInt><Ordered>10</Ordered><Delivered>10</Delivered><SupplPrice>4.95</SupplPrice><ItemName>Kugelschreiber blau</ItemName><ItemKey>0</ItemKey><BatchNumber>L2024-01</BatchNumber><BestBeforeDate>2025-12-31</BestBeforeDate><InternalNumber>10234</InternalNumber><ExternalCode>PO-A-77</ExternalCode></Item></ITEMS></Delivery></CREATE_DELIVERY>',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiCreateDelivery', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiCreateDelivery