pixiGetMinStockChanges
Liefert Artikel, deren aus den letzten Verkäufen errechneter empfohlener Mindestbestand bzw. Mindestbestellmenge um mindestens einen Anteil vom aktuellen Wert abweicht.
Berechnet pro Artikel Dispositionsempfehlungen für einen Lagerort und liefert nur Artikel mit einer deutlichen Abweichung. Das Ergebnis wird sortiert und seitenweise ausgegeben.
Normalisierung der Eingaben
0beiHistoryDays,SecurityDays,ShowChangesAbovePercentageundRowswird durch den Standardwert ersetzt.ConfigtypeKey=0und leere Zeichenketten bei den Text- und XML-Parametern gelten alsNULL.- Ist
Locationleer, wird der erste Lagerort mitShowLocation = 1verwendet. SortColumnundSortDirectionwerden in Kleinbuchstaben umgewandelt.
Verkaufsquelle (Pos / Shops)
- Nur
Shopsgesetzt: nur Verkäufe aus Auftragspositionen. - Nur
Posgesetzt: nur abgeschlossene POS-Belege. - Beide oder keiner gesetzt: Auftragspositionen plus POS-Verkäufe.
Der Inhalt von
Poswird nie ausgewertet.Shopswird zwar geparst, die Shopliste filtert die Daten aber nicht.
Artikelfilter Die Filter werden in dieser Reihenfolge angewendet und bilden eine Liste von Artikelschlüsseln:
Categories(/CATS/CAT/CatId, überTontrArtenaufitems.ConfigTypeabgebildet).Suppliers(/SUPPLIERS/SUP/SupplNr), Schnittmenge mit der bisherigen Liste.Tags(/TAGS/TAGmitTAGKEYundTAGTYPE):a= Artikel muss alle diese Tags haben,o= mindestens einen,n= Artikel darf den Tag nicht haben. Passende Artikel werden der Liste hinzugefügt.ConfigtypeKey(aktive Artikel mit diesemConfigType), Schnittmenge mit der Liste, falls diese nicht leer ist.SupplNR, Schnittmenge mit der Liste, falls diese nicht leer ist.
Anschließend werden deaktivierte Artikel entfernt. Ohne Filter werden alle aktiven Artikel ausgewertet.
Berechnung pro Artikel
MinStockQty/MinOrderQty: aktuelle Werte ausItemLocationSpecificfürLocation.Quantity: Summe vonLocationQuantityüber die Lagerorte inLocations(Standard: alle Lagerorte mitShowLocation = 1).DailyQty: verkaufte Menge der letztenHistoryDaysTage amLocation(Auftragspositionen mit StatusAUS, POS-Belege mit StatusCLO) geteilt durchHistoryDays.DailyQtyBefore: dasselbe für den gleich langen Vorzeitraum.Trendist+,-oder ein Leerzeichen.RecommendedMinStockQty= FLOOR(DailyQty× (Liefertage +SecurityDays)); ohne Liefertage beim Lieferanten werden 7 Tage angenommen.RecommendedMinOrderQty= FLOOR(DailyQty×DesiredStockTurnOver); ein Ergebnis von 1 wird zu 0. Negative Empfehlungen werden als 0 ausgegeben.ChangeMinStockQty/ChangeMinOrderQty: relative Änderung (Empfehlung − aktuell) / aktuell; ist der aktuelle Wert 0 und eine Empfehlung vorhanden, 1.StockTurnover= FLOOR(Quantity/DailyQty), 0 ohne Verkäufe.NumOfOrders: Anzahl unterschiedlicher Aufträge / POS-Belege im Zeitraum über dieLocations-Liste.
Auswahl, Sortierung und Paging
Nur Artikel mit ABS(ChangeMinStockQty) oder ABS(ChangeMinOrderQty) ≥ ShowChangesAbovePercentage bleiben übrig. Sie werden nach SortColumn / SortDirection und danach nach ItemName aufsteigend nummeriert (RowNr). Ausgegeben werden Zeilen mit RowNr > Start, RowNr ≤ Start + Rows und ItemKey > ItemKeyStart, zusammen mit TotalRows (alle passenden Artikel) und NrOfRecordsLeft (Zeilen nach Start mit ItemKey > ItemKeyStart).
Hinweise
- Nur lesend; alle permanenten Tabellen werden
WITH (NOLOCK)gelesen, daher können nicht festgeschriebene Daten erscheinen. Pro Artikel werden mehrere Aggregate überOrderlinesundPOSitem2/POSheader2berechnet; bei großen Datenbeständen kann der Aufruf langsam sein, Filter verwenden. - Fehler im Code: Im Standardmodus (Auftragspositionen plus POS) ist
ChangeMinOrderQtyimmerNULL, da der Code den Nur-POS-Fall doppelt prüft. Dann entscheidet nurChangeMinStockQty, ob ein Artikel geliefert wird. - Artikel ohne
ItemLocationSpecific-Zeile fürLocationoder ohne Zeile in derLocations-Liste werden nicht geliefert. - Der Vorzeitraum schließt den Tag genau
HistoryDaysTage zurück aus. Tagsfügt Artikel zur Liste hinzu, statt die Schnittmenge mitCategories/Supplierszu bilden. Ein Filter nur mitn-Tags liefert keine Artikel, sobald irgendein Artikel einen dieser Tags trägt.- Treffen
CategoriesoderSupplierskeinen Artikel und sind wederTags,ConfigtypeKeynochSupplNRangegeben, wird der Filter ignoriert und alle aktiven Artikel werden ausgewertet. SortColumnwird in Kleinbuchstaben umgewandelt und mit Namen in gemischter Schreibweise verglichen; die Sortierung funktioniert nur bei einer Datenbank-Collation ohne Unterscheidung der Groß-/Kleinschreibung. Unbekannte Werte sortieren nachItemName.DesiredStockTurnOver=0wird nicht durch den Standardwert ersetzt und führt zu empfohlenen Bestellmengen von 0.- Ungültiges XML in den XML-Parametern führt zu einem SQL-Fehler aus
sp_xml_preparedocument. - Zum Übernehmen einer Empfehlung dient
pixiSetItemBuyingInfo.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
HistoryDays
|
int | 180 |
Länge des Verkaufszeitraums in Tagen zur Berechnung der Tagesmenge. Der gleich lange Vorzeitraum wird für Beispiel: |
SecurityDays
|
int | 7 |
Sicherheitstage, die bei der Berechnung des empfohlenen Mindestbestands zu den Liefertagen des Lieferanten addiert werden. Beispiel: |
DesiredStockTurnOver
|
int | 30 |
Anzahl Verkaufstage, die eine Bestellung abdecken soll; Grundlage der empfohlenen Mindestbestellmenge. Beispiel: |
ShowChangesAbovePercentage
|
float decimal |
0.1 |
Minimale relative Änderung (z. B. Beispiel: |
SupplNR
|
varchar(4) string |
NULL |
Beschränkt das Ergebnis auf Artikel dieser Lieferantennummer. Beispiel: |
Rows
|
int | 100 |
Seitengröße: maximale Anzahl gelieferter Zeilen. Beispiel: |
ItemKeyStart
|
int | 0 |
Es werden nur Zeilen mit Beispiel: |
ConfigtypeKey
|
int | NULL |
Beschränkt das Ergebnis auf Artikel mit diesem Beispiel: |
Tags
|
varchar(max) xml |
NULL |
XML-Liste von Tag-Filtern Beispiel:
|
SortColumn
|
varchar(50) string |
itemname |
Spalte für Sortierung und Erlaubte Werte
Beispiel: |
SortDirection
|
varchar(1) string |
a |
Sortierrichtung. Groß-/Kleinschreibung wird ignoriert. Erlaubte Werte
Beispiel: |
Start
|
int | 0 |
Paging-Offset: Es werden Zeilen mit Beispiel: |
Suppliers
|
varchar(max) xml |
NULL |
XML-Liste von Lieferantennummern Beispiel:
|
Categories
|
varchar(max) xml |
NULL |
XML-Liste von Kategorieschlüsseln Beispiel:
|
Locations
|
varchar(max) xml |
NULL |
XML-Liste von Lagerort-IDs Beispiel:
|
Shops
|
varchar(max) xml |
NULL |
XML-Liste Beispiel:
|
Pos
|
varchar(max) string |
NULL |
Kennzeichen für POS-Verkäufe: Jeder nicht leere Wert gilt als gesetzt; der Inhalt wird nicht gelesen. Zusammen mit Beispiel: |
Location
|
varchar(max) string |
NULL |
Lagerort-ID für die aktuellen Mindestwerte und die Verkaufszahlen. Standard: erster Lagerort mit Beispiel: |
Antwort
Result-Set 1 · Immer (ggf. leer)
Eine Seite von Artikeln mit deutlicher Änderung von Mindestbestand oder Mindestbestellmenge, inklusive Paging-Summen.
| Spalte | Typ | Beschreibung |
|---|---|---|
ItemKey
|
int |
Artikelschlüssel |
EANUPC
Kann leer sein |
string |
EAN/UPC des Artikels |
ItemName
Kann leer sein |
string |
Artikelname |
DailyQty
Kann leer sein |
numeric decimal |
Durchschnittlich verkaufte Menge pro Tag im aktuellen Zeitraum |
DailyQtyBefore
Kann leer sein |
numeric decimal |
Durchschnittlich verkaufte Menge pro Tag im Vorzeitraum |
Trend
|
varchar(1) string |
|
MinStockQty
Kann leer sein |
int |
Aktueller Mindestbestand am |
RecommendedMinStockQty
Kann leer sein |
numeric decimal |
Empfohlener Mindestbestand (nicht negativ) |
MinOrderQty
Kann leer sein |
int |
Aktuelle Mindestbestellmenge am |
RecommendedMinOrderQty
Kann leer sein |
numeric decimal |
Empfohlene Mindestbestellmenge (nicht negativ; 1 wird zu 0) |
ChangeMinStockQty
Kann leer sein |
numeric decimal |
Relative Änderung zwischen empfohlenem und aktuellem Mindestbestand |
ChangeMinOrderQty
Kann leer sein |
numeric decimal |
Relative Änderung zwischen empfohlener und aktueller Mindestbestellmenge; im kombinierten Modus |
Quantity
Kann leer sein |
decimal |
Bestand summiert über die |
StockTurnover
Kann leer sein |
numeric decimal |
Reichweite des Bestands in Tagen ( |
SupplNr
Kann leer sein |
varchar(4) string |
Lieferantennummer des Artikels |
SupplName
Kann leer sein |
string |
Lieferantenname |
DefaultDeliveryDays
|
int |
Liefertage des Lieferanten, 7 falls nicht gesetzt |
NumOfOrders
Kann leer sein |
int |
Anzahl unterschiedlicher Aufträge / POS-Belege im aktuellen Zeitraum |
RowNr
|
bigint long |
Position im sortierten Ergebnis |
TotalRows
|
int |
Gesamtzahl passender Artikel |
NrOfRecordsLeft
|
int |
Anzahl passender Zeilen nach |
Beispielantwort
<SqlRowSet1>
<row>
<ItemKey>1052</ItemKey>
<EANUPC>4006381333931</EANUPC>
<ItemName>Kugelschreiber blau</ItemName>
<DailyQty>2.50000000000000</DailyQty>
<DailyQtyBefore>1.80000000000000</DailyQtyBefore>
<Trend>+</Trend>
<MinStockQty>20</MinStockQty>
<RecommendedMinStockQty>35</RecommendedMinStockQty>
<MinOrderQty>50</MinOrderQty>
<RecommendedMinOrderQty>75</RecommendedMinOrderQty>
<ChangeMinStockQty>0.750000000000</ChangeMinStockQty>
<Quantity>48</Quantity>
<StockTurnover>19</StockTurnover>
<SupplNr>LIE1</SupplNr>
<SupplName>Bürobedarf GmbH</SupplName>
<DefaultDeliveryDays>7</DefaultDeliveryDays>
<NumOfOrders>312</NumOfOrders>
<RowNr>1</RowNr>
<TotalRows>27</TotalRows>
<NrOfRecordsLeft>27</NrOfRecordsLeft>
</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:pixiGetMinStockChanges>
<!-- <HistoryDays>90</HistoryDays> -->
<!-- <SecurityDays>7</SecurityDays> -->
<!-- <DesiredStockTurnOver>30</DesiredStockTurnOver> -->
<!-- <ShowChangesAbovePercentage>0.2</ShowChangesAbovePercentage> -->
<!-- <SupplNR>LIE1</SupplNR> -->
<!-- <Rows>50</Rows> -->
<!-- <ItemKeyStart>0</ItemKeyStart> -->
<!-- <ConfigtypeKey>2</ConfigtypeKey> -->
<!-- <Tags><![CDATA[<TAGS><TAG><TAGKEY>12</TAGKEY><TAGTYPE>a</TAGTYPE></TAG><TAG><TAGKEY>15</TAGKEY><TAGTYPE>o</TAGTYPE></TAG><TAG><TAGKEY>20</TAGKEY><TAGTYPE>n</TAGTYPE></TAG></TAGS>]]></Tags> -->
<!-- <SortColumn>changeminstockqty</SortColumn> -->
<!-- <SortDirection>d</SortDirection> -->
<!-- <Start>0</Start> -->
<!-- <Suppliers><![CDATA[<SUPPLIERS><SUP><SupplNr>LIE1</SupplNr></SUP><SUP><SupplNr>LIE2</SupplNr></SUP></SUPPLIERS>]]></Suppliers> -->
<!-- <Categories><![CDATA[<CATS><CAT><CatId>3</CatId></CAT><CAT><CatId>5</CatId></CAT></CATS>]]></Categories> -->
<!-- <Locations><![CDATA[<LOCATIONS><LOC><LocationID>001</LocationID></LOC><LOC><LocationID>002</LocationID></LOC></LOCATIONS>]]></Locations> -->
<!-- <Shops><![CDATA[<SHOPS><SHOP><ShopID>WEB</ShopID></SHOP></SHOPS>]]></Shops> -->
<!-- <Pos>1</Pos> -->
<!-- <Location>001</Location> -->
</ns1:pixiGetMinStockChanges>
</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:pixiGetMinStockChanges>
<!-- <HistoryDays>90</HistoryDays> -->
<!-- <SecurityDays>7</SecurityDays> -->
<!-- <DesiredStockTurnOver>30</DesiredStockTurnOver> -->
<!-- <ShowChangesAbovePercentage>0.2</ShowChangesAbovePercentage> -->
<!-- <SupplNR>LIE1</SupplNR> -->
<!-- <Rows>50</Rows> -->
<!-- <ItemKeyStart>0</ItemKeyStart> -->
<!-- <ConfigtypeKey>2</ConfigtypeKey> -->
<!-- <Tags><![CDATA[<TAGS><TAG><TAGKEY>12</TAGKEY><TAGTYPE>a</TAGTYPE></TAG><TAG><TAGKEY>15</TAGKEY><TAGTYPE>o</TAGTYPE></TAG><TAG><TAGKEY>20</TAGKEY><TAGTYPE>n</TAGTYPE></TAG></TAGS>]]></Tags> -->
<!-- <SortColumn>changeminstockqty</SortColumn> -->
<!-- <SortDirection>d</SortDirection> -->
<!-- <Start>0</Start> -->
<!-- <Suppliers><![CDATA[<SUPPLIERS><SUP><SupplNr>LIE1</SupplNr></SUP><SUP><SupplNr>LIE2</SupplNr></SUP></SUPPLIERS>]]></Suppliers> -->
<!-- <Categories><![CDATA[<CATS><CAT><CatId>3</CatId></CAT><CAT><CatId>5</CatId></CAT></CATS>]]></Categories> -->
<!-- <Locations><![CDATA[<LOCATIONS><LOC><LocationID>001</LocationID></LOC><LOC><LocationID>002</LocationID></LOC></LOCATIONS>]]></Locations> -->
<!-- <Shops><![CDATA[<SHOPS><SHOP><ShopID>WEB</ShopID></SHOP></SHOPS>]]></Shops> -->
<!-- <Pos>1</Pos> -->
<!-- <Location>001</Location> -->
</ns1:pixiGetMinStockChanges>
</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 = [
// 'HistoryDays' => '90',
// 'SecurityDays' => '7',
// 'DesiredStockTurnOver' => '30',
// 'ShowChangesAbovePercentage' => '0.2',
// 'SupplNR' => 'LIE1',
// 'Rows' => '50',
// 'ItemKeyStart' => '0',
// 'ConfigtypeKey' => '2',
// 'Tags' => '<TAGS><TAG><TAGKEY>12</TAGKEY><TAGTYPE>a</TAGTYPE></TAG><TAG><TAGKEY>15</TAGKEY><TAGTYPE>o</TAGTYPE></TAG><TAG><TAGKEY>20</TAGKEY><TAGTYPE>n</TAGTYPE></TAG></TAGS>',
// 'SortColumn' => 'changeminstockqty',
// 'SortDirection' => 'd',
// 'Start' => '0',
// 'Suppliers' => '<SUPPLIERS><SUP><SupplNr>LIE1</SupplNr></SUP><SUP><SupplNr>LIE2</SupplNr></SUP></SUPPLIERS>',
// 'Categories' => '<CATS><CAT><CatId>3</CatId></CAT><CAT><CatId>5</CatId></CAT></CATS>',
// 'Locations' => '<LOCATIONS><LOC><LocationID>001</LocationID></LOC><LOC><LocationID>002</LocationID></LOC></LOCATIONS>',
// 'Shops' => '<SHOPS><SHOP><ShopID>WEB</ShopID></SHOP></SHOPS>',
// 'Pos' => '1',
// 'Location' => '001',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiGetMinStockChanges', $soapArguments);
Verwandte Calls
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiGetMinStockChanges