次の方法で共有


在庫可視化の公開 API

注記

Azure Active Directory は Microsoft Entra ID になりました。 詳細はこちら

この記事では、Inventory Visibility によって提供されるパブリック API について説明します。

Inventory Visibility アドインのパブリック REST API は、特定の統合エンドポイントを複数提供します。 次の 4 つの主要な相互作用タイプをサポートします。

  • 外部システムから、手持在庫の変更をアドインに転記する
  • 外部システムから、アドインの手持在庫数量を設定または上書きする
  • 外部システムから、予約イベントをアドインに転記する
  • 外部システムから現在の手持在庫数量を問い合わせる

次のテーブルに、現在使用可能な API を示します。

パス 方法 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}/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 投稿 製品検索で正確なクエリを投稿

注記

パスの {environmentId} 部分は Microsoft Dynamics Lifecycle Services の環境 ID です。

バルク API では、要求ごとに最大 512 件のレコードを返します。

認証

プラットフォーム セキュリティ トークンは、Inventory Visibility パブリック API を呼び出すために使用されます。 したがって、 Microsoft Entra アプリケーションを使用して Microsoft Entra トークン を生成する必要があります。 その後、この Microsoft Entra トークンを使用して、セキュリティ サービスからアクセス トークンを取得する必要があります。

セキュリティ サービス トークンを取得するには、次の手順を行います。

  1. Azure ポータルにサインインし、このサインインを使用して Dynamics 365 Supply Chain Management アプリの clientIdclientSecret の値を検索します。

  2. 次のプロパティを持つ HTTP 要求を送信することにより、Microsoft Entra トークン (aadToken) を取り込みます。

    • URL:https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/token

    • メソッド:GET

    • 本文の内容 (フォーム データ):

      キー 先頭値
      クライアント ID ${aadAppId}
      クライアント シークレット ${aadAppSecret}
      付与タイプ client_credentials
      scope 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.default

    応答で Microsoft Entra トークン (aadToken) を取得する必要があります。 これは次の例に類似しているはずです。

    {
        "token_type": "Bearer",
        "expires_in": "3599",
        "ext_expires_in": "3599",
        "access_token": "eyJ0eX...8WQ"
    }
    
  3. 次の例に似た 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": "{$LCS_environment_id}",
        "context_type": "finops-env"
    }
    

    次のポイントに注意します。

    • client_assertion 値は、前の手順で受け取った Microsoft Entra トークン (aadToken) である必要があります。
    • この context 値は、アドインを配置する Lifecycle Services 環境 ID である必要があります。
    • 例に示すように、他のすべての値を設定します。
  4. 次のプロパティを持つ HTTP 要求を送信することにより、アクセス トークン (access_token) を取得します。

    • URL:https://securityservice.operations365.dynamics.com/token
    • メソッド:POST
    • HTT Pヘッダー: API バージョンを含めます。 (キーは Api-Version で、値は 1.0 です。)
    • 本文の内容: 前の手順で作成した JSON 要求を含めます。

    応答でアクセス トークン (access_token) を取得する必要があります。 Inventory Visibility API を呼び出すためのベアラー トークンとしてこのトークンを使用する必要があります。 次に例を示します。

    {
        "access_token": "{Returned_Token}",
        "token_type": "bearer",
        "expires_in": 3600
    }
    

紙幣

https://securityservice.operations365.dynamics.com/token URL はセキュリティ サービスの一般的な URL です。 URL を呼び出す場合、最初の応答は、応答ヘッダーのステータス コード 307 を含む http リダイレクト応答と、セキュリティ サービスのターゲット URL を含むキー "場所" を持つエントリです。 URL の形式は次のとおりです: https://gw.{$geo}-il101.gateway.prod.island.powerapps.com/securityservice/token。 たとえば、使用している環境が US geo にある場合、URL は、 https://gw.us-il101.gateway.prod.island.powerapps.com/securityservice/token になります。 307 応答ステータス コードが受け入れられない場合は、FinOps 環境の場所に応じて手動で実際の URL を作成できます。 最も簡単な方法は、ブラウザーで https://gw.as-il101.gateway.prod.island.powerapps.com/securityservice/token を開き、アドレス バーのアドレスをコピーすることです。

