Postman-Collection
Invoices Schreiben

pixiUpdateInvoicePackageTrackingIds

Setzt Sendungs- und Retouren-Tracking-IDs einer Rechnung und, falls eindeutig bestimmbar, des zugehörigen Rechnungspakets und publiziert ein `InvoiceChanged`-Event.

Aktualisiert Tracking-Informationen einer Rechnung (Invoices) und ihres Pakets (pixi.InvoicePackage). Als Ergebnis wird immer eine Statuszeile mit Status und Message geliefert.

Prüfungen

  • Mindestens einer der Werte PackageId oder InvoiceNr und mindestens einer der Werte TrackingId oder ReturnTrackingId muss gefüllt sein. Andernfalls wird Status 400 geliefert. Eine PackageId von 0 gilt als leer.
  • Bei TrackingId und ReturnTrackingId wird je ein führendes und ein abschließendes ; entfernt.

Ermittlung von Rechnung und Paket

  • Mit InvoiceNr wird die Rechnung über die Rechnungsnummer gelesen. Alle Pakete mit Id = PackageId oder zur Rechnung gehörend werden geladen.
  • Nur mit PackageId wird das Paket geladen und die zugehörige Rechnung gelesen.
  • Wird nur InvoiceNr übergeben, hat die Rechnung mehrere Pakete und ist Overwrite = 1, wird Status 400 geliefert (PackageId ist erforderlich).
  • Wird kein Paket gefunden, wird Status 400 geliefert. Das gilt auch, wenn die Rechnung nicht existiert oder kein Paket hat. Gleiches gilt, wenn PackageId und InvoiceNr beide übergeben werden, das Paket aber nicht zur Rechnung gehört.
  • Überschreitet die Länge aus gespeichertem und neuem Wert 512 Zeichen, wird Status 411 geliefert. Geprüft wird dies für ShipmentTrackingID und für retTrackIDhist.

Welche Datensätze aktualisiert werden

  • Die Rechnung wird immer aktualisiert.
  • Das Paket wird in drei Fällen zusätzlich aktualisiert:
    • PackageId und InvoiceNr passen zusammen.
    • Nur InvoiceNr wird übergeben und die Rechnung hat genau ein Paket.
    • Nur PackageId wird übergeben.
  • Wird nur InvoiceNr übergeben, hat die Rechnung mehrere Pakete und ist Overwrite = 0, wird nur die Rechnung aktualisiert.

Sendungs-Tracking (TrackingId)

  • Overwrite = 0: TrackingId wird mit ; getrennt an Invoices.ShipmentTrackingID angehängt. Das geschieht nur, wenn der bestehende Wert sie noch nicht enthält (Teilstring-Vergleich).
  • Overwrite = 1: ShipmentTrackingID wird neu gebildet aus den Tracking-IDs aller anderen Pakete der Rechnung, jeweils gefolgt von ;, plus TrackingId. Ist TrackingId bereits in dieser Liste enthalten, wird ShipmentTrackingID auf TrackingId allein gesetzt.
  • Das Paket erhält nur das letzte ;-getrennte Segment von TrackingId als TrackingID.

Retouren-Tracking (ReturnTrackingId)

  • Overwrite hat auf das Retouren-Tracking keinen Einfluss.
  • Ist ReturnTrackingId noch nicht in Invoices.retTrackID enthalten:
    • retTrackID wird auf das letzte ;-getrennte Segment gesetzt.
    • Der vollständige Wert wird mit abschließendem ; an retTrackIDhist angehängt.
  • Das Paket erhält das letzte Segment als ReturnTrackingId.

Weitere Schritte

  • Die Rechnung erhält UpdateDate = GETDATE() und UpdateEmp = '(Return) TrackingID API Update'.
  • Das Paket erhält RecordModifiedOn und RecordModifiedByUserId, die ID des Benutzers API.
  • Mit ResetClientNotifiedFlag = 1 wird ClientNotified auf N gesetzt, und zwar beim jeweils letzten AUS-Eintrag (ausgeliefert) in OrderHistory jeder Auftragsposition der Rechnung. Dadurch wird die Sendung erneut exportiert bzw. gemeldet.
  • Zum Schluss wird das MQ-Event InvoiceChanged mit dem Rechnungsschlüssel und dem Parameter SetTrackingId publiziert.

Hinweise

  • Transaktion: Alle Änderungen laufen in einer Transaktion. Besteht beim Aufrufer bereits eine offene Transaktion, wird ein Savepoint verwendet. Validierungsfehler (400/411) ändern nichts; die Transaktion wird trotzdem committet und die Statuszeile geliefert.
  • Unerwartete SQL-Fehler: Die Transaktion wird zurückgerollt und der Fehler über log.InsertError protokolliert. In diesem Fall wird keine Statuszeile geliefert.
  • Status als Zeichenkette: Status ist eine Zeichenkette (200, 400, 411), kein HTTP-Status. Der SOAP-Aufruf selbst ist erfolgreich.
  • Duplikatprüfung: Die Prüfung, ob eine Tracking-ID bereits vorhanden ist, erfolgt per LIKE '%…%' als Teilstring-Vergleich. Eine neue ID, die Teil einer längeren bestehenden ID ist oder % / _ enthält, kann fälschlich als vorhanden gelten und wird dann nicht angehängt.
  • Meldungen: Sie nennen InvoiceKey, der Parameter heißt jedoch PackageId.
  • NOLOCK: Rechnungen und Pakete werden mit NOLOCK gelesen.
  • Trigger: Während des Rechnungs-Updates wird CONTEXT_INFO auf 0x11111 gesetzt, vermutlich damit Trigger dieses Update erkennen. Deren Verhalten ist hier nicht sichtbar.
  • Unbekannter API-Benutzer: Existiert kein Benutzer API in UCS_USERS, wird RecordModifiedByUserId auf NULL gesetzt.
  • MQ-Event: InvoiceChanged wird nur gesendet, wenn die Einstellung pixiMQ_Enabled aktiv ist und das Event in EventConfiguration konfiguriert und aktiviert ist. Zustellfehler landen in EventQueue und führen nicht zu einem Fehler dieses Aufrufs.

Parameter

Parameter Typ Standardwert Beschreibung
PackageId
int NULL

ID des Rechnungspakets (pixi.InvoicePackage.Id). Pflicht, wenn InvoiceNr fehlt. Ebenfalls Pflicht, wenn die Rechnung mehrere Pakete hat und Overwrite = 1 ist. 0 gilt als leer.

Beispiel: 15832

InvoiceNr
varchar(20)
string
NULL

Rechnungsnummer (Invoices.InvoiceNr). Pflicht, wenn PackageId fehlt. Werden beide übergeben, muss das Paket zu dieser Rechnung gehören.

Beispiel: RE2024001234

TrackingId
varchar(512)
string
NULL

Sendungs-Tracking-ID, optional mehrere IDs mit ; getrennt. Der Wert geht in Invoices.ShipmentTrackingID ein. Das Paket erhält das letzte Segment. Dieser Wert oder ReturnTrackingId muss gefüllt sein.

Beispiel: 00340434161094042557

ReturnTrackingId
varchar(512)
string
NULL

Retouren-Tracking-ID, optional mehrere IDs mit ; getrennt. Das letzte Segment wird in Invoices.retTrackID und im Paket gespeichert. Der vollständige Wert wird an retTrackIDhist angehängt.

Beispiel: 00340434161094042564

Overwrite
bit
boolean
0

Steuert, wie TrackingId in die Rechnung geschrieben wird. Auf die Retouren-Tracking-ID hat er keinen Einfluss.

Erlaubte Werte

  • 0 – `TrackingId` an die bestehende `ShipmentTrackingID` anhängen, falls noch nicht enthalten. Bei mehreren Paketen ohne `PackageId` wird nur die Rechnung aktualisiert.
  • 1 – `ShipmentTrackingID` neu aufbauen aus den Tracking-IDs der übrigen Pakete plus `TrackingId`. Bei mehreren Paketen ist `PackageId` Pflicht.

Beispiel: 0

ResetClientNotifiedFlag
bit
boolean
0

Bei 1 wird ClientNotified = 'N' bei den letzten AUS-Einträgen der Auftragshistorie der Auftragspositionen der Rechnung gesetzt, damit die Sendung erneut exportiert bzw. gemeldet wird.

Erlaubte Werte

  • 0 – Auftragshistorie nicht ändern.
  • 1 – Kunden-benachrichtigt-Kennzeichen der Ausgeliefert-Einträge zurücksetzen.

Beispiel: 1

Antwort

Result-Set 1 · Immer, außer bei einem unerwarteten SQL-Fehler

Statuszeile mit dem Ergebnis der Aktualisierung.

Spalte Typ Beschreibung
Status varchar(50)
string

200 bei Erfolg, 400 bei ungültigen oder fehlenden Parametern bzw. nicht gefundenen Datensätzen, 411 wenn die Grenze von 512 Zeichen überschritten würde.

Message varchar(2000)
string

Erfolgs- oder Fehlermeldung.

Fehlermeldungen

Status Meldung Ursache
400 InvoiceKey and InvoiceNr are empty, you have to specified at least one parameter. Weder `PackageId` noch `InvoiceNr` übergeben (oder `PackageId` ist 0). Mindestens einen der Werte übergeben.
400 TrackingId and ReturnTrackingId are empty, you have to specified at least one parameter. Weder `TrackingId` noch `ReturnTrackingId` übergeben. Mindestens einen der Werte übergeben.
400 All parameters are empty, please review and adapt parameters. `PackageId`, `InvoiceNr`, `TrackingId` und `ReturnTrackingId` sind alle leer.
400 Multiple packages found for this invoice. PackageId parameter is required to identify the specific package to update. Nur `InvoiceNr` mit `Overwrite = 1` übergeben, und die Rechnung hat mehrere Pakete. Zusätzlich `PackageId` übergeben oder `Overwrite = 0` verwenden; dann wird nur die Rechnung aktualisiert.
411 TrackingId or ReturnTrackingId are too long, field size max. of 512 characters was reached. Please review and adapt. Bestehende `ShipmentTrackingID` bzw. `retTrackIDhist` plus neuer Wert würde 512 Zeichen überschreiten. Kürzere Werte verwenden oder `Overwrite = 1`; Letzteres hilft nur bei `TrackingId`.
400 TrackingId or ReturnTrackingId could not be updated, please check if the InvoiceKey OR InvoiceNr is correct. Für `PackageId`/`InvoiceNr` wurde kein Paket gefunden. Dazu zählen eine unbekannte Rechnung und eine Rechnung ohne Pakete. Der Fehler tritt auch auf, wenn das angegebene Paket nicht zur angegebenen Rechnung gehört.

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:pixiUpdateInvoicePackageTrackingIds>
      <!-- <PackageId>15832</PackageId> -->
      <!-- <InvoiceNr>RE2024001234</InvoiceNr> -->
      <!-- <TrackingId>00340434161094042557</TrackingId> -->
      <!-- <ReturnTrackingId>00340434161094042564</ReturnTrackingId> -->
      <!-- <Overwrite>0</Overwrite> -->
      <!-- <ResetClientNotifiedFlag>1</ResetClientNotifiedFlag> -->
    </ns1:pixiUpdateInvoicePackageTrackingIds>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Verwendete Tabellen

Invoices · Schreiben InvoicePackage · Schreiben OrderHistory · Schreiben Invlines · Lesen
SQL-Objekt:
dbo.pipiUpdateInvoicePackageTrackingIds
Prozedur zuletzt geändert am 2026-10-05
Dokumentation von claude-opus-5-5 am 2026-10-30 geschrieben