pixiReport_LogisticQuality
Liefert die Verteilung der Aufträge der letzten Tage nach Anzahl der Tage zwischen Auftragseingang und erster Lieferung als Logistik-Kennzahl.
Berechnet, wie viele Tage der Versand der Aufträge der letzten Tage gedauert hat, und gruppiert die Aufträge nach dieser Anzahl.
1. Auswahl der Aufträge
Ein Auftrag wird berücksichtigt, wenn:
- sein
Orderheader.CreateDatehöchstens@DaysBackTage zurückliegt; - er mindestens eine Auftragsposition im Status
ANGoderAUShat. Ist@ShopIDnicht leer, muss zusätzlich dieOrdShopIdder Position passen; - er keine Position im Status
ANG/AUShat (angelegt innerhalb von@DaysBackTagen, gleicher Shop-Filter), deren Artikel vor Anlage der Position keinen inInvBinItemLoggebuchten Bestand hatte; - der Kunde nicht gesperrt ist (
HSLocked = 'Y'inCustomersHist).
Als Bezugsdatum des Auftrags gilt das früheste StatusChangeDate eines ANG-Eintrags in Orderhistory zu seinen Positionen.
2. Bestandsprüfung
Die Prozedur sammelt alle Positionen der ausgewählten Aufträge. Ein Auftrag wird entfernt, wenn für einen seiner Artikel die summierte Menge aller gesammelten Positionen höher ist als der bis zum Bezugsdatum in InvBinItemLog gebuchte Bestand. Summiert werden nur Positionen, die bis zu diesem Datum angelegt und nicht vorher (oder noch gar nicht) versendet wurden.
3. Datumsanpassungen
- Wochenende (mit
DATEFIRST 1): Aufträge von Freitag nach 14:59 Uhr werden um 3 Tage verschoben. Samstagsaufträge werden um 2 Tage, Sonntagsaufträge um 1 Tag verschoben. Die Uhrzeit bleibt gleich. - Tage ohne Versand: Ein Tag gilt als Versandtag, wenn es an ihm innerhalb von
@DaysBackTagen mehr als 2 Rechnungen mittotal > 0gibt. Ein Auftrag, dessen ursprünglicher Eingangstag kein Versandtag ist, erhält ein neues Bezugsdatum: den frühesten Rechnungszeitpunkt des nächsten Versandtags. Dies ersetzt die Wochenendanpassung.
4. Berechnung
Je Auftrag ist DaysToShip die ganzzahlige Anzahl von 24-Stunden-Intervallen vom angepassten Bezugsdatum bis zum frühesten ShipDate seiner Positionen. Negative Werte werden auf 0 gesetzt.
Nicht versendete Aufträge werden ausgeschlossen, sowohl aus der Gruppierung als auch aus der Gesamtzahl AllPackages.
5. Ergebnis
Eine Zeile je DaysToShip-Wert mit:
- der Anzahl Aufträge;
- ihrem Anteil an
AllPackages; - der Gesamtzahl
AllPackages.
Zusätzlich wird immer eine feste Zeile mit DaysToShip = 99 und 0 Aufträgen angehängt. Die Zeilen sind aufsteigend nach DaysToShip sortiert.
Hinweise
- Die Parameter
@OnlyItemsOnStockund@MinutesSinceRefreshsind deklariert, werden im Code aber nicht verwendet. @ShopIDfiltert auf das PositionsfeldOrdShopId, nicht auf den Auftragskopf.- Laut Code-Kommentar gilt Freitag ab 14:00 Uhr. Der Code prüft
hour > 14, die Wochenendverschiebung beginnt also erst ab 15:00 Uhr. - Der Kommentar bezeichnet die ermittelten Tage als „Feiertage“ (Tage ohne Versand). Tatsächlich enthält die Tabelle Tage mit mehr als 2 Rechnungen. Aufträge von allen anderen Tagen werden auf den ersten Rechnungszeitpunkt des nächsten solchen Tags verschoben. Gibt es keinen späteren Versandtag, wird das Bezugsdatum NULL und der Auftrag zählt als nicht versendet.
- Enthält
CustomersHist.HCustRefNULL-Werte, schließt derNOT IN-Filter alle Aufträge aus. - Die Zeile mit
DaysToShip = 99ist eine feste Markierungszeile mitNRofORders = 0undPercentage = 0. Sie wird immer geliefert, auch wenn kein Auftrag die Bedingungen erfüllt. Percentageist ein Anteil zwischen 0 und 1, kein Prozentwert.- Die meisten Lesezugriffe nutzen
NOLOCK, die Zahlen können daher nicht festgeschriebene Daten enthalten. Der erste Zugriff aufOrderheadererfolgt ohneNOLOCK. - Die Prozedur verwendet viele korrelierte Unterabfragen auf
Orderhistory,OrderlinesundInvBinItemLog. Große Werte für@DaysBackkönnen langsam sein. - Die Prozedur schreibt nur in temporäre Tabellen.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
DaysBack
|
int | 14 |
Anzahl Tage ab heute rückwärts. Ältere Aufträge, Auftragspositionen und Rechnungen werden nicht berücksichtigt. Beispiel: |
OnlyItemsOnStock
|
bit boolean |
1 |
Deklariert, aber im Code nicht verwendet. Die Bestandsprüfungen werden immer angewendet. Beispiel: |
ShopID
|
varchar(3) string |
– |
Shop-Filter auf Beispiel: |
MinutesSinceRefresh
|
int | NULL |
Deklariert, aber im Code nicht verwendet. |
Antwort
Result-Set 1 · Immer
Verteilung der versendeten Aufträge nach Versandtagen. Eine feste Markierungszeile mit DaysToShip = 99 ist immer enthalten. Aufsteigend nach DaysToShip sortiert.
| Spalte | Typ | Beschreibung |
|---|---|---|
DaysToShip
Kann leer sein |
int |
Ganze Tage (24-Stunden-Intervalle) vom angepassten Auftragseingang bis zur ersten Lieferung.
The NULL case is theoretically possible via the 999 fallback but rows with NULL are filtered out. Hinweis: NULL-Werte werden ausgefiltert. |
NRofORders
|
int |
Anzahl Aufträge, die nach dieser Anzahl Tage versendet wurden. In der Markierungszeile immer 0. |
Percentage
|
float decimal |
Anteil an |
AllPackages
Kann leer sein |
float decimal |
Gesamtzahl der ausgewerteten, versendeten Aufträge. |
Beispielantwort
<SqlRowSet1>
<row>
<DaysToShip>0</DaysToShip>
<NRofORders>132</NRofORders>
<Percentage>0.825</Percentage>
<AllPackages>160</AllPackages>
</row>
<row>
<DaysToShip>1</DaysToShip>
<NRofORders>28</NRofORders>
<Percentage>0.175</Percentage>
<AllPackages>160</AllPackages>
</row>
<row>
<DaysToShip>99</DaysToShip>
<NRofORders>0</NRofORders>
<Percentage>0</Percentage>
<AllPackages>160</AllPackages>
</row>
</SqlRowSet1>
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:pixiReport_LogisticQuality>
<!-- <DaysBack>14</DaysBack> -->
<!-- <OnlyItemsOnStock>1</OnlyItemsOnStock> -->
<!-- <ShopID>SH1</ShopID> -->
<!-- <MinutesSinceRefresh>?</MinutesSinceRefresh> -->
</ns1:pixiReport_LogisticQuality>
</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:pixiReport_LogisticQuality>
<!-- <DaysBack>14</DaysBack> -->
<!-- <OnlyItemsOnStock>1</OnlyItemsOnStock> -->
<!-- <ShopID>SH1</ShopID> -->
<!-- <MinutesSinceRefresh>?</MinutesSinceRefresh> -->
</ns1:pixiReport_LogisticQuality>
</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 = [
// 'DaysBack' => '14',
// 'OnlyItemsOnStock' => '1',
// 'ShopID' => 'SH1',
// 'MinutesSinceRefresh' => '?',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiReport_LogisticQuality', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiReport_LogisticQuality