Commerce Data Exchange の拡張 - リアルタイム サービス
この記事では、RetailTransactionServiceEx クラスに拡張メソッドを追加して、Commerce Data Exchange (CDX) - リアルタイム サービスを拡張する方法について説明します。 リアルタイム サービスは、クライアントがリアルタイムでコマース機能を操作できるようします。 Retail サーバーから Finance and Operation データベースとクラスに直接アクセスすることはできません。 財務と運用および Commerce Runtime 拡張機能を使用する CDX クラスの拡張機能を介してアクセスする必要があります。
Commerce Data Exchange - リアルタイム サービスを拡張するには、RetailTransactionServiceEx クラスで新しいメソッドを作成します。 このメソッドは、次の基準を満たしている必要があります。
- このメソッドは、パブリック静的メソッドでなければなりません。
- 戻り値は、長さが 2 以上のコンテナーである必要があります。 最初の要素は、メソッド呼び出しが成功したかどうかを示すブール値と、コメントまたはエラー メッセージに使用できる文字列値でなければなりません。 コンテナー内の他の項目は任意の型になることができ、入れ子になったコンテナーにもなれます。
- メソッドのパラメーターは、次のプリミティブ型のいずれかでなければなりません:
- ブール型
- 日付
- int
- int64
- str
- guid
- 実績
新しい拡張メソッドの作成と呼び出し
Microsoft Visual Studio を起動します。
Dynamics 365 メニューで、モデル管理 > モデルの作成をクリックします。
モデルの作成ダイアログ ボックスに、次の詳細を入力します。
- モデル名 - Contoso
- モデル発行元 - Contoso
- レイヤー - USR (関連するレイヤーを選択)
- バージョン - 1.0.0.0
- モデルの表示名 - Contoso
次へ を選択します。
ダイアログ ボックスで 新しいパッケージの作成 > 次へ を選択し、参照パッケージを選択 を選択して、一覧で アプリケーション スイート と アプリケーション プラットフォーム のチェック ボックスをオンにします。
次へ を選択します。
完了 を選択します。
新しいプロジェクト ダイアログ ボックスに、ContosoRetailTransactionServiceEx というプロジェクト名を入力します。
OKを選択します。
プロジェクトを右クリックし、追加 > 新しい項目 を選択します。 新しい項目の追加 ウィンドウで、クラス を選択し、ContosoRetailTransactionServiceSample としてクラスの名前を入力します。
Commerce Runtime (CRT) で CDX メソッドを使用するには、ExtensionOf(classStr(RetailTransactionServiceEx) など、ExtensionOf 属性をクラスに追加する必要があります。 この追加は、RetailTransactionServiceEx からクラスが拡張されることを意味しています。
コード エディターで、次のコードを追加します。
[ExtensionOf(classStr(RetailTransactionServiceEx))] final class ContosoRetailTransactionServiceSample { }
クラス内部で、カスタム ロジックを実行する新しいメソッドを追加します。 このメソッドを CRT から呼び出して、カスタム ロジックを実行します。
[ExtensionOf(classStr(RetailTransactionServiceEx))] final class ContosoRetailTransactionServiceSample_Extension { public static container SerialCheck(str _serialNum) { boolean success = false; str errorMessage; int fromLine; try { if (_serialNum) { ttsbegin; // check whether the serial number exists // Add your custom logic errorMessage = "Serial number found"; ttscommit; } else { // Add your custom logic success = false; errorMessage = "Serial number not found"; } } catch (Exception::Error) { ttsAbort; errorMessage = RetailTransactionServiceUtilities::getInfologMessages(fromLine); } // Return sanitized error code. errorMessage = RetailTransactionServiceUtilities::getErrorCode(errorMessage); return [success, errorMessage, "Custom values"]; } }
ソリューション エクスプローラーで、プロジェクトを右クリックしてからビルドをクリックします。
新しい拡張メソッドを作成した後は、プロジェクトが展開されます。
CRT から新しいメソッドを呼び出す
Commerce runtime (CRT) 拡張機能に、Microsoft.Dynamics.Commerce.Runtime.RealtimeServices.Messages の nuget パッケージがまだ追加されていない場合は、それを含めます。
新しいメソッドを呼び出すには、次のサンプル コードを使用します。
InvokeExtensionMethodRealtimeRequest extensionRequest = new InvokeExtensionMethodRealtimeRequest("SerialCheck", "123"); InvokeExtensionMethodRealtimeResponse response = await request.RequestContext.ExecuteAsync<InvokeExtensionMethodRealtimeResponse> (extensionRequest).ConfigureAwait(false); ReadOnlyCollection<object> results = response.Result; string resValue = (string)results[0];
results オブジェクトからは、リアルタイム サービスからの応答値を読み取ることができます。
CRT フレームワーク コードは、成功/失敗の状態を確認し、CDX メソッドから返された値に基づいてエラー メッセージを提供します。 必要に応じて、拡張機能コードでこれをキャッチし、より多くのロジックを提供することができます。
メモ
InvokeExtensionMethodRealtimeRequest メソッドは 2 つのパラメーターを取ります。 1 つのパラメ ーターはリアルタイム サービス メソッド名であり、その他はパラメータの一覧を使用する必要があります。 渡されるメソッド名は、ContosoRetailTransactionServiceSample クラスで作成したメソッド名と同じにする必要があります。
public InvokeExtensionMethodRealtimeRequest(string methodName, params object[] parameters)
: base(methodName, parameters)
{
}
CDX オフライン
HQ に接続されていない場合、クライアント/Retail Server は CDX メソッドを呼び出すことができません。 この場合、拡張機能コードは次のベスト プラクティスに従う必要があります。
- CDX メソッドを呼び出す前に、CRT がオンライン (Retail Server) データベースまたはオフライン (ローカル) データベースに接続されているかどうかを確認します。 この操作は、POS および CRT から行うことができ ます。
接続ステータスを確認する方法
POS
GetConnectionStatusClientRequest POS API を使用します。
CRT
if(request.RequestContext.Runtime.Configuration.IsMasterDatabaseConnectionString)
{ }
- CDX メソッドへの接続に失敗した場合には、HQ に接続していない場合は操作を実行できない、または CDX メソッドに接続されていない状態でこの操作をする場合には軽減ロジックを実行する必要がある、というエラー メッセージが表示されることがあります。