pixiDeleteOrder
Löscht einen kompletten Auftrag, sofern alle Auftragspositionen den Status ANG, HAL oder STO haben und keine auf einer aktiven Pickliste steht.
Löscht den über OrderNr angegebenen Auftrag samt abhängigen Daten und liefert eine Statuszeile.
Prüfungen (vor jeder Änderung):
- Der Auftragskopf wird über
OrderNrgesucht und mit Auftragspositionen, Bankzuordnungen, Kundenkonto-Ereignissen und Picklistenpositionen verknüpft. Wird keine Zeile gefunden, lautet das Ergebnis404. - Hat eine Auftragsposition einen anderen Status als
ANG,HALoderSTO, lautet das Ergebnis409. - Steht eine Auftragsposition auf einer Pickliste, deren Ablaufdatum (
PLHexpiryDate) in der Zukunft liegt, lautet das Ergebnis409mit der Picklisten-Meldung. Diese Prüfung läuft zuletzt, ihre Meldung gewinnt also, wenn beide 409-Bedingungen zutreffen.
Schlägt eine Prüfung fehl, wird nichts geändert.
Löschschritte (in einer Transaktion):
- Für jede Auftragsposition wird ein
OrderHistory-Eintrag mit StatusNEWund MitarbeiterAPIgeschrieben. - Die Auftragspositionen werden nicht physisch gelöscht, sondern vom Auftrag gelöst und zurückgesetzt:
OrderNr,CustRef,AddrRef,ShipAdrRefwerden0,StatuswirdNEW,UpdateEmpwirdAPI, Menge, Preise, Beträge, Rabatte, Steuer und Versandkosten werden0,ItemRef,ShipRef,Order_Id,BundleOrderlineRefwerden NULL. - Referenzierte Bundle-Positionen (
BundleOrderlines) werden gelöscht. - Auftragskopf-Attribute (
OrderHeaderAttribute) werden gelöscht. - Reservierungen (
Reservation) der Auftragspositionen werden gelöscht. - Das mit der Bankzuordnung des Auftrags verknüpfte Kundenkonto-Ereignis wird über
Pixi_CA_DeleteEventgelöscht (dabei können auch die zugehörige Rechnung, Bankzuordnungen, Kundenkonto-Matches, DTAUS-Datensätze oder manuelle Buchungen gelöscht werden). - Abschließend löscht
Pixi_DeleteEmptyOrderPicklisten-Prüfeinträge, Tag-Zuordnungen, restliche Kopfattribute und den Auftragskopf selbst.
Bei Erfolg enthält die Statuszeile 200 und einen Bestätigungstext. Unerwartete SQL-Fehler werden protokolliert und als 500 mit der SQL-Fehlermeldung zurückgegeben.
Hinweise
- Die Kandidatendaten werden mit
NOLOCKgelesen; Änderungen nutzenROWLOCK.XACT_ABORTist aktiv. Besteht beim Aufrufer bereits eine Transaktion, wird statt einer neuen Transaktion ein Savepoint gesetzt. CONTEXT_INFOwird zeitweise gesetzt, um die Trigger aufOrderlinesundReservationzu umgehen; deren Triggerlogik läuft für diese Änderungen also nicht.- Stolperfalle: Die Prozedur legt einen eindeutigen Index auf den Positionsschlüssel der Kandidatendaten an. Kommt eine Auftragsposition in den verknüpften Daten mehrfach vor (z. B. mehrere Bankzuordnungen zum Auftrag oder die Position steht auf mehreren Picklisten, auch abgelaufenen), schlägt die Indexerstellung fehl und der Aufruf liefert
500. - Es wird nur ein Kundenkonto-Ereignis gelöscht (
TOP 1ohne Sortierung), auch wenn mehrere Bankzuordnungen existieren. Ob es gelöscht werden darf, entscheidetfPixi_CA_canIdeleteEvent; Rechnungen werden überPixi_DeleteInvoiceentfernt. Beide Objekte liegen nicht vor, ihr genaues Verhalten ist daher hier nicht dokumentiert. Pixi_CA_DeleteEventrollt bei einem Fehler die gesamte Transaktion zurück und wirft die Meldung erneut; sie kommt dann als Status500zurück.- Fehler in
Pixi_DeleteEmptyOrderwerden dort überlog.InsertErrorprotokolliert und nicht weitergereicht. - Auch bei 404 oder 409 wird eine leere Transaktion geöffnet und committet.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
OrderNr
Pflicht
|
int | – |
Nummer des zu löschenden Auftrags ( Beispiel: |
Antwort
Result-Set 1 · Immer (genau eine Zeile)
Statuszeile mit dem Ergebnis des Aufrufs.
| Spalte | Typ | Beschreibung |
|---|---|---|
Status
|
varchar(3) string |
|
ErrorMsg
Kann leer sein |
varchar(2000) string |
Bestätigungs- oder Fehlertext. |
Beispielantwort
<SqlRowSet1>
<row>
<Status>200</Status>
<ErrorMsg>Order with OrderNr: 100234 was deleted.</ErrorMsg>
</row>
</SqlRowSet1>
Fehlermeldungen
| Status | Meldung | Ursache |
|---|---|---|
| 404 | Order with OrderNr: {OrderNr} was not found. | Es existiert kein Auftragskopf mit der angegebenen `OrderNr`. Auftragsnummer prüfen. |
| 409 | Order can only be deleted when all orderline statuses are in ("ANG","HAL","STO"). | Mindestens eine Auftragsposition hat einen anderen Status als `ANG`, `HAL` oder `STO`. Zuerst die Positionsstatus anpassen. |
| 409 | Order is already on active picklist. | Mindestens eine Auftragsposition steht auf einer noch nicht abgelaufenen Pickliste. Positionen zuerst von der Pickliste entfernen. |
| 500 | Pixi_CA_DeleteEvent: deleting of DTAUS record not allowed | Das Kundenkonto-Ereignis des Auftrags gehört zu einem DTAUS-Datensatz, dessen Status kein Löschen erlaubt. Die gesamte Löschung wird zurückgerollt. |
| 500 | {ERROR_MESSAGE()} | Sonstiger SQL-Fehler beim Löschen, z. B. ein doppelter Positionsschlüssel beim Anlegen des eindeutigen Index auf den Kandidatendaten. Der Fehler wird protokolliert und die Transaktion zurückgerollt. |
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:pixiDeleteOrder>
<OrderNr>100234</OrderNr>
</ns1:pixiDeleteOrder>
</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:pixiDeleteOrder>
<OrderNr>100234</OrderNr>
</ns1:pixiDeleteOrder>
</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 = [
'OrderNr' => '100234',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiDeleteOrder', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiDeleteOrder