Inventory Visibility öffentliche APIs
Hinweis
Azure Active Directory ist jetzt Microsoft Entra ID. Mehr erfahren
Dieser Artikel beschreibt die öffentlichen APIs, die von Inventory Visibility bereitgestellt werden.
Die öffentliche REST-API des Bestandssichtbarkeit-Add-Ins stellt mehrere spezifische Endpunkte für die Integration bereit. Es werden vier Hauptinteraktionstypen unterstützt:
- Verbuchung von Änderungen des Lagerbestands aus einem externen System in das Add-In
- Festlegen oder Außerkraftsetzen von Lagerbestandsmengen im Add-In von einem externen System
- Buchen von Reservierungsereignissen an das Add-In von einem externen System
- Abfrage aktueller Lagerbestände von einem externen System
In der folgenden Tabelle sind die derzeit verfügbaren APIs aufgeführt:
Pfad | Methode | Beschreibung |
---|---|---|
/api/environment/{environmentId}/onhand |
Posten | Ein Ereignis zur Änderung des Lagerbestands erstellen |
/api/environment/{environmentId}/onhand/bulk |
Posten | Mehrere Änderungsereignisse erstellen |
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk |
Posten | Festlegen/Überschreiben von Lagerbeständen |
/api/environment/{environmentId}/onhand/reserve |
Posten | Ein Ereignis für eine Soft-Reservierung erstellen |
/api/environment/{environmentId}/onhand/reserve/bulk |
Posten | Mehrere Soft-Reservierungsereignisse erstellen |
/api/environment/{environmentId}/onhand/unreserve |
Posten | Ein Soft-Reservierungsereignis umkehren |
/api/environment/{environmentId}/onhand/unreserve/bulk |
Posten | Mehrere Soft-Reservierungsereignisse umkehren |
/api/environment/{environmentId}/onhand/reserve/resyncjob |
Posten | Reservierungsdaten bereinigen |
/api/environment/{environmentId}/onhand/changeschedule |
Posten | Eine geplante Änderung des Lagerbestands erstellen |
/api/environment/{environmentId}/onhand/changeschedule/bulk |
Posten | Erstellen Sie mehrere Lagerbestandsänderungen mit Daten |
/api/environment/{environmentId}/onhand/indexquery |
Posten | Abfrage durch Verwendung der Methode POST (empfohlen) |
/api/environment/{environmentId}/onhand |
Abrufen | Abfrage mit Hilfe der get-Methode |
/api/environment/{environmentId}/onhand/exactquery |
Posten | Exakte Abfrage durch Verwendung der Methode POST |
/api/environment/{environmentId}/allocation/allocate |
Posten | Ein Zuweisungsereignis erstellen |
/api/environment/{environmentId}/allocation/unallocate |
Posten | Ein Ereignis zum Aufheben einer Zuweisung erstellen |
/api/environment/{environmentId}/allocation/reallocate |
Posten | Ein Neuzuweisungsereignis erstellen |
/api/environment/{environmentId}/allocation/consume |
Posten | Ein Verbrauchsereignis erstellen |
/api/environment/{environmentId}/allocation/query |
Posten | Zuordnungsergebnis abfragen |
/api/environment/{environmentId}/onhand/productsearch/indexquery |
Posten | Indexabfrage mit Produktsuche veröffentlichen |
/api/environment/{environmentId}/onhand/productsearch/exactquery |
Posten | Genaue Abfrage mit Produktsuche veröffentlichen |
Hinweis
Der Teil {environmentId} des Pfades ist die Umgebungs-ID in Microsoft Dynamics Lifecycle Services.
Die Bulk-API kann maximal 512 Datensätze für jede Anfrage zurückgeben.
Authentifizierung
Das Sicherheits-Token der Plattform wird für den Aufruf der öffentlichen API von Inventory Visibility verwendet. Daher müssen Sie ein Microsoft Entra-Token generieren, indem Sie Ihre Microsoft Entra-Anwendung verwenden. Sie müssen dann das Microsoft Entra-Token verwenden, um das Zugriffstoken vom Sicherheitsdienst zu erhalten.
Gehen Sie folgendermaßen vor, um ein Sicherheitsdienst-Token zu erhalten.
Melden Sie sich am Azure-Portal an und suchen Sie dort die
clientId
- undclientSecret
-Werte für Ihre Dynamics 365 Supply Chain Management-App.Holen Sie einen Microsoft Entra-Token (
aadToken
), indem Sie eine HTTP-Anforderung senden, die die folgenden Eigenschaften hat:URL:
https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/token
Methode:
GET
Body-Inhalt (Formulardaten):
Schlüssel Wert client_id ${aadAppId} client_secret ${aadAppSecret} grant_type client_credentials Bereich 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.default
Sie sollten als Antwort ein Microsoft Entra-Token (
aadToken
) erhalten. Es sollte dem folgenden Beispiel ähneln.{ "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "access_token": "eyJ0eX...8WQ" }
Formulieren Sie eine Anfrage in JavaScript Object Notation (JSON), die dem folgenden Beispiel ähnelt.
{ "grant_type": "client_credentials", "client_assertion_type": "aad_app", "client_assertion": "{Your_Microsoft EntraToken}", "scope": "https://inventoryservice.operations365.dynamics.com/.default", "context": "{$LCS_environment_id}", "context_type": "finops-env" }
Beachten Sie die folgenden Punkte:
- Der
client_assertion
-Wert muss das Microsoft Entra-Token (aadToken
) sein, das Sie im vorherigen Schritt erhalten haben. - Der Wert von
context
muss die Lifecycle Services Umgebungs-ID sein, unter der Sie das Add-In bereitstellen möchten. - Legen Sie alle anderen Werte fest, wie im Beispiel gezeigt.
- Der
Rufen Sie einen Zugriffstoken (
access_token
) ab, indem Sie eine HTTP-Anforderung mit den folgenden Eigenschaften senden:-
URL:
https://securityservice.operations365.dynamics.com/token
-
Methode:
POST
-
HTTP-Header: Geben Sie die API-Version an. (Der Schlüssel ist
Api-Version
, und der Wert ist1.0
.) - Body-Inhalt: Fügen Sie die JSON-Anfrage ein, die Sie im vorherigen Schritt erstellt haben.
Sie sollten als Antwort ein Zugriffs-Token (
access_token
) erhalten. Sie müssen dieses Token als Träger-Token verwenden, um die Inventory Visibility API aufzurufen. Hier ist ein Beispiel.{ "access_token": "{Returned_Token}", "token_type": "bearer", "expires_in": 3600 }
-
URL:
Schein
Die URL https://securityservice.operations365.dynamics.com/token
ist eine allgemeine URL für den Sicherheitsdienst. Wenn Sie die URL aufrufen, ist die erste Antwort eine HTTP-Umeiltungsantwort mit dem Statuscode 307
in den Antwortheadern und einem Eintrag mit dem Schlüssel „Standort“, der die Ziel-URL für den Sicherheitsdienst enthält. Die URL hat dieses Format: https://gw.{$geo}-il101.gateway.prod.island.powerapps.com/securityservice/token
. Beispiel: wenn sich Ihre Umgebung im geografischen US-Raum befindet, könnte die URL https://gw.us-il101.gateway.prod.island.powerapps.com/securityservice/token
sein. Wenn der 307-Antwortstatuscode nicht für Sie gilt, können Sie die tatsächliche URL gemäß des Standorts Ihrer FinOps-Umgebung konstruieren. Am einfachsten ist es, https://gw.as-il101.gateway.prod.island.powerapps.com/securityservice/token
mit Ihrem Webbrowser zu öffnen und die Adresse in die Adressleiste zu kopieren.
Erstellen von Ereignissen bei Lagerbestandsänderungen
Es gibt zwei APIs zum Erstellen von Ereignissen zur Änderung des Lagerbestands:
- Erzeugen eines Datensatzes:
/api/environment/{environmentId}/onhand
- Mehrere Datensätze erstellen:
/api/environment/{environmentId}/onhand/bulk
Die folgende Tabelle fasst die Bedeutung der einzelnen Felder im JSON-Körper zusammen.
Feldkennung | Description |
---|---|
id |
Eine eindeutige ID für das spezifische Änderungsereignis. Bei einer erneuten Übermittlung aufgrund eines Systemfehlers wird diese ID verwendet, um sicherzustellen, dass dasselbe Ereignis im System nicht doppelt gezählt wird. |
organizationId |
Die Kennung der Organisation, die mit dem Ereignis verknüpft ist. Dieser Wert wird einer Organisations- oder Datenbereichskennung im Supply Chain Management zugeordnet. |
productId |
Die Kennung des Produkts. |
quantities |
Die Menge, um die der Lagerbestand geändert werden muss. Wenn z.B. 10 neue Bücher zu einem Regal hinzugefügt werden, ist dieser Wert quantities:{ shelf:{ received: 10 }} . Wenn drei Bücher aus dem Regal entfernt oder verkauft werden, ist dieser Wert quantities:{ shelf:{ sold: 3 }} . |
dimensionDataSource |
Die Datenquelle der Dimensionen, die im Buchungsänderungsereignis und in der Abfrage verwendet werden. Wenn Sie die Datenquelle angeben, können Sie die benutzerdefinierten Dimensionen aus der angegebenen Datenquelle verwenden. Inventory Visibility kann die Dimensionskonfiguration verwenden, um die angepassten Dimensionen den allgemeinen Standarddimensionen zuzuordnen. Wenn kein dimensionDataSource -Wert angegeben wird, können Sie nur die allgemeinen Basisdimensionen in Ihren Abfragen verwenden. |
dimensions |
Ein dynamisches Schlüssel-Werte-Paar. Die Werte werden einigen der Dimensionen im Supply Chain Management zugeordnet. Sie können jedoch auch angepasste Dimensionen hinzufügen (z. B. Quelle), um anzugeben, ob das Ereignis aus dem Supply Chain Management oder einem externen System stammt. |
Hinweis
Wenn Ihre Datenpartitionsregel auf Nach Produkt-ID eingestellt ist, sind siteId
und locationId
optionale Dimensionen. Andernfalls handelt es sich um erforderliche Abmessungen. Diese Regel gilt auch für die APIs für Zuweisung, unverbindliche Reservierung und Änderungszeitplan.
Die folgenden Unterabschnitte enthalten Beispiele, die zeigen, wie diese APIs verwendet werden.
Ein Ereignis zur Änderung des Lagerbestands erstellen
Diese API erstellt ein einzelnes Ereignis zur Änderung des Lagerbestands.
Path:
/api/environment/{environmentId}/onhand
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
id: string,
organizationId: string,
productId: string,
dimensionDataSource: string, # Optional
dimensions: {
[key:string]: string,
},
quantities: {
[dataSourceName:string]: {
[key:string]: number,
},
},
}
Das folgende Beispiel zeigt einen Beispielkörperinhalt. In diesem Beispiel verfügt das Unternehmen über ein Point-of-Sale-System (POS), das Transaktionen im Geschäft und damit Bestandsänderungen verarbeitet. Der Kunde hat ein rotes T-Shirt in Ihrem Geschäft zurückgegeben. Um die Änderung widerzuspiegeln, buchen Sie ein einziges Änderungsereignis für das Produkt T-Shirt. Dieses Ereignis erhöht die Menge des Produkts T-Shirt um 1.
{
"id": "Test201",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"siteId": "1",
"locationId": "11",
"posMachineId": "0001",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Das folgende Beispiel zeigt einen Beispielkörperinhalt ohne dimensionDataSource
. In diesem Fall sind dimensions
die Basisdimensionen. Wenn dimensionDataSource
festgelegt ist, können dimensions
entweder die Datenquellendimensionen oder die Basisdimensionen sein.
{
"id": "Test202",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Mehrere Änderungsereignisse erstellen
Diese API kann Änderungsereignisse erstellen, genau wie die Single-Event-API kann. Der einzige Unterschied besteht darin, dass diese API mehrere Datensätze gleichzeitig erstellen kann. Deshalb, unterscheiden sich die Path
und Body
Werte. Bei dieser API liefert Body
ein Array von Datensätzen. Die maximale Anzahl an Datensätzen ist 512. Daher kann die Bulk-API für Lagerbestandsänderungen bis zu 512 Änderungsereignisse gleichzeitig unterstützen.
Ein POS-Gerät in einem Einzelhandelsgeschäft verarbeitete beispielsweise die folgenden zwei Transaktionen:
- Eine Rücksendung von einem roten T-Shirt
- Eine Verkaufstransaktion von drei schwarzen T-Shirts
In diesem Fall können Sie beide Bestandsaktualisierungen in einen API-Aufruf einbeziehen.
Path:
/api/environment/{environmentId}/onhand/bulk
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
{
id: string,
organizationId: string,
productId: string,
dimensionDataSource: string, # Optional
dimensions: {
[key:string]: string,
},
quantities: {
[dataSourceName:string]: {
[key:string]: number,
},
},
},
...
]
Das folgende Beispiel zeigt einen Beispielkörperinhalt.
[
{
"id": "Test203",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "Site1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": { "inbound": 1 }
}
},
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "black"
},
"quantities": {
"pos": { "outbound": 3 }
}
}
]
Lagerbestände festlegen/überschreiben
Die Setzen von Lagerbeständen API setzt die aktuellen Daten für das angegebene Produkt außer Kraft. Diese Funktion wird normalerweise verwendet, um Bestandszählungsaktualisierungen durchzuführen. Beispielsweise könnte ein Geschäft während seiner täglichen Bestandszählung feststellen, dass der tatsächliche Lagerbestand für ein rotes T-Shirt 100 beträgt. Daher muss die POS-Eingangsmenge unabhängig von der vorherigen Menge auf 100 aktualisiert werden. Sie können diese API verwenden, um den vorhandenen Wert zu überschreiben.
Path:
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
{
id: string,
organizationId: string,
productId: string,
dimensionDataSource: string, # Optional
dimensions: {
[key:string]: string,
},
quantities: {
[dataSourceName:string]: {
[key:string]: number,
},
},
modifiedDateTimeUTC: datetime,
},
...
]
Das folgende Beispiel zeigt einen Beispielkörperinhalt. Das Verhalten dieser API unterscheidet sich vom Verhalten der APIs, die im Abschnitt Erstellen von Ereignissen zur Änderung des Lagerbestands weiter oben in diesem Artikel beschrieben sind. In diesem Beispiel wird die Menge des Produkts T-Shirt auf 1 festgelegt.
[
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 100
}
}
}
]
Erstellen von Reservierungsereignissen
Um die Reserve-API zu verwenden, müssen Sie die Funktion „Reservierung“ öffnen und die Konfiguration der Reservierung abschließen. Weitere Informationen (einschließlich eines Dataflows und eines Beispielszenarios) finden Sie unter Bestandsanzeige-Reservierungen.
Erstellen Sie ein Ereignis für die Reservierung
Eine Reservierung kann für verschiedene Datenquelleneinstellungen vorgenommen werden. Um diese Art der Reservierung zu konfigurieren, geben Sie zuerst die Datenquelle im dimensionDataSource
-Parameter an. Geben Sie dann im dimensions
-Parameter die Dimensionen gemäß den Dimensionseinstellungen in der Zieldatenquelle an.
Wenn Sie die Reservierungs-API aufrufen, können Sie die Reservierungsvalidierung steuern, indem Sie den booleschen ifCheckAvailForReserv
-Parameter im Anforderungstext angeben. Der Wert True
bedeutet, dass die Validierung erforderlich ist, während der Wert False
bedeutet, dass die Validierung nicht erforderlich ist. Der Standardwert ist True
.
Wenn Sie eine Reservierung umkehren oder die Reservierung bestimmter Bestandsmengen aufheben möchten, setzen Sie die Menge auf einen negativen Wert und legen Sie den ifCheckAvailForReserv
-Parameter auf False
fest, um die Validierung zu überprüfen. Es gibt auch eine dedizierte API zum Aufheben der Reservierung, um dasselbe zu tun. Der Unterschied besteht nur in der Art und Weise, wie die beiden APIs aufgerufen werden. Es ist einfacher, ein bestimmtes Reservierungsereignis mithilfe der reservationId
mit der Reservierung aufheben API umzukehren. Weitere Informationen finden Sie im Abschnitt Ein Reservierungsereignis aufheben.
Path:
/api/environment/{environmentId}/onhand/reserve
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
id: string,
organizationId: string,
productId: string,
dimensionDataSource: string,
dimensions: {
[key:string]: string,
},
quantityDataSource: string, # optional
quantities: {
[dataSourceName:string]: {
[key:string]: number,
},
},
modifier: string,
quantity: number,
ifCheckAvailForReserv: boolean,
}
Das folgende Beispiel zeigt einen Beispielkörperinhalt.
{
"id": "reserve-0",
"organizationId": "SCM_IV",
"productId": "iv_contoso_product",
"quantity": 1,
"quantityDataSource": "iv",
"modifier": "softReservOrdered",
"ifCheckAvailForReserv": true,
"dimensions": {
"siteId": "iv_contoso_site",
"locationId": "iv_contoso_location",
"colorId": "red",
"sizeId": "small"
}
}
Das folgende Beispiel zeigt eine erfolgreiche Antwort.
{
"reservationId": "RESERVATION_ID",
"id": "ohre~id-822-232959-524",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Erstellen Sie mehrere Reservierungsereignisse
Diese API ist eine Massenversion der Einzelereignis-API.
Path:
/api/environment/{environmentId}/onhand/reserve/bulk
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
{
id: string,
organizationId: string,
productId: string,
dimensionDataSource: string,
dimensions: {
[key:string]: string,
},
quantityDataSource: string, # optional
quantities: {
[dataSourceName:string]: {
[key:string]: number,
},
},
modifier: string,
quantity: number,
ifCheckAvailForReserv: boolean,
},
...
]
Reservierungsereignisse umkehren
Die Reservierung aufheben API dient als Umkehrvorgang für Reservierungsereignisse. Sie bietet eine Möglichkeit, ein durch reservationId
spezifiziertes Reservierungsereignis umzukehren oder die Reservierungsmenge zu verringern.
Ein Reservierungsereignis umkehren
Wenn eine Reservierung erstellt wird, wird in den Antworttext eine reservationId
aufgenommen. Sie müssen dieselbe reservationId
bereitstellen, um die Reservierung zu stornieren, und dieselbe organizationId
, productId
und dimensions
einfügen, die für den Aufruf der Reservierungs-API verwendet wird. Geben Sie abschließend einen Wert für OffsetQty
an, der die Anzahl der Artikel darstellt, die aus der vorherigen Reservierung freigegeben werden sollen. Je nach der angegebenen OffsetQty
, kann eine Reservierung vollständig oder teilweise umgekehrt werden. Wenn zum Beispiel 100 Einheiten von Artikeln reserviert wurden, können Sie OffsetQty: 10
auf 10 der ursprünglich reservierten Menge festlegen.
Path:
/api/environment/{environmentId}/onhand/unreserve
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
id: string,
organizationId: string,
productId: string,
reservationId: string,
dimensions: {
[key:string]: string,
},
OffsetQty: number
}
Der folgende Code zeigt einen Beispiel für einen Antwortinhalt.
{
"id": "unreserve-0",
"organizationId": "SCM_IV",
"productId": "iv_contoso_product",
"reservationId": "RESERVATION_ID",
"dimensions": {
"siteid":"iv_contoso_site",
"locationid":"iv_contoso_location",
"ColorId": "red",
"SizeId": "small"
},
"OffsetQty": 1
}
Der folgende Code zeigt einen Beispiel für einen erfolgreichen Antworttext.
{
"reservationId": "RESERVATION_ID",
"totalInvalidOffsetQtyByReservId": 0,
"id": "ohoe~id-823-11744-883",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Notiz
Wenn im Antworttext OffsetQty
kleiner oder gleich der Reservierungsmenge ist, ist der processingStatus
auf Erfolg und die totalInvalidOffsetQtyByReservId
auf 0 gestellt.
Wenn die OffsetQty
größer als die reservierte Menge ist, lautet der processingStatus
partialSuccess und totalInvalidOffsetQtyByReservId
zeigt die Differenz zwischen OffsetQty
und der reservierten Menge an.
Wenn die Reservierung beispielsweise eine Menge von 10 und OffsetQty
einen Wert von 12 hat, ist totalInvalidOffsetQtyByReservId
2.
Mehrere Reservierungsereignisse umkehren
Diese API ist eine Massenversion der Einzelereignis-API.
Path:
/api/environment/{environmentId}/onhand/unreserve/bulk
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
{
id: string,
organizationId: string,
productId: string,
reservationId: string,
dimensions: {
[key:string]: string,
},
OffsetQty: number
}
...
]
Reservierungsdaten bereinigen
Die API Reservierungsdaten bereinigen wird zum Bereinigen historischer Reservierungsdaten verwendet. Der Hauptteil sollte eine Liste von Datenquellen sein. Wenn die Liste leer ist, werden alle Datenquellen bereinigt.
Path:
/api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
"iv",
"pos"
]
Lagerbestand abfragen
Verwenden Sie die Abfrage des Lagerbestands API, um aktuelle Daten zum Lagerbestand Ihrer Produkte abzurufen. Sie können diese API immer dann verwenden, wenn Sie den Lagerbestand kennen müssen, z. B. wenn Sie die Produktlagerbestände auf Ihrer E-Commerce-Website überprüfen möchten oder wenn Sie die Produktverfügbarkeit in verschiedenen Regionen oder in nahe gelegenen Geschäften und Lagern überprüfen möchten. Die API unterstützt derzeit die Abfrage von bis zu 5000 einzelnen Elementen nach dem productID
-Wert. In jeder Abfrage können auch mehrere siteID
- und locationID
-Werte angegeben werden. Wenn Ihre Datenpartitionsregel auf Nach Standort eingestellt ist, wird die Höchstgrenze durch die folgende Gleichung definiert:
Anzahl(SiteID) × Anzahl(LocationID) <= 10.000.
Abfrage mit Hilfe der POST-Methode
Die Query-by-Post-API ist in zwei Versionen verfügbar. In der folgenden Tabelle sind die Unterschiede aufgeführt.
API-Version 1.0 | API-Version 2.0 |
---|---|
Kann nur eine Organisations-ID abfragen. | Kann mehrere Organisations-IDs abfragen. |
Bis zu 10.000 Standort- und Lagerkombinationen können abgefragt werden. | Kann mehr als 10.000 Kombinationen aus Organisations-IDs, Standorten und Lagern abfragen. Kann Ergebnisse auf mehreren Seiten zurückgeben. |
Die folgenden Unterabschnitte zeigen, wie jede API-Version verwendet wird.
Abfrage per Post-API Version 1.0
Path:
/api/environment/{environmentId}/onhand/indexquery
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
dimensionDataSource: string, # Optional
filters: {
organizationId: string[],
productId: string[],
siteId: string[],
locationId: string[],
[dimensionKey:string]: string[],
},
groupByValues: string[],
returnNegative: boolean,
}
Im Body-Teil dieser Anfrage ist dimensionDataSource
ein optionaler Parameter. Wenn er nicht festgelegt ist, wird filters
als Basisdimensionen behandelt.
Der returnNegative
-Parameter steuert, ob die Ergebnisse negative Einträge enthalten.
Abfragen von nach Standort gespeicherten Daten
Dieser Abschnitt gilt, wenn Ihre Datenpartitionsregel auf Nach Standort eingestellt ist.
-
organizationId
sollte ein Array sein, das genau einen Wert enthält. -
productId
kann einen oder mehrere Werte enthalten. Wenn es sich um ein leeres Array handelt, gibt das System alle Produkte für die spezifischen Websites und Standorte zurück. In diesem Fall solltensiteId
undlocationId
nicht leer sein. -
siteId
undlocationId
werden zur Partitionierung verwendet. Sie in einer Lagerbestand abfragen-Anforderung mehr als einen Wert fürsiteId
undlocationId
angeben. Wenn beide Arrays leer sind, gibt das System alle Websites und Standorte für die spezifischen Produkte zurück. In diesem Fall sollteproductId
nicht leer sein.
Wir empfehlen, den Parameter groupByValues
so zu verwenden, dass er mit Ihrer Indexkonfiguration übereinstimmt. Weitere Informationen finden Sie unter Indexkonfiguration des verfügbaren Lagerbestands.
Nach Produkt-ID gespeicherte Daten abfragen
Dieser Abschnitt gilt, wenn Ihre Datenpartitionsregel auf Nach Produkt-ID eingestellt ist. In diesem Fall sind zwei filters
-Felder erforderlich: organizationId
, productId
.
-
organizationId
sollte ein Array sein, das genau einen Wert enthält. -
productId
sollte ein Array sein mit mindestens einem Wert.
Wenn Sie, anders als beim Speichern der Daten nach Standort, für siteId
und locationId
keine Werte angeben, werden die Bestandsinformationen für jede Produkt-ID über alle Sites und/oder Standorte hinweg aggregiert.
Hinweis
Wenn Sie die Funktionen Lagerbestand und ATP (Available-to-Promise) aktiviert haben, kann Ihre Abfrage auch den booleschen Parameter QueryATP
enthalten, der steuert, ob die Abfrageergebnisse ATP-Informationen enthalten. Weitere Informationen und Beispiele finden Sie unter Inventory Visibility Lagerbestands-Änderungstermine und verfügbares Versprechen.
Das folgende Beispiel zeigt einen Beispielkörperinhalt. Es zeigt, dass Sie den verfügbaren Bestand von mehreren Standorten (Lagern) aus abfragen können.
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["usmf"],
"productId": ["T-shirt"],
"siteId": ["1"],
"locationId": ["11","12","13"],
"colorId": ["red"]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Das folgende Beispiel zeigt, wie Sie alle Produkte an einem bestimmten Standort und Lagerplatz abfragen.
{
"filters": {
"organizationId": ["usmf"],
"productId": [],
"siteId": ["1"],
"locationId": ["11"],
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Abfrage per Post-API Version 2.0
Path:
/api/environment/{environmentId}/onhand/indexquery?pageNumber={pageNumber}&pageSize={pageSize}
Method:
Post
Headers:
Api-Version="2.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
# Same as version 1.0
Das Anforderungsformat für API-Version 2.0 ähnelt dem der Version 1.0, unterstützt jedoch auch zwei optionale Parameter: pageNumber
und pageSize
, die es dem System ermöglichen, ein einzelnes großes Ergebnis in mehrere kleinere Dokumente aufzuteilen. Die Ergebnisse werden nach Lager (locationId
) sortiert und die Parameter werden wie folgt verwendet, um die Ergebnisse auf Seiten aufzuteilen:
-
pageSize
Legt die Anzahl der Lager (locationId
Werte) fest, die auf jeder Seite zurückgegeben werden. -
pageNumber
legt die zurückgegebene Seitenzahl fest.
Eine Anfrage dieses Formats gibt Daten zum verfügbaren Lagerbestand zurück, beginnend mit der Lagernummer ({pageNumber} − 1) × {pageSize} , und schließt Daten für die nächsten {pageSize} Lager ein.
API-Version 2.0 antwortet mit einem Dokument, das die folgende Struktur verwendet:
{
Value: { # Response same as Api-Version=1.0 }
nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}
Wenn die Anfrage das letzte Lager (locationId
) erreicht, ist der nextLink
Wert eine leere Zeichenfolge.
Mit der API-Version 2.0 können Sie in Ihrer Anfrage auch mehr als eine Organisations-ID angeben. Fügen Sie dazu eine durch Kommas getrennte Liste von Organisations-IDs in den organizationId
Filter Ihres Anforderungsdokuments ein. Beispiel: "organizationId": ["org1", "org2", "org3"]
.
Abfrage mit Hilfe der get-Methode
Path:
/api/environment/{environmentId}/onhand
Method:
Get
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Query(Url Parameters):
groupBy
returnNegative
[Filters]
Hier ist eine Beispiel-GET-URL. Diese get-Anfrage ist genau die gleiche wie das post-Beispiel, das zuvor bereitgestellt wurde.
/api/environment/{environmentId}/onhand?organizationId=SCM_IV&productId=iv_contoso_product&siteId=iv_contoso_site&locationId=iv_contoso_location&colorId=red&groupBy=colorId,sizeId&returnNegative=true
Das System unterstützt keine Bestandsabfrage über mehrere Organisations-IDs mit der GET-Methode.
Exakte Bestandsabfrage
Exakt verfügbare Abfragen ähneln normalen verfügbaren Abfragen, aber sie ermöglichen es Ihnen, eine Zuordnungshierarchie zwischen einem Standort und einem Standort anzugeben. Sie haben zum Beispiel die folgenden zwei Websites:
- Standort 1, der Standort A zugeordnet ist
- Standort 2, der Standort B zugeordnet ist
Für eine regelmäßige Verfügbarkeitsabfrage, wenn Sie "siteId": ["1","2"]
und "locationId": ["A","B"]
angeben, fragt Bestandsanzeige automatisch das Ergebnis für die folgenden Sites und Standorte ab:
- Standort 1, Lagerplatz A
- Standort 1, Lagerplatz B
- Standort 2, Lagerplatz A
- Standort 2, Lagerplatz B
Wie Sie sehen, erkennt die normale Verfügbarkeitsabfrage nicht, dass Standort A nur an Standort 1 und Standort B nur an Standort 2 vorhanden ist. Daher macht es redundante Abfragen. Um diese hierarchische Zuordnung zu berücksichtigen, können Sie eine verfügbare exakte Abfrage verwenden und die Standortzuordnungen im Abfragetext angeben. In diesem Fall werden Sie nur Ergebnisse für Website 1, Standort A und Website 2, Standort B abfragen und erhalten.
Vorrätige exakte Abfrageabfrage mit der Post-Methode
Die API zur Bestandsgenauen Abfrage per Post ist in zwei Versionen verfügbar. In der folgenden Tabelle sind die Unterschiede aufgeführt.
API-Version 1.0 | API-Version 2.0 |
---|---|
Kann nur eine Organisations-ID abfragen. | Kann mehrere Organisations-IDs abfragen. |
Genaue Bestandsabfrage per Post-API Version 1.0
Path:
/api/environment/{environmentId}/onhand/exactquery
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
dimensionDataSource: string, # Optional
filters: {
organizationId: string[],
productId: string[],
dimensions: string[],
values: string[][],
},
groupByValues: string[],
returnNegative: boolean,
}
Im Body-Teil dieser Anfrage ist dimensionDataSource
ein optionaler Parameter. Wenn er nicht festgelegt ist, wird dimensions
in filters
als Basis Dimensionen behandelt. Es gibt vier Pflichtfelder für filters
: organizationId
, productId
, dimensions
und values
.
-
organizationId
sollte nur einen Wert enthalten, ist jedoch nach wie vor ein Array. -
productId
könnte einen oder mehrere Werte enthalten. Wenn es sich um ein leeres Array handelt, werden alle Produkte zurückgegeben. - Im
dimensions
-Array sindsiteId
undlocationId
nur dann erforderlich, wenn Ihre Datenpartitionsregel auf Nach Standort eingestellt ist. In diesem Fall könnten sie mit anderen Elementen in beliebiger Reihenfolge erscheinen. -
values
kann ein oder mehrere unterschiedliche Tupel von Werten enthalten, diedimensions
entsprechen.
dimensions
in filters
wird automatisch zu groupByValues
hinzugefügt.
Der returnNegative
-Parameter steuert, ob die Ergebnisse negative Einträge enthalten.
Das folgende Beispiel zeigt einen Beispielkörperinhalt.
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["SCM_IV"],
"productId": ["iv_contoso_product"],
"dimensions": ["siteId", "locationId", "colorId"],
"values" : [
["iv_contoso_site", "iv_contoso_location", "red"],
["iv_contoso_site", "iv_contoso_location", "blue"],
]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Das folgende Beispiel zeigt, wie Sie alle Produkte in mehreren Betrieben und Standorten abfragen können.
{
"filters": {
"organizationId": ["SCM_IV"],
"productId": [],
"dimensions": ["siteId", "locationId"],
"values" : [
["iv_contoso_site_1", "iv_contoso_location_1"],
["iv_contoso_site_2", "iv_contoso_location_2"],
]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Lagerbestandsgenaue Abfrage per Post-API Version 2.0
Path:
/api/environment/{environmentId}/onhand/exactquery
Method:
Post
Headers:
Api-Version="2.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
dimensionDataSource: string, # Optional
filters: {
productId: string[],
keys: string[],
values: string[][],
},
groupByValues: string[],
returnNegative: boolean,
}
API-Version 2.0 unterscheidet sich von Version 1.0 in folgenden Punkten:
- Der
filters
Abschnitt hat jetzt einkeys
Feld statt einemdimensions
Feld. Das Feldkeys
funktioniert wie das Felddimensions
in Version 1.0, kann jetzt aber auchorganizationId
enthalten. Sie können die Schlüssel in beliebiger Reihenfolge angeben. - Der
filters
Abschnitt unterstützt dasorganizationId
Feld nicht mehr. Stattdessen können SieorganizationId
zu den Dimensionen imkeys
Feld zählen (z. B.keys: ["organizationId", "siteId", "locationId"]
) und Organisations-ID-Werte an der entsprechenden Position imvalues
Feld definieren (z. B.values: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]
).
Andere Felder sind identisch mit API-Version 1.0.
Abfrage mit Produktsuche
Die folgenden verfügbaren Abfrage-APIs wurden erweitert, um die Produktsuche zu unterstützen:
Schein
Wenn Sie eine Abfrage zur Bestandssichtbarkeit veröffentlichen, die die Produktsuche verwendet, verwenden Sie die productSearch
-Anfrageparameter (mit einem ProductAttributeQuery
-Objekt darin), um die Produkt-ID zu finden oder nach ihr zu filtern. Die neueren APIs unterstützen die älteren productid
-Anforderungsparameter im Anforderungstext nicht mehr.
Voraussetzungen
Bevor Sie mit der Nutzung der Produktsuch-APIs beginnen können, muss Ihr System die folgenden Anforderungen erfüllen:
- Sie müssen die Version 10.0.36 von Dynamics 365 Supply Chain Management oder höher ausführen.
- Die Bestandsanzeigenversion 1.2.2.54 oder höher muss installiert und eingerichtet sein, wie unter Bestandsanzeige installieren und einrichten beschrieben.
- Der Suchdienst zur Bestandsanzeige muss installiert und eingerichtet sein, wie unter Produktsuche für Bestandsanzeige einrichten beschrieben.
Vertrag zur Produktsuche
Der Vertrag zur Produktsuche definiert die Regeln für die Kommunikation mit den Produktsuch-APIs. Er bietet eine standardisierte Möglichkeit, die Funktionen und das Verhalten der Produktsuchfunktionen zu beschreiben. Daher können Benutzende Anwendungen, die die Bestandsanzeige-APIs nutzen, leichter verstehen, mit ihnen interagieren und erstellen.
Das folgende Beispiel zeigt einen Beispielvertrag.
{
"productFilter": {
"logicalOperator": "And",
"conditions": [
{
"conditionOperator": "Contains",
"productName": [
"Deluxe"
],
},
],
"subFilters": [
{
"conditions": [
{
"conditionOperator": "IsExactly",
"productType": [
"Item"
]
}
]
}
]
},
"attributeFilter": {
"logicalOperator": "Or",
"conditions": [
{
"attributeName": "Weight Limit",
"attributeTypeName":"PoundDomain",
"attributeArea": " ProductAttribute",
"attributeValues": [
"370"
],
"conditionOperator": "GreaterEqual"
}
],
"subFilters": [
{
"conditions": [
{
"attributeName": "Weight Limit",
"attributeTypeName":"PoundDomain",
"attributeArea": " ProductAttribute",
"attributeValues": [
"330"
],
"conditionOperator": "LessEqual"
}
]
}
]
},
}
In der folgenden Tabelle werden die Felder beschrieben, die im Vertrag verwendet werden.
Feldkennung | Beschreibung |
---|---|
logicalOperator |
Die möglichen Werte sind And und Or . Verwenden Sie dieses Feld, um mehrere Bedingungen oder Bedingungen und Unterfilter zu verbinden. Beachten Sie, dass subFilters eigentlich ein productFilter - oder ein attributeFilter -Objekt ist. Deshalb können Sie subFilters innerhalb von subFilters haben. |
conditionOperator |
Die möglichen Werte sind IsExactly , IsNot , Contains , DoesNotContain , BeginsWith , IsOneOf , GreaterEqual , LessEqual und Between . |
ProductFilter |
Verwenden Sie dieses Feld, um Produkte nach produktbezogenen Informationen zu filtern. Sie können zum Beispiel productName im Vertrag mit Company , itemNumber , productSearchName , productType , productName , productDescription , inventoryUnitSymbol , salesUnitSymbol oder purchaseUnitSymbol passend zu Ihren Geschäftsanforderungen ändern. |
AttributeFilter |
Verwenden Sie dieses Feld, um Produkte nach attributbezogenen Informationen zu filtern. |
attributeArea |
Die möglichen Werte sind ProductAttribute , DimensionAttribute und BatchAttribute . |
Abfrage mit Produktsuche
Path:
/api/environment/{environmentId}/onhand/productsearch/indexquery
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
productSearch: {ProductAttributeQuery contract object inherited from Product Search}
dimensionDataSource: string, # Optional
filters: {
organizationId: string[],
siteId: string[],
locationId: string[],
[dimensionKey:string]: string[],
},
groupByValues: string[],
returnNegative: boolean,
}
Das folgende Beispiel zeigt einen Beispielkörperinhalt.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"returnNegative": true,
"filters":
{
"organizationId": ["usmf"],
"siteId": ["1"],
"locationId": ["13"],
},
"groupByValues": ["colorid"],
}
Das folgende Beispiel zeigt eine erfolgreiche Antwort.
[
{
"productId": "M0030",
"dimensions": {
"ColorId": "White",
"siteid": "1",
"locationid": "13"
},
"quantities": {
"fno": {
"arrived": 0,
"availordered": 20,
"onorder": 5,
"ordered": 20,
"physicalinvent": 0,
"reservordered": 0,
"reservphysical": 0,
"orderedsum": 20,
"softreserved": 0
},
"iv": {
"ordered": 0,
"softreserved": 0,
"softreservphysical": 0,
"softreservordered": 0,
"total ordered": 20,
"total on order": 5,
"availabletoreserve": 20,
"totalavailable": 20,
"totalordered": 20,
"totalonorder": 5
},
"pos": {
"inbound": 0,
"outbound": 0
},
"@iv": {
"@allocated": 0
}
}
},
{
"productId": "M0030",
"dimensions": {
"ColorId": "Black",
"siteid": "1",
"locationid": "13"
},
"quantities": {
"fno": {
"arrived": 0,
"availordered": 3,
"ordered": 3,
"physicalinvent": 0,
"reservordered": 0,
"reservphysical": 0,
"orderedsum": 3,
"softreserved": 0
},
"iv": {
"ordered": 0,
"softreserved": 0,
"softreservphysical": 0,
"softreservordered": 0,
"total ordered": 3,
"availabletoreserve": 3,
"totalavailable": 3,
"totalordered": 3
},
"pos": {
"inbound": 0,
"outbound": 0
},
"@iv": {
"@allocated": 0
}
}
}
]
Genaue Abfrage mit Produktsuche
Path:
/api/environment/{environmentId}/onhand/productsearch/exactquery
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
{
productSearch: {ProductAttributeQuery contract object inherited from Product Search}
dimensionDataSource: string, # Optional
filters: {
organizationId: string[],
dimensions: string[],
values: string[][],
},
groupByValues: string[],
returnNegative: boolean,
}
Das folgende Beispiel zeigt einen Beispielkörperinhalt.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"filters": {
"organizationId": ["usmf"],
"dimensions": ["siteId", "locationId", "colorid"],
"values" : [
["1", "13", "Black"],
]
},
"groupByValues": [],
"returnNegative": true
}
Das folgende Beispiel zeigt eine erfolgreiche Antwort.
[
{
"productId": "M0030",
"dimensions": {
"ColorId": "Black",
"siteid": "1",
"locationid": "13"
},
"quantities": {
"fno": {
"arrived": 0,
"availordered": 3,
"ordered": 3,
"physicalinvent": 0,
"reservordered": 0,
"reservphysical": 0,
"orderedsum": 3,
"softreserved": 0
},
"iv": {
"ordered": 0,
"softreserved": 0,
"softreservphysical": 0,
"softreservordered": 0,
"total ordered": 3,
"availabletoreserve": 3,
"totalavailable": 3,
"totalordered": 3
},
"pos": {
"inbound": 0,
"outbound": 0
},
"@iv": {
"@allocated": 0
}
}
}
]
Verfügbar für Zusage
Sie können Inventory Visibility so festlegen, dass Sie zukünftige Änderungen des Lagerbestands planen und ATP-Mengen berechnen können. VfZ ist die Menge eines Elements, die verfügbar ist und einem Kunden bzw. einer Kundin in der nächsten Periode zugesagt werden kann. Die Verwendung der ATP-Berechnung kann Ihre Funktionalitäten bei der Auftragsabwicklung erheblich steigern. Informationen darüber, wie Sie diese Funktion aktivieren und wie Sie mit Inventory Visibility über die API interagieren können, nachdem die Funktion aktiviert wurde, finden Sie unter Inventory Visibility Lagerbestand ändert Zeitpläne und ist für Versprechen verfügbar.
Zuweisung
Zuweisungsbezogene APIs befinden sich in Zuweisung der Bestandsichtbarkeit.