手持在庫変更のイベントの作成

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 から取得されたか、または外部システムから取得されたかどうかを示したりすることもできます。

注意

データのパーティション ルール製品 ID ごと に設定されている場合は、siteIdlocationId はオプションの分析コードです。 それ以外は必要な分析コードです。 このルールは配賦、ソフト リザーブ、変更スケジュール 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 で同時に複数のレコードを作成できる点です。 したがって、PathBody の値は異なります。 この 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 の違いは、呼び方の違いだけです。 予約取り消し API で reservationId を使用すると、特定の予約イベントを取り消すことが簡単にできます。 詳細については、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 通話で使った同じ organizationIdproductIddimensions を含める必要があります。 最後に、前回の予約から解放する個数を表す 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
}

メモ

応答本文では、OffsetQty が予約数量以下の場合、processingStatus には "成功"、totalInvalidOffsetQtyByReservId には 0 が格納されます。

OffsetQty が予約の数量より大きい場合、processingStatus は "partialSuccess"、totalInvalidOffsetQtyByReservIdOffsetQty と予約金額との差となります。

たとえば、予約の数量が 10で、OffsetQty の値が 12 であれば、totalInvalidOffsetQtyByReservId2 になります。

複数の予約イベントの取り消し

この 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"
    ]

手持在庫をクエリする

手持在庫をクエリする API を使用して、製品の手持在庫データを取り込むことができます。 この API は、eコマースの Web サイトで製品の在庫レベルを確認する場合や、地域全体および近くの店舗や倉庫で製品の在庫状況を確認する場合など、在庫を知る必要があるときにいつでも使用できます。 現在、この API は、最大 5000 個の個別アイテムを productID 値で照会することをサポートしています。 各クエリには、複数の siteIDlocationID の値を指定することもできます。 データ パーティション ルール場所別に設定されている場合、上限は次の式で定義されます:

NumOf (SiteID) × NumOf(LocationID) <= 10,000

転記メソッドを使用したクエリ

転記APIによるクエリは2つのバージョンで使用できます。 次の表に、違いを示します。

APIバージョン1.0 APIバージョン2.0
クエリできる組織IDは1つのみです。 複数の組織IDを照会できます。
サイトと倉庫の最大10,000の組み合わせを照会できます。 組織ID、サイト、および倉庫の10,000以上の組み合わせを照会できます。 結果は複数のページで返される場合があります。

次のサブセクションでは、各APIバージョンの使い方を示します。

転記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,
    }

この要求の本文では、dimensionDataSource はオプションのパラメーターとなります。 設定をしていない場合、filters基本分析コードとして扱われます。

returnNegative パラメーターは、結果に負のエントリが含まれるかどうかを制御します。

場所ごとに保存されたデータを照会

このセクションは、データ パーティション ルール場所別に設定されている場合に適用されます。

  • organizationId は、正確にひとつの値を含む配列でなければなりません。
  • productId には 1 つ以上の値が含まれます。 空の配列の場合、システムは特定のサイトおよび場所のすべての製品を返します。 この場合、siteIdlocationId は空にできません。
  • siteIdlocationId はパーティションに使用されます。 手持在庫をクエリする 要求では、複数の siteIdlocationId の値を指定できます。 両方の配列が空の場合、システムは指定された製品のすべてのサイトと場所を返します。 この場合、productId は空にできません。

インデックス設定と一致する方法で groupByValues パラメーターを使用することをお勧めします。 詳細については、手持インデックス構成を参照してください。

製品 ID ごとに保存されたデータを照会

このセクションは、データ パーティション ルール製品 ID 別に設定されている場合に適用されます。 この場合、次の 2 つの filters フィールドが必要です: organizationIdproductId

  • organizationId は、正確にひとつの値を含む配列でなければなりません。
  • productId は、少なくともひとつの値を持つ配列でなければなりません。

ロケーション別にデータを保存する場合とは異なり、siteIdlocationId に値を指定しない場合、各製品 ID の在庫情報は、すべてのサイトまたは場所に集約されます。

注意

手持在庫変更スケジュールおよび納期回答可能在庫 (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
}

転記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

API Version 2.0の要求形式はバージョン1.0 pageNumberpageSize と似ていますが、オプションの2つのパラメータもサポートしています。また、システムは1つの大きな結果を複数の小さいドキュメントに分割できます。 結果は倉庫別に並べ替えされ、locationIdパラメータは次のようにして結果をページに分割するために使用されます。

  • pageSize では、各ページで返される倉庫 (locationId 値) の数が設定されます。
  • pageNumber では、返されるページ番号が設定されます。

この形式の要求では、倉庫 番号 ({pageNumber} - 1) {pageSize} から始まる×データが返されます。次の倉庫のデータも {pageSize} 含まれます。

API Version 2.0では、次の構造を使用するドキュメントが応答します。

{
    Value: { # Response same as Api-Version=1.0 }
    nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}

要求が最後の倉庫 () に到達すると、locationId値は nextLink 空の文字列になります。

API Version 2.0では、要求に複数の組織IDを指定することもできます。 適用する場合は、組織IDのコンマ区切りリストを要求ドキュメントのフィルタ organizationId に含める必要があります。 たとえば、. "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 に対してのみクエリして、結果を受け取ります。

転記方法を使用した正確なクエリの入力

転記APIによる実際のクエリは2つのバージョンで使用できます。 次の表に、違いを示します。

APIバージョン1.0 APIバージョン2.0
クエリできる組織IDは1つのみです。 複数の組織IDを照会できます。

転記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 はオプションのパラメーターとなります。 設定をしていない場合、filtersdimensions基本分析コード として扱われます。 filters には organizationIdproductIddimensionsvaluesの 4 つの必須フィールドがあります。

  • organizationId には 1 つの値だけが含まれる必要がありますが、それはまだ配列になっています。
  • productId には 1 つ以上の値が含まれます。 空の配列であれば、すべての製品が返されます。
  • dimensions 配列の siteIdlocationId は、データ パーティション ルール場所ごと に設定されている場合にのみ必要です。 この場合、他の要素とともにどのような順番で登場してもかまいません。
  • valuesには、dimensionsに対応する値の 1 つ以上の異なる組み合を含めることができます。

filtersdimensionsは自動的に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
}

転記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 Version 2.0は、次の方法でバージョン1.0と異なります。

  • セクション filters には、フィールドではなく keys フィールドが追加 dimensions されます。 この keys フィールドはバージョン dimensions 1.0のフィールドと同様に動作しますが、このフィールドを含めすることもできます organizationId。 キーは任意の順序で指定できます。
  • セクション filters では、このフィールドはサポートされ organizationId なくなりました。 代わりに、フィールド organizationIdkeys の分析コードの中に含め ( keys: ["organizationId", "siteId", "locationId"]たとえば)、フィールドの一致する位置に組織ID values の値を定義することができます values: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]

他のフィールドはAPIバージョン1.0と同じです。

商品検索によるクエリ

次の手持ちクエリ API は、製品検索をサポートするために拡張されました。

ノート

製品検索を使用する在庫可視化クエリを投稿する場合は、productSearch リクエスト パラメーター (ProductAttributeQuery オブジェクトを含む) を使用して、製品 ID で検索またはフィルターを行います。 新しい API では、リクエスト ボディ内の古い productid リクエスト パラメーターはサポートされなくなりました。

前提条件

商品検索 API の使用を開始する前に、システムが以下の要件を満たしている必要があります:

製品検索コントラクト

製品検索コントラクトは、製品検索 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 のいずれかが指定されます。 このフィールドを使用して、複数の条件、または条件とサブフィルターを接続します。 subFiltersproductFilter、または attributeFilter オブジェクトであることに留意してください。 したがって、subFilters 内に subFilters を持つことができます。
conditionOperator 可能な値は、IsExactlyIsNotContainsDoesNotContainBeginsWithIsOneOfGreaterEqualLessEqualBetween です。
ProductFilter このフィールドを使用して、製品関連情報で製品をフィルタリングします。 たとえば、契約内の productName をビジネス ニーズに合わせて、 CompanyitemNumberproductSearchNameproductTypeproductNameproductDescriptioninventoryUnitSymbolsalesUnitSymbolpurchaseUnitSymbol に変更できます。
AttributeFilter このフィールドを使用して、属性関連情報で製品をフィルタリングします。
attributeArea ProductAttributeDimensionAttributeBatchAttribute のいずれかが指定されます。
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 の配賦 に配置されます。