Note
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
Important
2026 年 2 月以降、新規のお客様は Microsoft Dynamics 365 Finance、Microsoft Dynamics 365 Human Resources、Microsoft Dynamics 365 Supply Chain Management、Microsoft Dynamics 365 Project Operations の Microsoft Dynamics Lifecycle Services でプロジェクトを作成できません。 新しいお客様は、代わりに Power Platform 管理センター を使用する必要があります。 詳細については、「ライフサイクル サービス プロジェクトの作成停止」を参照してください。
この記事では、Inventory Visibility によって提供されるパブリック API について説明します。
Inventory Visibility アドインのパブリック REST API は、特定の統合エンドポイントを複数提供します。 次の 4 つの主要な相互作用タイプをサポートします。
- 外部システムから、手持在庫の変更をアドインに転記する
- 外部システムから、アドインの手持在庫数量を設定または上書きする
- 外部システムから、予約イベントをアドインに転記する
- 外部システムから現在の手持在庫数量を問い合わせる
次のテーブルに、現在使用可能な API を示します。
| パス | Method | Description |
|---|---|---|
/api/environment/{environmentId}/onhand |
投稿 | 1 つの手持在庫変更のイベントの作成 |
/api/environment/{environmentId}/onhand/bulk |
投稿 | 複数の変更イベントの作成 |
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk |
投稿 | 手持在庫数量の設定/上書き |
/api/environment/{environmentId}/onhand/reserve |
投稿 | 1 つの仮引当イベントの作成 |
/api/environment/{environmentId}/onhand/reserve/bulk |
投稿 | 複数の仮引当イベントの作成 |
/api/environment/{environmentId}/onhand/unreserve |
投稿 | 1 つの仮引当イベントの取り消し |
/api/environment/{environmentId}/onhand/unreserve/bulk |
投稿 | 複数の仮引当イベントの取り消し |
/api/environment/{environmentId}/onhand/reserve/resyncjob |
投稿 | 引当データのクリーン アップ |
/api/environment/{environmentId}/getJobProgress |
取得 | ジョブの実行の進行状況を取得する |
/api/environment/{environmentId}/onhand/changeschedule |
投稿 | 1 つのスケジュール済み手持在庫変更の作成 |
/api/environment/{environmentId}/onhand/changeschedule/bulk |
投稿 | 日付を指定した複数の手持在庫変更の作成 |
/api/environment/{environmentId}/onhand/indexquery |
投稿 | POST メソッドを使用したクエリ (推奨) |
/api/environment/{environmentId}/onhand |
取得 | 取得メソッドを使用したクエリ |
/api/environment/{environmentId}/onhand/exactquery |
投稿 | POST メソッドを使用した正確なクエリ |
/api/environment/{environmentId}/allocation/allocate |
投稿 | 1 つの配賦イベントの作成 |
/api/environment/{environmentId}/allocation/unallocate |
投稿 | 1 つの未配賦イベントの作成 |
/api/environment/{environmentId}/allocation/reallocate |
投稿 | 1 つの再配賦イベントの作成 |
/api/environment/{environmentId}/allocation/consume |
投稿 | 1 つの消費イベントの作成 |
/api/environment/{environmentId}/allocation/query |
投稿 | クエリの配賦結果 |
/api/environment/{environmentId}/onhand/productsearch/indexquery |
投稿 | 製品検索を含むインデックス クエリを投稿 |
/api/environment/{environmentId}/onhand/productsearch/exactquery |
投稿 | 製品検索で正確なクエリを投稿 |
/api/environment/{environmentId}/transaction/adjustment/bulk |
投稿 | インベントリの可視性を使用して外部インベントリの変更を同期する |
Note
パスの {environmentId} 部分は、Microsoft Dynamics 365 Supply Chain Management の環境 ID です。 この ID は、サプライ チェーン管理環境にリンクされている Power Platform 環境の ID ではなく、Microsoft Dynamics ライフサイクル サービスのサプライ チェーン管理に記載されている ID です。
バルク API では、要求ごとに最大 512 件のレコードを返します。
認証
プラットフォーム セキュリティ トークンは、Inventory Visibility パブリック API を呼び出すために使用されます。 そのため、Microsoft Entra アプリケーションを使用して Microsoft Entra トークン を生成する必要があります。 その後、Microsoft Entra トークンを使用して、セキュリティ サービスから アクセス トークン を取得する必要があります。
セキュリティ サービス トークンを取得するには、次の手順に従います。
Azure portal にサインインし、それを使用して Dynamics 365 Supply Chain Management アプリの
clientIdとclientSecretの値を見つけます。次のプロパティを持つ HTTP 要求を送信して、Microsoft Entra トークン (
aadToken) をフェッチします。URL:
https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/tokenメソッド:
GET本文の内容 (フォーム データ):
キー 値 クライアント ID ${aadAppId} クライアント シークレット ${aadAppSecret} 付与タイプ client_credentials スコープ 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.default
応答として Microsoft Entra トークン (
aadToken) を受け取る必要があります。 これは次の例に類似しているはずです。{ "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "access_token": "eyJ0eX...8WQ" }次の例に似た JavaScript Object Notation (JSON) 要求を作成します。
{ "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" }次のポイントに注意します。
-
client_assertion値は、前の手順で受け取った Microsoft Entra トークン (aadToken) である必要があります。 -
context値は、アドインを展開するサプライ チェーン管理環境 ID である必要があります。 - 例に示すように、他のすべての値を設定します。
-
次のプロパティを持つ HTTP 要求を送信することにより、アクセス トークン (
access_token) を取得します。URL:
https://securityservice.operations365.dynamics.com/tokenメソッド:
POSTHTTP ヘッダー:
キー 値 Api-Version 1.0 Content-Type(コンテントタイプ) application/json 本文の内容: 前の手順で作成した JSON 要求を含めます。
応答でアクセス トークン (
access_token) を取得する必要があります。 Inventory Visibility API を呼び出すためのベアラー トークンとしてこのトークンを使用する必要があります。 次に例を示します。{ "access_token": "${Returned_Token}", "token_type": "bearer", "expires_in": 3600 }Note
状態コード 307 で応答を受け取った場合は、
Locationヘッダーの値を使用して、トークン要求を新しい URL に再送信します。 ほとんどの HTTP ライブラリでは、リダイレクトが自動的に処理されます。
手持在庫変更のイベントの作成
2 つの API を使用して、手持在庫変更のイベントを作成できます。
- 1 つの記録の作成:
/api/environment/{environmentId}/onhand - 複数の記録の作成:
/api/environment/{environmentId}/onhand/bulk
次のテーブルでは、JSON 本文の各フィールドの意味が要約されています。
| フィールド ID | Description |
|---|---|
id |
特定の変更イベントの固有 ID。 サービス障害で再転記が発生した場合、この ID を使用してシステム上で同じイベントが 2 回カウントされることを予防します。 |
organizationId |
イベントにリンクされている組織の ID。 この値は、Supply Chain Management での組織またはデータ領域 ID にマップされます。 |
productId |
製品の識別子。 |
quantities |
手持在庫の数量の変更が必要な数量。 たとえば、新たに帳簿を 10 つ追加すると、この値は quantities:{ shelf:{ received: 10 }} になります。 棚から 3 つの帳簿が削除される場合、または販売される場合、この値は quantities:{ shelf:{ sold: 3 }} になります。 |
dimensionDataSource |
イベントやクエリ変更の転記で使用する分析コードのデータ ソース。 データ ソースを指定する場合は、指定されたデータ ソースのカスタム分析コードを使用できます。 Inventory Visibility は、分析コードの構成を使用して、カスタム分析コードを既定の標準分析コードにマップできます。
dimensionDataSource の値が指定されていない場合は、クエリで標準の基準分析コード のみを使用できます。 |
dimensions |
動的なキーと値のペア。 値は Supply Chain Management の分析コードの一部にマップされます。 ただし、カスタム分析コード (ソース など)を追加して、イベントが Supply Chain Management から取得されたか、または外部システムから取得されたかどうかを示したりすることもできます。 |
Note
データのパーティション ルールが 製品 ID ごと に設定されている場合は、siteId と locationId はオプションの分析コードです。 それ以外の場合、寸法が必須とされています。 このルールは配賦、ソフト リザーブ、変更スケジュール API にも適用されます。
次のサブセクションでは、これらの API の使用方法を示す例を示します。
1 つの手持在庫変更のイベントの作成
この API により、1 つの手持在庫変更のイベントが作成されます。
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,
},
},
}
次の例は、サンプル本文コンテンツを示しています。 この例では、会社には店舗トランザクションを処理する販売時点管理 (POS) システムがあるため、在庫が変更されます。 顧客が赤い T シャツを店舗に返品してきました。 変更を反映するには、T シャツ の商品に対して 1 つの変更イベントを転記します。 このイベントにより、T シャツ製品の数量が 1 つ増加します。
{
"id": "Test201",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"siteId": "1",
"locationId": "11",
"posMachineId": "0001",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
次の例は、dimensionDataSource なしのサンプル本文コンテンツを示しています。 この場合、dimensions は 基準分析コードになります。
dimensionDataSource が設定されている場合、dimensions はデータ ソース分析コードまたは基本分析コードのいずれかになります。
{
"id": "Test202",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
複数の変更イベントの作成
この API は、1 つのイベント API と同じ方法で変更イベントを作成できます。 唯一の違いは、この API で同時に複数のレコードを作成できる点です。 したがって、Path と Body の値は異なります。 この API では、Body は記録の配列を提供します。 レコードの最大数は 512 です。 したがって、手持在庫変更の一括 API では、一度に最大 512 件の変更イベントをサポートできます。
たとえば、小売店舗 POS コンピューターで次の 2 つのトランザクションが処理されたとします:
- 赤い T シャツ 1 枚の返品依頼 1 件
- 黒の T シャツ 3 枚の販売トランザクション 1 件
この場合、1 つの 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,
},
},
},
...
]
次の例は、サンプル本文コンテンツを示しています。
[
{
"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 }
}
}
]
手持在庫数量の設定/上書き
手持在庫数量の設定 API は、指定された製品の現在のデータを上書きします。 通常、この機能は在庫棚卸の更新を実行するために使用されます。 たとえば、ある店舗では、日々の在庫棚卸で、赤い T シャツの実際の手持在庫が 100 枚であることが分かったとします。 したがって、POS の入荷数量は、以前の数量にかかわらず、100 に更新する必要があります。 この API を使用すると、既存の値を上書きできます。
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,
},
...
]
次の例は、サンプル本文コンテンツを示しています。 この API の動作は、この記事の前半の 手持在庫変更のイベントの作成 セクションで説明されている API の動作とは異なります。 このサンプルでは、T シャツ製品の数量が 1 つに設定されます。
[
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 100
}
}
}
]
予約イベントの作成
予約 API を使用するには、予約機能をオンにして、予約の構成を完了する必要があります。 詳細 (データフローおよびサンプル シナリオを含む) については、Inventory Visibility 引当 を参照してください。
1 つの予約イベントの作成
引当は別のデータ ソース設定に対して作成できます。 このタイプの引当を構成するには、最初に dimensionDataSource パラメーターでデータ ソースを指定します。 次に、dimensions パラメーターで、ターゲット データ ソースの分析コード設定に従って分析コードを指定します。
引当 API を呼び出す際に、要求本文のブール値 ifCheckAvailForReserv パラメーターを指定することで、引当の検証を制御できます。
True という値は検証が必要であることを意味するのに対し、False という値は検証が必要ないことを意味します。 既定値は True です。
予約の取り消しや、指定した引当在庫数量を解除する場合は、数量を負の値に設定し、ifCheckAvailForReserv パラメーターを False に設定して検証をスキップします。 また、同様のことを行う専用の取り消し API も用意されています。 この 2 つの API の違いは、呼び方の違いだけです。
reservationId API で を使用すると、特定の予約イベントを取り消すことが簡単にできます。 詳細については、 予約イベントの 1 つを予約しない セクションを参照してください。
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,
}
次の例は、サンプル本文コンテンツを示しています。
{
"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"
}
}
次の例では、正常な応答例を示しています。
{
"reservationId": "RESERVATION_ID",
"id": "ohre~id-822-232959-524",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
複数の予約イベントの作成
この API は、1 つのイベント 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,
},
...
]
予約イベントの取り消し
取り消し API は、取り消し イベントの逆の操作として機能します。
reservationId で指定された予約イベントを取り消したり、予約数量を減らしたりする方法を提供します。
予約イベントの取り消し
予約が作成されると、応答の本文に reservationId が含まれます。 予約をキャンセルするには同じ reservationId を提供し、その予約 API 通話で使った同じ organizationId、productId、dimensions を含める必要があります。 最後に、前回の予約から解放する個数を表す OffsetQty 値を指定します。 予約は、指定された OffsetQty によって、完全または部分的に取り消すことができます。 たとえば、100 個の商品を予約した場合、OffsetQty: 10 を指定すると、最初の予約量の 10 個を予約解除できます。
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
}
次のコードは、本文コンテンツの例を示しています。
{
"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
}
次のコードは、成功した応答分の例を示しています。
{
"reservationId": "RESERVATION_ID",
"totalInvalidOffsetQtyByReservId": 0,
"id": "ohoe~id-823-11744-883",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Note
応答本文では、OffsetQty が予約数量以下の場合、processingStatus には "成功"、totalInvalidOffsetQtyByReservId には 0 が格納されます。
OffsetQty が予約の数量より大きい場合、processingStatus は "partialSuccess"、totalInvalidOffsetQtyByReservId は OffsetQty と予約金額との差となります。
たとえば、予約の数量が 10で、OffsetQty の値が 12 であれば、totalInvalidOffsetQtyByReservId は 2 になります。
複数の予約イベントの取り消し
この API は、1 つのイベント 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
}
...
]
引当データのクリーン アップ
引当データのクリーンアップ API は、過去の引当データをクリーンアップするために使用されます。 本体はデータ ソースのリストである必要があります。 リストが空の場合、すべてのデータ ソースがクリーンアップされます。
Path:
/api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
"iv",
"pos"
]
クリーンアップ ジョブが正常に作成されると、ジョブ ID が応答で返されます。これは、 ジョブの実行の進行状況を取得するために使用できます。
ジョブの実行の進行状況を取得する
ジョブ実行 の進行状況の取得 API を使用して、ジョブの実行の進行状況を取得します。 ジョブを識別するには、ジョブ ID が必要です。
Path:
/api/environment/{environmentId}/getJobProgress
Method:
Get
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Query(Url Parameters):
jobId
URL 所得のサンプルは次のとおりです。
/api/environment/{environmentId}/getJobProgress?jobId=SomeJob:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
手持在庫をクエリする
手持在庫をクエリする API を使用して、製品の手持在庫データを取り込むことができます。 この API は、eコマースの Web サイトで製品の在庫レベルを確認する場合や、地域全体および近くの店舗や倉庫で製品の在庫状況を確認する場合など、在庫を知る必要があるときにいつでも使用できます。 現在、この API は、最大 5000 個の個別アイテムを productID 値で照会することをサポートしています。 各クエリには、複数の siteID と locationID の値を指定することもできます。
データ パーティション ルールが場所別に設定されている場合、上限は次の式で定義されます:
NumOf(SiteID) × NumOf(LocationID) <= 10,000。
転記メソッドを使用したクエリ
post API によるクエリは、2 つのバージョンで利用できます。 次の表に、相違点の概要を示します。
| API バージョン 1.0 | API バージョン 2.0 |
|---|---|
| クエリを実行できる組織 ID は 1 つだけです。 | 複数の組織 ID に対してクエリを実行できます。 |
| サイトと倉庫の最大 10,000 の組み合わせを照会できます。 | 10,000 を超える組織 ID、サイト、およびウェアハウスの組み合わせを照会できます。 複数のページで結果を返すことができます。 |
次のサブセクションでは、各 API バージョンの使用方法を示します。
POST API バージョン 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,
}
この要求の本文では、dimensionDataSource はオプションのパラメーターとなります。 設定をしていない場合、filters が基本分析コードとして扱われます。
returnNegative パラメーターは、結果に負のエントリが含まれるかどうかを制御します。
場所ごとに保存されたデータを照会
このセクションは、データ パーティション ルールが場所別に設定されている場合に適用されます。
-
organizationIdは、正確にひとつの値を含む配列でなければなりません。 -
productIdには 1 つ以上の値が含まれます。 空の配列の場合、システムは特定のサイトおよび場所のすべての製品を返します。 この場合、siteIdとlocationIdは空にできません。 -
siteIdとlocationIdはパーティションに使用されます。siteId要求では、複数のlocationIdと の値を指定できます。 両方の配列が空の場合、システムは指定された製品のすべてのサイトと場所を返します。 この場合、productIdは空にできません。
インデックス設定と一致する方法で groupByValues パラメーターを使用することをお勧めします。 詳しくは、 手動インデックスの構成に関するページをご覧ください。
製品 ID ごとに保存されたデータを照会
このセクションは、データ パーティション ルールが製品 ID 別に設定されている場合に適用されます。 この場合、次の 2 つの filters フィールドが必要です: organizationId、productId。
-
organizationIdは、正確にひとつの値を含む配列でなければなりません。 -
productIdは、少なくともひとつの値を持つ配列でなければなりません。
ロケーション別にデータを保存する場合とは異なり、siteId と locationId に値を指定しない場合、各製品 ID の在庫情報は、すべてのサイトまたは場所に集約されます。
Note
手持在庫変更スケジュールおよび納期回答可能在庫 (ATP) 機能を有効にした場合は、クエリ結果に ATP 情報を含めるかどうかを制御する QueryATP ブール値パラメーターをクエリに含めることもできます。 詳細と例については、Inventory Visibility の手持変更スケジュールと納期回答可能在庫 を参照してください。
次の例は、サンプル本文コンテンツを示しています。 複数の場所 (倉庫) から手持在庫を照会できることが示されています。
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["usmf"],
"productId": ["T-shirt"],
"siteId": ["1"],
"locationId": ["11","12","13"],
"colorId": ["red"]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
次の例では、特定のサイトおよび場所にあるすべての製品をクエリする方法を示します。
{
"filters": {
"organizationId": ["usmf"],
"productId": [],
"siteId": ["1"],
"locationId": ["11"],
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
POST API バージョン 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
API バージョン 2.0 の要求形式はバージョン 1.0 と似ていますが、 pageNumber と pageSize の 2 つの省略可能なパラメーターもサポートされています。これにより、システムは単一の大きな結果を複数の小さなドキュメントに分割できます。 結果は倉庫 (locationId) で並べ替えられます。パラメーターは、結果をページに分割するために次のように使用されます。
-
pageSizeは、各ページで返される倉庫の数 (locationId値) を確立します。 -
pageNumberは、返されるページ番号を確立します。
この形式の要求は、倉庫番号 ({pageNumber} - 1) × {pageSize} から始まる手持在庫データを返し、次の {pageSize} 倉庫のデータを含みます。
API バージョン 2.0 は、次の構造を使用するドキュメントで応答します。
{
Value: { # Response same as Api-Version=1.0 }
nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}
要求が最後のウェアハウス (locationId) に達すると、 nextLink 値は空の文字列になります。
API バージョン 2.0 では、要求に複数の組織 ID を指定することもできます。 これを行うには、要求ドキュメントの organizationId フィルターに、組織 ID のコンマ区切りの一覧を含めます。 たとえば、「 "organizationId": ["org1", "org2", "org3"] 」のように入力します。
取得メソッドを使用したクエリ
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]
URL 所得のサンプルは次のとおりです。 この取得要求は、以前に提供された転記サンプルとまったく同じです。
/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
システムでは、GET メソッドを使用した複数の組織 ID に対するインベントリのクエリはサポートされていません。
手持在庫の正確なクエリ
手持在庫の正確なクエリは通常の手持在庫クエリに似てますが、サイトと場所の間でマッピング階層を指定できます。 たとえば、次の 2 つのサイトがあるとします:
- サイト 1、場所 A にマッピング
- サイト 2、場所 B にマッピング
通常の手持在庫クエリの場合、"siteId": ["1","2"] および "locationId": ["A","B"] を指定すると、Inventory Visibility は次のサイトと場所の結果を自動的にクエリします。
- サイト 1、場所 A
- サイト 1、場所 B
- サイト 2、場所 A
- サイト 2、場所 B
このように、通常の手持在庫クエリでは、場所 A がサイト 1 にのみ存在し、場所 B がサイト 2 にのみ存在することを認識しません。 そのため、冗長なクエリになります。 この階層マッピングに対応するするために、手持在庫の正確なクエリを使用し、クエリ本文で場所のマッピングを指定できます。 この場合、サイト 1、場所 A と、サイト 2、場所 B に対してのみクエリして、結果を受け取ります。
post メソッドを使用した厳密なオンハンドクエリ
post API による手元の正確なクエリは、2 つのバージョンで利用できます。 次の表に、相違点の概要を示します。
| API バージョン 1.0 | API バージョン 2.0 |
|---|---|
| クエリを実行できる組織 ID は 1 つだけです。 | 複数の組織 ID に対してクエリを実行できます。 |
POST API バージョン 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,
}
この要求の本文では、dimensionDataSource はオプションのパラメーターとなります。 設定をしていない場合、dimensions の filters が 基本分析コード として扱われます。
filters には organizationId、productId、dimensions、valuesの 4 つの必須フィールドがあります。
-
organizationIdには 1 つの値だけが含まれる必要がありますが、それはまだ配列になっています。 -
productIdには 1 つ以上の値が含まれます。 空の配列であれば、すべての製品が返されます。 -
dimensions配列のsiteIdとlocationIdは、データ パーティション ルールが 場所ごと に設定されている場合にのみ必要です。 この場合、他の要素とともにどのような順番で登場してもかまいません。 -
valuesには、dimensionsに対応する値の 1 つ以上の異なる組み合を含めることができます。
dimensionsのfiltersは自動的にgroupByValuesに追加されます。
returnNegative パラメーターは、結果に負のエントリが含まれるかどうかを制御します。
次の例は、サンプル本文コンテンツを示しています。
{
"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
}
次の例では、複数のサイトと場所にあるすべての製品をクエリする方法を示します。
{
"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
}
手元のPOST API バージョン 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 バージョン 2.0 は、次の点でバージョン 1.0 と異なります。
-
filtersセクションに、keysフィールドではなくdimensionsフィールドが追加されました。keysフィールドはバージョン 1.0 のdimensionsフィールドと同様に機能しますが、organizationIdを含めることもできます。 キーは任意の順序で指定できます。 -
filtersセクションでは、organizationIdフィールドはサポートされなくなりました。 代わりに、organizationIdフィールド (たとえば、keys) にディメンション間でkeys: ["organizationId", "siteId", "locationId"]を含め、valuesフィールドの一致する位置 (たとえば、values: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]) で組織 ID 値を定義できます。
その他のフィールドは、API バージョン 1.0 と同じです。
商品検索によるクエリ
次の手持ちクエリ API は、製品検索をサポートするために拡張されました。
Note
製品検索を使用する在庫可視化クエリを投稿する場合は、productSearch リクエスト パラメーター (ProductAttributeQuery オブジェクトを含む) を使用して、製品 ID で検索またはフィルターを行います。 新しい API では、リクエスト ボディ内の古い productid リクエスト パラメーターはサポートされなくなりました。
前提条件
商品検索 API の使用を開始する前に、システムが以下の要件を満たしている必要があります:
- Dynamics 365 Supply Chain Management 10.0.36 またはそれ以降を実行している必要があります。
- 在庫可視化のバージョン 1.2.2.54 以降をインストールし、在庫可視化のインストールとセットアップ の説明に従ってセットアップする必要があります。
- 在庫可視化検索サービスをインストールし、在庫可視化の製品検索のセットアップ の説明に従ってセットアップする必要があります。
製品検索コントラクト
製品検索コントラクトは、製品検索 API と通信するためのルールを定義します。 これは、製品検索機能の機能と動作を記述する標準化された方法を提供します。 したがって、ユーザーは、在庫可視化 API を使用するアプリケーションをより簡単に理解し、操作し、構築することができます。
次の例は、サンプル コントラクトを示しています。
{
"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"
}
]
}
]
},
}
次の表は、契約で使用されるフィールドについて説明したものです。
| フィールド ID | Description |
|---|---|
logicalOperator |
有効な値は And および Or です。 このフィールドを使用して、複数の条件、または条件とサブフィルターを接続します。
subFilters は productFilter、または attributeFilter オブジェクトであることに留意してください。 したがって、subFilters 内に subFilters を持つことができます。 |
conditionOperator |
可能な値は、IsExactly、IsNot、Contains、DoesNotContain、BeginsWith、IsOneOf、GreaterEqual、LessEqual、Between です。 |
ProductFilter |
このフィールドを使用して、製品関連情報で製品をフィルタリングします。 たとえば、契約内の productName をビジネス ニーズに合わせて、 Company、 itemNumber、 productSearchName、 productType、 productName、 productDescription、 inventoryUnitSymbol、 salesUnitSymbol、 purchaseUnitSymbol に変更できます。 |
AttributeFilter |
このフィールドを使用して、属性関連情報で製品をフィルタリングします。 |
attributeArea |
ProductAttribute、DimensionAttribute、BatchAttribute のいずれかが指定されます。 |
商品検索によるクエリ
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,
}
次の例は、サンプル本文コンテンツを示しています。
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"returnNegative": true,
"filters":
{
"organizationId": ["usmf"],
"siteId": ["1"],
"locationId": ["13"],
},
"groupByValues": ["colorid"],
}
次の例では、正常な応答例を示しています。
[
{
"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
}
}
}
]
製品検索で正確なクエリ
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,
}
次の例は、サンプル本文コンテンツを示しています。
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"filters": {
"organizationId": ["usmf"],
"dimensions": ["siteId", "locationId", "colorid"],
"values" : [
["1", "13", "Black"],
]
},
"groupByValues": [],
"returnNegative": true
}
次の例では、正常な応答例を示しています。
[
{
"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
}
}
}
]
納期回答可能在庫
Inventory Visibility を設定すると、今後の手持在庫変更をスケジュールし、ATP 数量を計算できます。 ATP は、使用可能な品目の数量で、次の期間に顧客に約束できます。 ATP 計算を使用すると、注文のフルフィルメント機能を大幅に強化できます。 この機能を有効にする方法、および機能が有効化された後に API で Inventory Visibility と対話する方法については、Inventory Visibility の手持変更スケジュールと納期回答可能在庫 を参照してください。
割り当て
配賦関連 API は、Inventory Visibility の配賦 に配置されます。