このチュートリアルでは、Visual Studio のツールを使用して、Fleet Management アプリケーションのコードを分析およびデバッグする方法について説明します。 ブレークポイントの設定、コードの変更、結果のビルドを行う単純な開発者シナリオについて説明します。
前提条件
コードおよび Visual Studio の以前の経験は、このチュートリアルを完全に活用するのに役立ちます。 このチュートリアルでは、リモート デスクトップを使用して環境にアクセスし、インスタンスの管理者としてプロビジョニングする必要があります。
主な概念
- Visual Studio のデバッガーを使用して、プロジェクトのコードを分析およびデバッグします。
- 実行中のアプリケーションを調べると、Visual Studio デバッガーの標準機能を使用できます。 これらの機能には、変数の値の変更、ブレークポイントの設定などがあります。
- IntelliSense および Visual Studio の他の機能は、効率的なコード編集および理解に不可欠です。
- 開発は反復的なプロセスです。 コードに変更を加えた後、プロジェクトをビルドし、変更をテストします。
Scenario
顧客が有効期限を過ぎたクレジットカードを使用して車を借りるとき、レンタル会社は不幸な出来事を経験します。 開発者は、この状況の阻止を支援するために、アプリケーションを修正する責任を負います。 問題を特定するには、Visual Studio でデバッガーを使用します。 問題を特定したら、いくつかのコードを編集して修正プログラムを実装します。 最後に、プロジェクトをビルドし、修正が成功したことを検証します。
ブレークポイントまで実行
デスクトップで、Visual Studio ショートカットをダブルクリックして、開発環境を開きます。
FleetManagement ソリューションを開きます。 ファイルメニューで、開くをポイントし、プロジェクト/ソリューションをクリックします。
デスクトップを参照し、次に FleetManagement フォルダーを開きます。 ソリューション ファイルがコンピュータにない場合、この作成手順は、フリート管理サンプル アプリケーションのエンドツーエンド シナリオ. に記載されています。
FleetManagement という名前のファイルを選択します。 表示されるファイル タイプは SLN ファイルです。
[開く] をクリックします。 ソリューションの読み込みには時間がかかる場合があります。
FleetManagement プロジェクトをスタートアップ プロジェクトにします。 ソリューション エクスプローラー で、フリート管理 プロジェクトを右クリックして、コンテキスト メニューで スタートアップ プロジェクトとして設定 を選択します。
ソリューション エクスプローラー で、フリート管理 プロジェクトをダブルクリックして内容を表示します。
車両管理システムプロジェクトのクラスフォルダをダブルクリックします。 FMRentalCheckoutProcessor クラスを検索します。 このクラスを右クリックしてから、開く をクリックします。 または、ソリューション エクスプローラー ウィンドウの上部にあるソリューション エクスプローラーの検索バーを使用できます。 検索バーに名前を入力すると、ソリューション エクスプローラーで選択された対応する成果物が表示されます。 クラスで X++ コードを表示できるようになりました。 このクラスには FinalizeRentalCheckout という名前のメソッドがあります。
最初のコメントの次の行にあるこのメソッドにブレークポイントを配置します。 これを行うには、デバッガで実行を一時停止するコード行の左側の余白をクリックします。 また、コード行の任意の場所をクリックして、F9 を押すことができます。 次の図はブレークポイントを示しています。ブレークポイントは余白に赤で塗りつぶされた円として表示されます。
FinalizeRentalCheckout メソッドは、レンタル トランザクションが保存されるときに呼び出されます。 このメソッドは、RentalTransactionAboutTobeFinalizedEvent という名前のデリゲートを呼び出します。 このデリゲートで呼び出される、イベント ハンドラー メソッドを実装することができます。 デリゲートを呼び出すメソッドは、RentalConfirmation という名前のパラメーターを渡します。このパラメーターには、レンタルを許可するかブロックするかを示す値が含まれています。 レンタルが許可されている場合、値に true が含まれ、ブロックされている場合は、値に false が含まれます。 イベント ハンドラーは、開発者がコード内で実装するために選択するテストに基づいてこの値を変更できます。 この場合は、クレジット カードの有効期限をテストするようにコードを変更します。
F5 を押してアプリケーションをデバッグのために起動するか、デバッグ メニューで デバッグ開始 をクリックします。 これらの方法のいずれかでアプリケーションを開始することが重要です。 そうしないと、Visual Studio デバッガーが起動しないため、設定したブレークポイントにヒットすることはありません。 注記: デバッガーは、コードの位置をソースの位置に関連付ける必要があります。 アセンブリおよび net モジュールに沿って生成された PDB ファイルの消費を通じて実行されます。 デバッガーは、グローバル ツール設定の設定で説明されているように、PDB ファイルからシンボルを読み込みます。 読み込むシンボルを制御する設定を含むオプション ページを開くには、ツール メニューで オプション を選択します。 Microsoft Dynamics 365 Finance グループで、デバッグ ページを選択します。 このオプションを選択すると、現在のソリューションの成果物に関連する PDB ファイルからのみシンボルが読み込まれます。 この選択により、起動時間が大幅に短縮されるため、このラボ用に選択されていることを確認してください。 このオプションを選択すると、現在のソリューションの外部にあるエンティティのソース コードを表示できないことに注意してください。 しばらくすると、ブラウザーが起動し、プロジェクトで選択したスタートアップ オブジェクトが表示されます。
[ Current Rentals]\(現在のレンタル\ ) ページが開きます。
- アクション ウィンドウで、編集 をクリックします。
- ページが表示されたら、表示/非表示 リストで リストの表示 をクリックします (または Ctrl+F8 を押します)。
既存のレンタルに変更を加えます。 たとえば、編集をクリックして、レンタル期間が開始した時刻を変更します。
レンタル レコードを強制的に検証するには、保存をクリックします。 ブレークポイントを配置するメソッドが呼び出されます。 実行は、ブレークポイントを含むコード行で一時停止します。
アプリケーションがブレークポイントで一時停止している間に、アプリケーションの状態を調べることができます。 Visual Studio で開発されたすべてのアプリケーションで通常使用するのと同じ手法を使用します。 たとえば、ツールヒントでその値を表示する変数またはパラメーターにカーソルを置きます。
Visual Studio の他のデバッグ ツールも利用することができます。 たとえば、[ ローカル] ウィンドウには、実行が停止した場所のすべてのローカル変数が表示されます。 Visual Studio の下部にある ローカル タブをクリックし、fmrentalrecord 変数を展開します。 レコードの内部状態が表示され、レコード内のすべてのフィールドの値が表示されます。
fmrentalrecord 変数の車両プロパティの値に注目してください。 このプロパティは、FMRental テーブルの外部キー フィールドです。 デバッガーを使用すると、FMVehicle テーブルの関連するレコードを確認できます。 AutoIdentification フィールド グループに属する値を示します。
[ ブレークポイント ] ウィンドウには、設定したすべてのブレークポイントが一覧表示されます。 ブレークポイント タブをクリックし、コンテンツを表示します。
F10 キーを数回押してコードを 1 行ずつ実行し、デバッガー機能の完全な補完を使用します。 ローカル ウィンドウが、実行される各ステートメントですぐに変数の値を更新することに注意します。
ツール バーで、続行をクリックするか、F5 を押します。
Microsoft Edge を閉じ、Fleet Management アプリケーションを閉じます。 Visual Studio はデバッグ モードを終了します。 代替はデバッグの停止をデバッグメニューから選択します。 この選択により、Microsoft Edge が開いたままになるため、次のデバッグ セッションの開始時間が短縮されます。
検証コードの追加
FinalizeRentalCheckout メソッドで、開発者が、レンタルの有効性を決定するデリゲートを呼び出すコードを追加したことを確認しました。 有効期限切れのクレジット カードの問題を解決するには、クレジット カードの有効期限が切れていないことを確認するイベント ハンドラーを追加します。 ラボを簡略化するには、デリゲートを含む同じファイルにハンドラーを追加します。 インスピレーションとして、次のコードを使用します。 コードをコピーして貼り付けるのではなく、手動で入力して IntelliSense 機能の動作を参照してください。 これらの機能により、Visual Studio ユーザーは高い生産性を期待することができます。
[SubscribesTo(classstr(FMRentalCheckoutProcessor),
delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(FMRental rentalrecord, Struct rentalConfirmation)
{
FMPaymentInformation paymentInfo;
date ccExpiryDate, lastDayOfExpiryMonth;
str s;
select firstonly * from paymentInfo where paymentinfo.RecId == rentalRecord.PaymentInformationId;
if (paymentInfo)
{
// Check if the payment info is valid
// For now, we will check if the credit card is expired
// Credit cards expire on the last day of the month indicated
ccExpiryDate = mkdate(1, str2int(paymentInfo.ExpirationMonth), paymentInfo.ExpirationYear);
lastDayOfExpiryMonth = endmth(ccExpiryDate);
if (lastDayOfExpiryMonth < today())
{
rentalConfirmation.value('OktoRent', false);
s = "Credit card validation failed for rental ";
}
else
{
s = "Credit card validation succeeded for rental ";
}
info (s + rentalrecord.RentalId);
}
else
{
rentalConfirmation.value('OktoRent', false);
info ("No Credit card available for " + rentalrecord.RentalId);
}
}
上記のコードはわかりやすいです。 次に示すように、 SubscribesTo 属性を使用して、メソッドを関連するデリゲートのハンドラーとしてマークします。 コードでは、顧客レコードが取得されてから、クレジット カードの日付が今日の日付と比較されます。 クレジット カードの有効期限が過ぎている場合は、RentalConfirmation 構造でイベント ハンドラーの値を設定し、顧客が車両の貸し出しの対象ではないことを通知します。 これは、任意の数のハンドラーがデリゲートにサブスクライブできるようにするためです。 ハンドラーがレンタルを続行してはならないと判断した場合、 OkToRent フラグを false に設定します。 OkToRent フラグが既に false に設定されていると判断された場合、優れた実装では分析を行わない場合があります。
FMRentalCheckoutProcessor.xpp ファイルで作業していることを確認します。 新しいイベント ハンドラー定義を FMRentalCheckoutProcessor クラスに追加することによって開始します。 クラス定義の終了を示す波括弧 (}) のすぐ上の空の明細行に次のコードを追加します。
public static void RentalFinalizedEventHandler(FMRental rentalrecord, Struct rentalConfirmation) { }イベント ハンドラーの先頭に、属性を追加します。 これらの属性は、イベントハンドラーがどのデリゲートに加入しているかを示します。
[SubscribesTo(classstr(FMRentalCheckoutProcessor), delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))] public static void RentalFinalizedEventHandler(FMRental rentalrecord, Struct RentalConfirmation) { }クレジット カードの有効期限の値を確認するコードを追加します。 完了したメソッドは、次のコードのようになります。
[SubscribesTo(classstr(FMRentalCheckoutProcessor), delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))] public static void RentalFinalizedEventHandler(FMRental rentalrecord, Struct rentalConfirmation) { FMPaymentInformation paymentInfo; date ccExpiryDate, lastDayOfExpiryMonth; str s; select firstonly * from PaymentInfo where paymentinfo.RecId == rentalRecord.PaymentInformationId; if (paymentInfo) { // Check if the payment info is valid // For now we will check if the credit card is expired // Credit cards expire on the last day of the month indicated ccExpiryDate = mkdate(1, str2int(paymentInfo.ExpirationMonth), paymentInfo.ExpirationYear); lastDayOfExpiryMonth = endmth(ccExpiryDate); if (lastDayOfExpiryMonth < today()) { rentalConfirmation.value('OktoRent', false); s = "Credit card validation failed for rental "; } else { s = "Credit card validation succeeded for rental "; } info (s + rentalrecord.RentalId); } else { rentalConfirmation.value('OktoRent', false); info ("No Credit card available for " + rentalrecord.RentalId); } }ハンドラーとデリゲートが 1 行の空白行で区切られていることを確認します。
Visual Studio のツールバーで、保存 をクリックします。
コードに問題がなければ、フリート管理プロジェクトのコードをビルドします。 これを行うには、ソリューション エクスプローラー で、FleetManagement プロジェクト名を右クリックし、Build をクリックします。 コードが正しくない場合は、エラーまたは警告が表示されることがあります。 その場合は、コードを修正し、すべての警告とエラーが解決されるまでもう一度ビルドします。 これで、リビジョンが意図したとおりに動作することを確認する準備が整いました。
デバッグメニューをクリックして、すべてのブレークポイントを削除します。
次のステートメントを含む明細行にあるイベント ハンドラー メソッドに新しいブレークポイントを配置します。
if (lastDayOfExpiryMonth < today())F5 キーを押してデバッグをアクティブにし、フリート管理サンプルを開始します。
前のセクションのステップ 11 で説明されているように現在のレンタル ページを参照してください。 いずれかの予約を選択し、編集 をクリックします。
顧客ドロップダウン リストで、一覧から Adrian Lannin を選択して保存をクリックします。 実行は、イベントハンドラー メソッドで設定したブレークポイントで一時停止します。
F10 キーを 3 回押して、コード ブロックを実行します。
F5 キーを押して続行します。 顧客が拒否されていることに気づきます。
同じレンタルで、顧客名を Phil Spencer に変更してから更新をクリックします。 今回は、トランザクションが可能です。
Microsoft Edge を閉じます。
RentalFinalizedEventHandler メソッドで SubscribesTo をコメントにします。 この手順により、残りのチュートリアルで作業する際にクレジット カード テストが実行されなくなります。
ベスト プラクティス
このチュートリアルの前半では、プロジェクトにコードを追加し、変更を加えてソリューションをビルドしました。 ビルド プロセスが成功していない可能性があるため、エラー ウィンドウを参照する必要があります。 このウィンドウを使用すると、エラーを説明する行をクリックしてエラーに移動できます。 コンパイル エラーを表さない診断メッセージが表示される場合があります。 これらのメッセージは、 ベスト プラクティス チェッカーから送信されます。 このツールは、開発者が既知のベスト プラクティスに違反しているインスタンスをチェックし、検出されると警告を表示します。 ベスト プラクティス ルールは、コードの構成要素とメタデータの両方に適用されます。 各ソフトウェア開発組織には、適用する独自のベスト プラクティスのセットがある可能性があります。 組織は、既存のベスト プラクティス チェックの一部を無視したい場合があります。 このアクションをサポートするために、個々の開発者は、報告されるベスト プラクティス診断のセットを変更できます。 このプロセスを示すには、次の手順を実行します。
- [ 表示 ] メニューの [ エラー一覧] を選択します。 いくつかのベスト プラクティス警告が表示されます。
- Dynamics 365 メニューで、オプションを選択します。 Dynamics 365 グループで、ベスト プラクティス を選択します。
- モデル ドロップダウン リストで、フリート管理モデルが選択されていることを確認します。 ベスト プラクティス ルールは、特定のモデルに適用されます。
- ベスト プラクティス ルールのセットをいくつか選択します。 たとえば、 CodeStyleRules のエントリを選択した場合、変数のベスト プラクティス ガイドラインが調べられます。 選択内容を更新したら、[ OK] を選択します。
- プロジェクト名を右クリックし、[リビルド] を選択して、Fleet Management プロジェクトを リビルドします。 指定したベスト プラクティス ルールの違反が [エラー一覧 ] ウィンドウに表示されます。