皆様、おはようございます。
昔のブログでDynamics 365 Business Centralの開発についてご紹介したことがあります。今回はBusiness Central開発中もっとも重要なイベント(Event)についてを詳しく解説いたします。
まず、エクステンション開発とは何かを思い出してみましょう。
Extension開発はNAV2016から導入された新しい開発手法です 。従来NAVのカスタマイズでは標準のソースコード(ロジック、翻訳など)を直接書き換えていました。Extensionを利用することで、カスタマイズ部分だけをパッケージ化することができます。これにより、アップデート対応が容易になり、パートナーはAppSourceで販売することもできるようになりました。
標準のソースコードを直接書き換えできなくなったため、標準のロジックをカスタマイズしたい場合は、標準で用意してくれたイベントを用いてコーディングします。
参考:
Dynamics 365 Business Central PTEとAppSource Extensionについて
Events in AL (MS Docs)
イベントのタイプ
Event types | Description |
---|---|
BusinessEvent | •恒久的なカスタムイベント |
IntegrationEvent | •恒久的ではないカスタムイベント |
Global | •OnRoleCenterOpen などのシステムイベント |
Trigger | •OnBeforeModify などのデータベーストリガー •OnOpenPage などのページトリガー |
注意:
イベントのsubscriber (実装) はCodeunitでしか使用できません。
それではお待たせいたしました。イベントを検索する方法についてお話ししましょう。
方法は三つあります。
1. Visual Studio Codeから検索すること。
ショットカットキー「Shift + Alt + E」を押してイベント検索画面を呼び出します。
必要なイベントを探します。
検索結果をクリックして、Codeunitに追加することができます。
この方法はBusiness Central 16.0からリリースされ、すごく便利です。デメリットは、イベントの名前を分からない場合は検索するのは難しいでしょうかね。
local procedure OnBeforePostLines(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; CommitIsSuppressed: Boolean; PreviewMode: Boolean);
begin
end;
2. Event Recorder機能を利用すること
Business Centralの標準機能「Event Recorder」ページを開きます。
「Record Events -> Start」をクリックします。
「はい」をクリックして、記録開始。(この画面を閉じちゃだめ)
ここから、カスタマイズしたいページや機能を実行します。
例えば得意先カードを開きます。
最初は得意先一覧画面が表示されました。
カード画面を開きます。
OK,ここまで、得意先カードページと得意先一覧ページを閉じます。
Event Recorderページを戻して「Record Events ->Stop」をクリックします。
先ほど一連の動作で実行されたイベントの数が表示されました。
「はい」をクリックします。
記録されたイベントの一覧が表示されます。
フィールドの「Get AL Snippet」をクリックします。
表示されたEvent Subscriberをコピーして、Codeunitに追加することができます。
この方法のメリットは明白で、正確に自分が使いたいイベントを探せることです。デメリットは、調べる操作が複雑な場合、記録されたレコードの量はすごく多いです。特定するのは難しいかもしれません。
[EventSubscriber(ObjectType::Page, Page::"Sales Pr. & Line Disc. Part", 'OnNewRecordEvent', '', true, true)]
local procedure MyProcedure()
begin
end;
3. 標準ソースコードの中で手動で調べること
まず標準ソースコードの見る方法について下記をご参考ください。
Dynamics 365 Business Centralの標準機能のソースコードを見る方法について
この方法はもっとも複雑な方法ですが、日常開発中ではもっとも使われるかもしれません。
例えば転記処理のソースコード (codeunit 80 “Sales-Post”)をご覧ください。
標準ソースコードの中には下記のイベントがあって、この行でこのイベントを実行するという意味です。
OnAfterPostSalesLine(SalesHeader, SalesLine, SuppressCommit, SalesInvLine, SalesCrMemoLine, xSalesLine);
さらに下まで調べると、イベントが定義されている場所を簡単に見つけることができます。
local procedure OnAfterPostSalesLine(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"; CommitIsSuppressed: Boolean; var SalesInvLine: Record "Sales Invoice Line"; var SalesCrMemoLine: Record "Sales Cr.Memo Line"; var xSalesLine: Record "Sales Line")
begin
end;
このイベントを利用したい場合、手動でCodeunitに追加しても全然問題ありませんが、イベントの名前をすでに把握した今は、方法1のショットカットキー「Shift + Alt + E」を使って、簡単に追加できるでしょう。
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Sales-Post", 'OnAfterPostSalesLine', '', false, false)]
local procedure OnAfterPostSalesLine(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"; CommitIsSuppressed: Boolean; var SalesInvLine: Record "Sales Invoice Line"; var SalesCrMemoLine: Record "Sales Cr.Memo Line"; var xSalesLine: Record "Sales Line");
begin
end;
以上
コメント