pixiReportStockRange
Liefert einen seitenweise abrufbaren Reichweitenbericht je Artikel mit Bestand, Verkäufen im Zeitraum, Verkäufen pro Tag und der daraus berechneten Reichweite in Tagen.
Berechnet, wie viele Tage der aktuelle Bestand jedes Artikels auf Basis der bisherigen Verkäufe reicht, und liefert die Artikel, deren Reichweite mindestens MinStockRange Tage beträgt. Typischer Einsatz ist die Suche nach Ladenhütern oder Überbeständen.
Berechnung
- Für jeden Artikel mit mindestens einem Bestandsdatensatz (
InvBinItemverknüpft mitInvBin) wird ermittelt:Stock: Summe vonBinItemQtyüber alle Lagerplätze des Artikels.Sales: Summe vonItemQtyder Rechnungspositionen (Invlines) des Artikels, die in den letztenSalesDaysBackKalendertagen angelegt wurden. Standardmäßig zählen nur Positionen mit positiver Menge. MitDeductReturns= 1 werden alle Positionen gezählt, negative Positionen wie Gutschriften verringern also die Summe.LastStockInc: Anzahl Tage seit dem jüngstenUpdateDateder Bestandsdatensätze des Artikels.
SalesPerDay=Sales/SalesDaysBack.StockRange=Stock/SalesPerDayin Tagen. IstSales0 oder kleiner, wirdStockRangeauf9999gesetzt.
Filter (alle mit UND verknüpft)
SupplNr: nur Artikel dieses Lieferanten (items.SupplNR).PriceMin/PriceMax: Grenzen für den Verkaufspreis (items.Price).LastStockIncDays: nur Artikel, derenLastStockIncgrößer als dieser Wert ist.StockMin: nur Artikel mitStock>= diesem Wert (Standard 0, Artikel mit negativem Bestand fallen also heraus).MinStockRange: nur Artikel mitStockRange>= diesem Wert.ExcludeInhouseEAN= 1: Artikel, derenEANUPCmit2beginnt (interne EAN-Nummern), werden ausgeschlossen.
Sortierung und Paging
Die gefilterten Zeilen werden in Row nach StockRange absteigend, dann ItemName nummeriert. Zurückgegeben werden höchstens RowCount Zeilen mit Row > StartRow in derselben Reihenfolge. Für die nächste Seite wird die zuletzt erhaltene Row als StartRow übergeben.
Hinweise
- Alle Tabellen werden
WITH (NOLOCK)gelesen, die Werte können also nicht festgeschriebene Daten enthalten. - Die Berechnung läuft über alle Artikel mit Bestandsdatensätzen und nutzt je Artikel eine korrelierte Unterabfrage auf
Invlines. Jeder Aufruf (auch jede Seite) berechnet den vollständigen Bericht neu; bei großen Datenbanken kann das langsam sein. SalesDaysBack= 0 führt zu einem SQL-Fehler wegen Division durch null, der alsSqlMessagezurückkommt. BeiSalesDaysBack= NULL werden keine Verkäufe gezählt,SalesPerDayist NULL und jeder Artikel erhältStockRange9999.PriceMinundPriceMaxwerden mitNULLIF(…, '')normalisiert; die leere Zeichenkette wird in den Money-Wert 0 umgewandelt, daher bedeutet0kein Filter. Insbesondere schränktPriceMax= 0 das Ergebnis nicht ein.SupplNrals leere Zeichenkette wird wie NULL behandelt (kein Filter).StartRow,StockMinundMinStockRange= NULL werden als 0 behandelt.RowCountwird perSET ROWCOUNTangewendet;RowCount= 0 liefert alle passenden Zeilen.- Bei
ExcludeInhouseEAN= 1 werden auch Artikel ohneEANUPC(NULL) ausgeschlossen, da derNOT LIKE-Vergleich für NULL nicht wahr ist. - Trotz des Namens basiert
LastStockIncauf dem jüngstenUpdateDateder Bestandsdatensätze und nicht speziell auf dem letzten Bestandszugang.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
RowCount
|
int | 100 |
Maximale Anzahl zurückgegebener Zeilen (Seitengröße). 0 liefert alle Zeilen. Beispiel: |
StartRow
|
int | NULL |
Es werden nur Zeilen mit Beispiel: |
MinStockRange
|
int | 100 |
Mindestreichweite in Tagen; nur Artikel mit Beispiel: |
SalesDaysBack
|
int | 360 |
Länge des Verkaufszeitraums in Tagen, rückwärts ab jetzt gerechnet. Zugleich Divisor für Beispiel: |
LastStockIncDays
|
int | NULL |
Wenn gesetzt, nur Artikel, deren Bestandsdatensätze zuletzt vor mehr als dieser Anzahl Tage aktualisiert wurden ( Beispiel: |
StockMin
|
int | NULL |
Mindestgesamtbestand; nur Artikel mit Beispiel: |
PriceMin
|
money decimal |
NULL |
Mindestverkaufspreis des Artikels ( Beispiel: |
PriceMax
|
money decimal |
NULL |
Höchstverkaufspreis des Artikels ( Beispiel: |
SupplNr
|
varchar(4) string |
NULL |
Lieferantennummer; nur Artikel dieses Lieferanten ( Beispiel: |
ExcludeInhouseEAN
|
bit boolean |
0 |
Legt fest, ob Artikel mit internen EAN-Nummern (beginnend mit Erlaubte Werte
Beispiel: |
DeductReturns
|
bit boolean |
0 |
Legt fest, ob Rechnungspositionen mit negativer Menge (z. B. Gutschriften) von der Verkaufsmenge abgezogen werden. Erlaubte Werte
Beispiel: |
Antwort
Result-Set 1 · Immer (kann leer sein)
Eine Zeile je Artikel, der den Filtern entspricht, seitenweise begrenzt durch RowCount und StartRow, sortiert nach StockRange absteigend, dann ItemName.
| Spalte | Typ | Beschreibung |
|---|---|---|
Row
|
bigint long |
Zeilennummer im gefilterten und sortierten Ergebnis; dient dem Paging. |
ItemKey
|
int |
Interner Schlüssel des Artikels. |
ItemName
Kann leer sein |
varchar(120) string |
Artikelbezeichnung. |
Price
|
money decimal |
Verkaufspreis des Artikels. |
SupplPrice
|
money decimal |
Einkaufspreis beim Lieferanten. |
EANUPC
Kann leer sein |
varchar(13) string |
EAN/UPC des Artikels. |
ItemNrSuppl
Kann leer sein |
varchar(50) string |
Artikelnummer des Lieferanten. |
ItemNrInt
|
varchar(50) string |
Interne Artikelnummer. |
Stock
Kann leer sein |
int |
Gesamtbestand über alle Lagerplätze (Summe von |
Sales
|
int |
Berechnete Menge in den letzten |
SalesPerDay
Kann leer sein |
numeric(29,15) decimal |
Durchschnittliche Verkäufe pro Tag ( |
LastStockInc
Kann leer sein |
int |
Tage seit dem jüngsten |
StockRange
Kann leer sein |
numeric(38,11) decimal |
Reichweite in Tagen ( |
Beispielantwort
<SqlRowSet1>
<row>
<Row>1</Row>
<ItemKey>4711</ItemKey>
<ItemName>Winterjacke Herren XL</ItemName>
<Price>129.9000</Price>
<SupplPrice>54.0000</SupplPrice>
<EANUPC>4006381333931</EANUPC>
<ItemNrSuppl>WJ-XL-01</ItemNrSuppl>
<ItemNrInt>100245</ItemNrInt>
<Stock>35</Stock>
<Sales>0</Sales>
<SalesPerDay>0.000000000000000</SalesPerDay>
<LastStockInc>210</LastStockInc>
<StockRange>9999.00000000000</StockRange>
</row>
<row>
<Row>2</Row>
<ItemKey>5120</ItemKey>
<ItemName>Regenschirm schwarz</ItemName>
<Price>19.9000</Price>
<SupplPrice>6.5000</SupplPrice>
<EANUPC>4012345678901</EANUPC>
<ItemNrSuppl>RS-100</ItemNrSuppl>
<ItemNrInt>100388</ItemNrInt>
<Stock>120</Stock>
<Sales>36</Sales>
<SalesPerDay>0.100000000000000</SalesPerDay>
<LastStockInc>45</LastStockInc>
<StockRange>1200.00000000000</StockRange>
</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:pixiReportStockRange>
<!-- <RowCount>100</RowCount> -->
<!-- <StartRow>0</StartRow> -->
<!-- <MinStockRange>180</MinStockRange> -->
<!-- <SalesDaysBack>360</SalesDaysBack> -->
<!-- <LastStockIncDays>90</LastStockIncDays> -->
<!-- <StockMin>1</StockMin> -->
<!-- <PriceMin>10.00</PriceMin> -->
<!-- <PriceMax>500.00</PriceMax> -->
<!-- <SupplNr>L001</SupplNr> -->
<!-- <ExcludeInhouseEAN>1</ExcludeInhouseEAN> -->
<!-- <DeductReturns>0</DeductReturns> -->
</ns1:pixiReportStockRange>
</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:pixiReportStockRange>
<!-- <RowCount>100</RowCount> -->
<!-- <StartRow>0</StartRow> -->
<!-- <MinStockRange>180</MinStockRange> -->
<!-- <SalesDaysBack>360</SalesDaysBack> -->
<!-- <LastStockIncDays>90</LastStockIncDays> -->
<!-- <StockMin>1</StockMin> -->
<!-- <PriceMin>10.00</PriceMin> -->
<!-- <PriceMax>500.00</PriceMax> -->
<!-- <SupplNr>L001</SupplNr> -->
<!-- <ExcludeInhouseEAN>1</ExcludeInhouseEAN> -->
<!-- <DeductReturns>0</DeductReturns> -->
</ns1:pixiReportStockRange>
</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 = [
// 'RowCount' => '100',
// 'StartRow' => '0',
// 'MinStockRange' => '180',
// 'SalesDaysBack' => '360',
// 'LastStockIncDays' => '90',
// 'StockMin' => '1',
// 'PriceMin' => '10.00',
// 'PriceMax' => '500.00',
// 'SupplNr' => 'L001',
// 'ExcludeInhouseEAN' => '1',
// 'DeductReturns' => '0',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiReportStockRange', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiReportStockRange