Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Note
I gruppi di interesse della community sono ora passati da Yammer a Microsoft Viva Engage. Per partecipare a una community Viva Engage e partecipare alle discussioni più recenti, compilare il modulo Request access to Finance and Operations Viva Engage Community e scegliere la community a cui si vuole partecipare.
Important
A partire da febbraio 2026, i nuovi clienti non possono creare progetti in Microsoft Dynamics Lifecycle Services per Microsoft Dynamics 365 Finance, Microsoft Dynamics 365 Human Resources, Microsoft Dynamics 365 Supply Chain Management e Microsoft Dynamics 365 Project Operations. I nuovi clienti devono usare invece l'interfaccia di amministrazione di Power Platform . Per altre informazioni, vedere Blocco della creazione del progetto di Servizi del ciclo di vita.
Questo articolo descrive le API pubbliche fornite da Visibilità inventario.
L'API REST pubblica del componente aggiuntivo Visibilità magazzino presenta diversi endpoint specifici per l'integrazione. Supporta quattro tipi principali di interazione:
- Registrazione delle modifiche delle scorte disponibili nel componente aggiuntivo da un sistema esterno
- Impostazione o sovrascrittura delle quantità di scorte a disposizione nell'add-in da un sistema esterno
- Inviare eventi di prenotazione all'add-in da un sistema esterno
- Eseguire una query sulle quantità disponibili correnti da un sistema esterno
La seguente tabella elenca le API che sono attualmente disponibili:
| Percorso | Metodo | Description |
|---|---|---|
/api/environment/{environmentId}/onhand |
Registra | Creare un evento di cambiamento a portata di mano |
/api/environment/{environmentId}/onhand/bulk |
Registra | Creare più eventi di cambiamento |
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk |
Registra | Impostare/sovrascrivere le quantità disponibili |
/api/environment/{environmentId}/onhand/reserve |
Registra | Creare un evento di prenotazione temporanea |
/api/environment/{environmentId}/onhand/reserve/bulk |
Registra | Creare più eventi di prenotazione temporanea |
/api/environment/{environmentId}/onhand/unreserve |
Registra | Invertire un evento di prenotazione temporanea |
/api/environment/{environmentId}/onhand/unreserve/bulk |
Registra | Invertire più eventi di prenotazione temporanea |
/api/environment/{environmentId}/onhand/reserve/resyncjob |
Registra | Pulire i dati di prenotazione |
/api/environment/{environmentId}/getJobProgress |
Ottieni | Ottenere lo stato di esecuzione del processo |
/api/environment/{environmentId}/onhand/changeschedule |
Registra | Crea una modifica scorte disponibili programmata |
/api/environment/{environmentId}/onhand/changeschedule/bulk |
Registra | Crea più modifiche scorte disponibili con date |
/api/environment/{environmentId}/onhand/indexquery |
Registra | Query esatte usando il metodo post (opzione consigliata) |
/api/environment/{environmentId}/onhand |
Ottieni | Interrogare usando il metodo get |
/api/environment/{environmentId}/onhand/exactquery |
Registra | Query esatte usando il metodo post |
/api/environment/{environmentId}/allocation/allocate |
Registra | Creare un evento di allorazione |
/api/environment/{environmentId}/allocation/unallocate |
Registra | Creare un evento di annullamento dell'allorazione |
/api/environment/{environmentId}/allocation/reallocate |
Registra | Creare un evento di riallorazione |
/api/environment/{environmentId}/allocation/consume |
Registra | Creare un evento di consumo |
/api/environment/{environmentId}/allocation/query |
Registra | Risultato della query di allocazione |
/api/environment/{environmentId}/onhand/productsearch/indexquery |
Registra | Registra una query indice con la ricerca del prodotto |
/api/environment/{environmentId}/onhand/productsearch/exactquery |
Registra | Registra una query esatta con la ricerca del prodotto |
/api/environment/{environmentId}/transaction/adjustment/bulk |
Registra | Sincronizzare le modifiche all'inventario esterno tramite la visibilità dell'inventario |
Note
La parte {environmentId} del percorso è l'ID ambiente di Microsoft Dynamics 365 Supply Chain Management. Questo ID è quello indicato per Supply Chain Management in Microsoft Dynamics Lifecycle Services, non l'ID dell'ambiente Power Platform collegato all'ambiente Supply Chain Management.
L'API in blocco può restituire un massimo di 512 record per ogni richiesta.
Autenticazione
Il token di sicurezza della piattaforma è usato per chiamare l'API pubblica Visibilità inventario. Pertanto, è necessario generare un token Microsoft Entra usando l'applicazione Microsoft Entra. È quindi necessario usare il token Microsoft Entra per ottenere il token di accesso dal servizio di sicurezza.
Per ottenere un token del servizio di sicurezza, seguire questa procedura:
Accedi al portale di Azure e usalo per trovare i valori
clientIdeclientSecretper l'app Dynamics 365 Supply Chain Management.Recuperare un token Microsoft Entra (
aadToken) inviando una richiesta HTTP con le proprietà seguenti:URL:
https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/tokenMetodo:
GETContenuto del corpo (dati del modulo):
Key Value client_id ${aadAppId} client_secret ${aadAppSecret} grant_type client_credentials scope 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.default
Si dovrebbe ricevere un token Microsoft Entra (
aadToken) in risposta. Il risultato sarà simile all'esempio seguente.{ "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "access_token": "eyJ0eX...8WQ" }Formulare una richiesta JSON (JavaScript Object Notation) che assomigli al seguente esempio.
{ "grant_type": "client_credentials", "client_assertion_type": "aad_app", "client_assertion": "${Your_Microsoft_EntraToken}", "scope": "https://inventoryservice.operations365.dynamics.com/.default", "context": "${fno_environment_id}", "context_type": "finops-env" }Notare i punti seguenti:
- Il
client_assertionvalore deve essere il token Microsoft Entra (aadToken) ricevuto nel passaggio precedente. - Il
contextvalore deve essere l'ID dell'ambiente supply chain management in cui si vuole distribuire il componente aggiuntivo. - Impostare tutti gli altri valori come mostrato nell'esempio.
- Il
Recuperare un token di accesso (
access_token) inviando una richiesta HTTP che ha le seguenti proprietà:URL:
https://securityservice.operations365.dynamics.com/tokenMetodo:
POSTIntestazione HTTP:
Key Value Api-Version 1.0 Content-Type application/json Contenuto del corpo: Includete la richiesta JSON che avete creato nel passo precedente.
Dovresti ricevere un token di accesso (
access_token) in risposta. È necessario utilizzare questo token come token portatore per chiamare l'API di visibilità dell'inventario. Ecco un esempio.{ "access_token": "${Returned_Token}", "token_type": "bearer", "expires_in": 3600 }Note
Se si riceve una risposta con codice di stato 307, usare il valore dell'intestazione
Locationper inviare nuovamente la richiesta di token al nuovo URL. La maggior parte delle librerie HTTP gestisce automaticamente i reindirizzamenti.
Creare eventi di cambiamento a portata di mano
Ci sono due API per la creazione di eventi di cambiamento on-hand:
- Creare un record:
/api/environment/{environmentId}/onhand - Creare record multipli:
/api/environment/{environmentId}/onhand/bulk
La tabella seguente riassume il significato di ogni campo nel corpo JSON.
| ID campo | Description |
|---|---|
id |
Un ID univoco per l'evento di modifica specifico. Se si verifica un nuovo invio a causa di un errore del servizio, questo ID è usato per assicurare che lo stesso evento non sarà contato due volte nel sistema se viene ripresentato. |
organizationId |
L'identificatore dell'organizzazione che è collegata all'evento. Questo valore è mappato a un'organizzazione o a un ID dell'area dati in Supply Chain Management. |
productId |
Identificatore del prodotto. |
quantities |
La quantità di cui deve essere cambiata la quantità a disposizione. Per esempio, se 10 nuovi libri vengono aggiunti a uno scaffale, questo valore sarà quantities:{ shelf:{ received: 10 }}. Se tre libri vengono rimossi dallo scaffale o venduti, questo valore sarà quantities:{ shelf:{ sold: 3 }}. |
dimensionDataSource |
L'origine dei dati delle dimensioni che sono utilizzate nell'evento di modifica del distacco e nella query. Se si specifica l'origine dati, è possibile utilizzare le dimensioni personalizzate dell'origine dati specificata. Visibilità inventario può utilizzare la configurazione delle dimensioni per mappare le dimensioni personalizzate alle dimensioni generali predefinite. Se nessun valore dimensionDataSource è specificato, potete usare solo le dimensioni di base generali nelle vostre query. |
dimensions |
Una coppia chiave-valore dinamica. I valori sono mappati ad alcune delle dimensioni del Supply Chain Management. Tuttavia, puoi anche aggiungere dimensioni personalizzate (per esempio, Source) per indicare se l'evento proviene da Supply Chain Management o da un sistema esterno. |
Note
Se la tua regola di partizione dei dati è impostata su Per ID prodotto, siteId e locationId sono dimensioni facoltative. In caso contrario, sono dimensioni obbligatorie. Questa regola si applica anche alle API di allocazione, riserva temporanea e pianificazione delle modifiche.
Le seguenti sottosezioni forniscono esempi che mostrano come utilizzare queste API.
Creare un evento di cambiamento a portata di mano
Questa API crea un singolo evento di cambiamento on-hand.
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,
},
},
}
L'esempio seguente mostra un esempio di contenuto del corpo. In questo esempio, l'azienda dispone di un sistema POS (point of sale) che elabora le transazioni in negozio e quindi le variazioni delle scorte. Il cliente ha restituito una maglietta rossa al tuo negozio. Per riflettere la modifica, pubblichi un singolo evento di cambiamento per il prodotto T-shirt . Questo evento aumenterà la quantità del prodotto T-shirt di 1.
{
"id": "Test201",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"siteId": "1",
"locationId": "11",
"posMachineId": "0001",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Il seguente esempio mostra un esempio di contenuto del corpo senza dimensionDataSource. In questo caso, le dimensions saranno le dimensioni di base. Se dimensionDataSource è impostato, le dimensions possono essere le dimensioni dell'origine dati o le dimensioni di base.
{
"id": "Test202",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Creare più eventi di cambiamento
Questa API può creare eventi di modifica, proprio come l'API a evento singolo. L'unica differenza è che questa API può creare più record allo stesso tempo. Quindi, i valori Path e Body differiscono. Per questa API, Body fornisce un array di record. Il numero massimo di record è 512. Pertanto, l'API della programmazione delle modifiche delle scorte disponibili può supportare fino a 512 eventi di modifica alla volta.
Ad esempio, un computer POS di un punto vendita al dettaglio ha elaborato le seguenti due transazioni:
- Un ordine di reso di una maglietta rossa
- Una transazione di vendita di tre magliette nere
In questo caso, puoi includere entrambi gli aggiornamenti delle scorte in una chiamata API.
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,
},
},
},
...
]
L'esempio seguente mostra un esempio di contenuto del corpo.
[
{
"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 }
}
}
]
Impostare/sovrascrivere le quantità disponibili
L'API Set on-hand sovrascrive i dati attuali per il prodotto specificato. Questa funzionalità viene in genere utilizzata per eseguire gli aggiornamenti del conteggio dell'inventario. Ad esempio, durante il conteggio giornaliero delle scorte, un punto vendita potrebbe scoprire che le scorte effettivamente disponibili per una maglietta rossa è 100. Pertanto, la quantità in entrata POS deve essere aggiornata a 100, indipendentemente da quale fosse la quantità precedente. Puoi utilizzare questa API per sovrascrivere il valore esistente.
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,
},
...
]
L'esempio seguente mostra un esempio di contenuto del corpo. Il comportamento di questa API differisce da quello delle API che sono descritte nella sezione Creare eventi di modifica on-hand in precedenza in questo articolo. In questo esempio, la quantità del prodotto T-shirt sarà impostata a 1.
[
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 100
}
}
}
]
Creare eventi di prenotazione
Per utilizzare l'API di riserva , è necessario attivare la funzione di prenotazione e completare la configurazione della prenotazione. Per ulteriori informazioni (incluso un flusso di dati e uno scenario di esempio), vedere Prenotazioni di visibilità dell'inventario.
Creare un evento di prenotazione
È possibile effettuare una prenotazione su impostazioni dell'origine dati diverse. Per configurare questo tipo di prenotazione, specificare prima l'origine dati nel parametro dimensionDataSource. Quindi, nel parametro dimensions, specificare le dimensioni in base alle impostazioni delle dimensioni nell'origine dati di destinazione.
Quando si chiama l'API di prenotazione, è possibile controllare la convalida della prenotazione specificando il parametro booleano ifCheckAvailForReserv nel corpo della richiesta. Un valore di True significa che è richiesta la convalida, mentre un valore di False significa che la convalida non è richiesta. Il valore predefinito è True.
Se si desidera annullare una prenotazione o annullare la prenotazione di quantità di inventario specificate, impostare la quantità su un valore negativo e impostare il parametro ifCheckAvailForReserv su False per saltare la convalida. Esiste anche un'API per annullare la prenotazione dedicata per fare lo stesso. La differenza è solo nel modo in cui vengono chiamate le due API. È più facile annullare un evento di prenotazione specifico utilizzando reservationId con l'API di annullamento della prenotazione. Per maggiori informazioni, consultare la sezione Annulla un evento di prenotazione.
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,
}
L'esempio seguente mostra un esempio di contenuto del corpo.
{
"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"
}
}
L'esempio seguente mostra una risposta riuscita.
{
"reservationId": "RESERVATION_ID",
"id": "ohre~id-822-232959-524",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Creare più eventi di prenotazione
Questa API è una versione in blocco dell' API a evento singolo.
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,
},
...
]
Annullare gli eventi di prenotazione
L'API Annulla prenotazione funge da operazione di annullamento per gli eventi Prenotazione. Fornisce un modo per annullare un evento di prenotazione specificato da reservationId o per diminuire la quantità di prenotazione.
Annullare la prenotazione di un evento
Quando viene creata una prenotazione, un reservationId sarà incluso nel corpo di risposta. Devi fornire lo stesso reservationId per annullare la prenotazione, e includere gli stessi organizationId, productId e dimensions utilizzati per la chiamata API di prenotazione. Infine, specificare un valore OffsetQty che rappresenta il numero di elementi da liberare dalla prenotazione precedente. Una prenotazione può essere completamente o parzialmente annullata a seconda del valore OffsetQty specificato. Ad esempio, se 100 unità di articoli sono state prenotate, è possibile specificare OffsetQty: 10 per annullare la prenotazione di 10 dell'importo iniziale riservato.
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
}
Il codice seguente mostra un esempio di contenuto del corpo.
{
"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
}
Il codice seguente mostra un esempio del corpo della risposta riuscita.
{
"reservationId": "RESERVATION_ID",
"totalInvalidOffsetQtyByReservId": 0,
"id": "ohoe~id-823-11744-883",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Note
Nel corpo della risposta, quando OffsetQty è inferiore o uguale alla quantità di prenotazione, processingStatus sarà "riuscito" e totalInvalidOffsetQtyByReservId sarà 0.
Se OffsetQty è maggiore dell'importo prenotato, processingStatus sarà "partialSuccess " e totalInvalidOffsetQtyByReservId sarà la differenza tra OffsetQty e l'importo prenotato.
Ad esempio, se la prenotazione ha una quantità di 10, e OffsetQty ha un valore di 12, totalInvalidOffsetQtyByReservId sarebbe 2.
Annullare più eventi di prenotazione
Questa API è una versione in blocco dell' API a evento singolo.
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
}
...
]
Pulire i dati di prenotazione
L'API per pulire i dati di prenotazione viene utilizzata per ripulire i dati storici delle prenotazioni. Il corpo dovrebbe essere un elenco di origini dati. Se l'elenco è vuoto, tutte le origini dati verranno pulite.
Path:
/api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
"iv",
"pos"
]
Se il processo di pulizia viene creato correttamente, nella risposta verrà restituito un ID processo, che può essere usato per ottenere lo stato di avanzamento dell'esecuzione del processo.
Ottenere il progresso dell'esecuzione del lavoro
Usare l'API get job execution progress per ottenere lo stato di avanzamento dell'esecuzione di un processo. Per identificare l'attività, è necessario un ID lavoro.
Path:
/api/environment/{environmentId}/getJobProgress
Method:
Get
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Query(Url Parameters):
jobId
Ecco un esempio di URL.
/api/environment/{environmentId}/getJobProgress?jobId=SomeJob:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Query disponibilità
usa l'API Query on-hand per recuperare i dati di inventario correnti per i tuoi prodotti. Puoi utilizzare questa API ogni volta che devi conoscere lo stock, ad esempio quando desideri esaminare i livelli di stock dei prodotti sul tuo sito Web di e-commerce o quando desideri verificare la disponibilità dei prodotti nelle aree geografiche o nei punti vendita e magazzini vicini. L'API attualmente supporta le query fino a 5000 singoli elementi con il valore productID. Più valori siteID e locationID possono anche essere specificati in ogni query. Quando la regola di partizione dei dati è impostata su Per posizione, il limite massimo è definito dalla seguente equazione:
NumOf(SiteID) × NumOf(LocationID) <= 10.000.
Query usando il metodo post
La query tramite API POST è disponibile in due versioni. Nella tabella seguente vengono descritte le differenze.
| API versione 1.0 | API versione 2.0 |
|---|---|
| È possibile eseguire query su un solo ID organizzazione. | Può eseguire query su più ID organizzazione. |
| Può eseguire query fino a 10.000 combinazioni di siti e magazzini. | Può eseguire query su più di 10.000 combinazioni di ID, siti e magazzini dell'organizzazione. Può restituire risultati in più pagine. |
Le sottosezioni seguenti illustrano come usare ogni versione dell'API.
Query tramite API Post versione 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,
}
Nella parte del corpo di questa richiesta, dimensionDataSource è un parametro facoltativo. Se non è impostato, i filters saranno considerati come dimensioni di base.
Il parametro returnNegative controlla se i risultati contengono voci negative.
Eseguire query sui dati memorizzati in base alla posizione
Questa sezione si applica quando la regola di partizione dei dati è impostata su Per posizione.
-
organizationIddovrebbe essere un array contenente esattamente un valore. -
productIdpuò contenere uno o più valori. Se si tratta di un array vuoto, il sistema restituirà tutti i prodotti dei siti e delle ubicazioni specifici. In questo casositeIdelocationIdnon devono essere vuoti. -
siteIdelocationIdsono usati per il partizionamento. È possibile specificare più di un valoresiteIdelocationIdin una richiesta Query a portata di mano. Se entrambi gli array sono vuoti, il sistema restituirà tutti i siti e le posizioni dei prodotti specifici. In questo casoproductIdnon deve essere vuoto.
Ti consigliamo di utilizzare il parametro groupByValues in modo coerente con la configurazione dell'indice. Per altre informazioni, vedere Configurazione dell'indice manuale.
Eseguire query per i dati memorizzati per ID prodotto
Questa sezione si applica quando la regola di partizione dei dati è impostata su Per ID prodotto. In questo caso sono obbligatori due campi filters: organizationId, productId.
-
organizationIddovrebbe essere un array contenente esattamente un valore. -
productIddovrebbe essere un array con almeno un valore.
A differenza dell'archiviazione dei dati in base alla posizione, se non specifichi valori per siteId e locationId, le informazioni sull'inventario per ciascun ID prodotto verranno aggregate in tutti i siti e/o posizioni.
Note
Se hai abilitato la pianificazione delle modifiche scorte disponibili e le funzionalità ATP (available-to-promise), la tua query può includere anche il parametro booleano QueryATP che controlla se i risultati della query includono informazioni ATP. Per altre informazioni ed esempi vedi Visibilità dell'inventario con programmazioni di modifiche scorte disponibili e available-to-promise.
L'esempio seguente mostra un esempio di contenuto del corpo. Mostra che è possibile eseguire query sulle scorte disponibili da più posizioni (magazzini).
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["usmf"],
"productId": ["T-shirt"],
"siteId": ["1"],
"locationId": ["11","12","13"],
"colorId": ["red"]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
L'esempio seguente mostra come eseguire query su tutti i prodotti in un sito e in una posizione specifici.
{
"filters": {
"organizationId": ["usmf"],
"productId": [],
"siteId": ["1"],
"locationId": ["11"],
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Query tramite API Post versione 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
Il formato di richiesta per l'API versione 2.0 è simile a quello della versione 1.0, ma supporta anche due parametri facoltativi: pageNumber e pageSize, che consentono al sistema di suddividere un singolo risultato di grandi dimensioni in diversi documenti più piccoli. I risultati vengono ordinati in base al warehouse (locationId) e i parametri vengono usati come segue per suddividere i risultati in pagine:
-
pageSizestabilisce il numero di magazzini (locationIdvalori) restituiti in ogni pagina. -
pageNumberstabilisce il numero di pagina restituito.
Una richiesta di questo formato restituisce i dati di inventario a partire dal numero di magazzino ({pageNumber} − 1) × {pageSize} e include i dati per i successivi {pageSize} warehouse.
L'API versione 2.0 risponde con un documento che usa la struttura seguente:
{
Value: { # Response same as Api-Version=1.0 }
nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}
Quando la richiesta raggiunge l'ultimo warehouse (locationId), il nextLink valore è una stringa vuota.
L'API versione 2.0 consente anche di specificare più ID organizzazione nella richiesta. A tale scopo, includere un elenco di ID organizzazione delimitato da virgole nel filtro organizationId del documento di richiesta. Ad esempio: "organizationId": ["org1", "org2", "org3"].
Query usando il metodo get
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]
Ecco un esempio di URL. Questa richiesta di get è esattamente la stessa dell'esempio di post che è stato fornito prima.
/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
Il sistema non supporta l'esecuzione di query nell'inventario su più ID organizzazione con il metodo GET.
Query sulla disponibilità esatta
Le query sulla disponibilità esatta assomigliano alle normali query sulla disponibilità, ma consentono di specificare una gerarchia di mapping tra un sito e una posizione. Per esempio, hai i seguenti due siti:
- Sito 1, mappato alla posizione A
- Sito 2, mappato alla posizione B
Per una normale richiesta di disponibilità, se specifichi "siteId": ["1","2"] e "locationId": ["A","B"], Visibilità inventario eseguirà automaticamente query sul risultato per i seguenti siti e località:
- Sito 1, posizione A
- Sito 1, posizione B
- Sito 2, posizione A
- Sito 2, posizione B
Come vedi, la normale query sulla disponibilità non riconosce che la posizione A esiste solo nel sito 1 e la posizione B esiste solo nel sito 2. Pertanto, effettua query ridondanti. Per soddisfare questo mapping gerarchico, è possibile utilizzare una query esatta disponibile e specificare i mapping della posizione nel corpo della query. In questo caso, eseguirai la query e riceverai i risultati solo per il sito 1, posizione A e per il sito 2, posizione B.
Query esatta sulla disponibilità eseguita usando il metodo post
La query esatta sulla disponibilità tramite l'API post è disponibile in due versioni. Nella tabella seguente vengono descritte le differenze.
| API versione 1.0 | API versione 2.0 |
|---|---|
| È possibile eseguire query su un solo ID organizzazione. | Può eseguire query su più ID organizzazione. |
Query esatta sulla disponibilità tramite l'API post versione 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,
}
Nella parte del corpo di questa richiesta, dimensionDataSource è un parametro facoltativo. Se non è impostato, dimensions in filters saranno considerati come dimensioni di base. Sono presenti quattro campi obbligatori per filters: organizationId, productId, dimensions e values.
-
organizationIddeve contenere un solo valore, ma è ancora una matrice. -
productIdpotrebbe contenere uno o più valori. Se è una matrice vuota, verranno restituiti tutti i prodotti. - Nell'array
dimensions,siteIdelocationIdsono obbligatori se e solo se la regola di partizione dei dati è impostata per Per posizione. In questo caso, potrebbero apparire con altri elementi in qualsiasi ordine. -
valuespotrebbe contenere una o più distinte tuple di valori corrispondenti adimensions.
I valori dimensions in filters verranno automaticamente aggiunti a groupByValues.
Il parametro returnNegative controlla se i risultati contengono voci negative.
L'esempio seguente mostra un esempio di contenuto del corpo.
{
"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
}
L'esempio seguente mostra come eseguire query su tutti i prodotti in più siti e ubicazioni.
{
"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
}
Query esatta sulla disponibilità tramite l'API post versione 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,
}
L'API versione 2.0 è diversa dalla versione 1.0 nei modi seguenti:
- La
filterssezione include ora unkeyscampo anziché undimensionscampo. Ilkeyscampo funziona come ildimensionscampo nella versione 1.0, ma ora può includereorganizationIdanche . È possibile specificare le chiavi in qualsiasi ordine. - La
filterssezione non supporta più ilorganizationIdcampo. È invece possibile includereorganizationIdtra le dimensioni nelkeyscampo (ad esempio ,keys: ["organizationId", "siteId", "locationId"]) e definire i valori id organizzazione nella posizione corrispondente nelvaluescampo (ad esempio,values: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]).
Altri campi sono identici all'API versione 1.0.
Query con la ricerca del prodotto
Le seguenti API di query disponibili sono state migliorate per supportare la ricerca di prodotti:
Note
Quando registri una query di Visibilità inventario che utilizza la ricerca del prodotto, utilizza il parametro di richiesta productSearch (con un oggetto ProductAttributeQuery all'interno) per trovare o filtrare in base all'ID prodotto. Le API più recenti non supportano più il parametro di richiesta productid precedente nel corpo della richiesta.
Prerequisiti
Prima di poter iniziare a usare le API di ricerca dei prodotti, il tuo sistema deve soddisfare i seguenti requisiti:
- È necessario eseguire Dynamics 365 Supply Chain Management 10.0.36 o versione successiva.
- Devi aver installato e configurato Visibilità inventario versione 1.2.2.54 o successiva, come descritto in Installare e configurare Visibilità inventario.
- Devi aver installato il servizio di ricerca Visibilità inventario come descritto in Configurare la Impostare la ricerca di prodotti per Visibilità inventario.
Contratto per la ricerca di prodotti
Il contratto per la ricerca di prodotti definisce le regole per la comunicazione con le API di ricerca di prodotti. Fornisce un modo standardizzato per descrivere le funzionalità e il comportamento delle funzionalità di ricerca di prodotti. Pertanto, gli utenti possono comprendere, interagire e creare più facilmente applicazioni che utilizzano le API di Visibilità inventario.
L'esempio seguente mostra un esempio di contratto.
{
"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"
}
]
}
]
},
}
Nella tabella seguente sono descritti i campi usati nel contratto.
| ID campo | Description |
|---|---|
logicalOperator |
I valori possibili sono And e Or. Utilizza questo campo per connettere più condizioni o condizioni e filtri secondari. Nota che subFilters è in realtà un oggetto productFilter o attributeFilter. Pertanto, puoi avere subFilters in subFilters. |
conditionOperator |
I valori possibili sono IsExactly, IsNot, Contains, DoesNotContain, BeginsWith, IsOneOf, GreaterEqual, LessEqual e Between. |
ProductFilter |
Utilizza questo campo per filtrare i prodotti in base alle informazioni relative al prodotto. Ad esempio, puoi cambiare productName nel contratto in Company, itemNumber, productSearchName, productType, productName, productDescription, inventoryUnitSymbol, salesUnitSymbol o purchaseUnitSymbol per soddisfare le tue esigenze aziendali. |
AttributeFilter |
Utilizza questo campo per filtrare i prodotti in base alle informazioni relative all'attributo. |
attributeArea |
I valori possibili sono ProductAttribute, DimensionAttribute e BatchAttribute. |
Query con la ricerca del prodotto
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,
}
L'esempio seguente mostra un esempio di contenuto del corpo.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"returnNegative": true,
"filters":
{
"organizationId": ["usmf"],
"siteId": ["1"],
"locationId": ["13"],
},
"groupByValues": ["colorid"],
}
L'esempio seguente mostra una risposta riuscita.
[
{
"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
}
}
}
]
Query esatta con la ricerca del prodotto
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,
}
L'esempio seguente mostra un esempio di contenuto del corpo.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"filters": {
"organizationId": ["usmf"],
"dimensions": ["siteId", "locationId", "colorid"],
"values" : [
["1", "13", "Black"],
]
},
"groupByValues": [],
"returnNegative": true
}
L'esempio seguente mostra una risposta riuscita.
[
{
"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
}
}
}
]
Available-to-promise
È possibile impostare la visibilità inventario per pianificare le modifiche future disponibili e calcolare le quantità ATP. ATP è la quantità di un articolo disponibile e che può essere promessa a un cliente nel prossimo periodo. L'uso del calcolo ATP può aumentare notevolmente la capacità di evasione degli ordini. Per informazioni su come abilitare questa funzione e su come interagire con la visibilità inventario tramite la relativa API dopo che la funzione è stata abilitata, vedi Visibilità dell'inventario con programmazioni di modifiche scorte disponibili e available-to-promise.
Allocazione
Le API relative all'allocazione si trovano in Allocazione di Inventory Visibility.