[轉載] Dynamics 365 Business Central開發實戰-3:Event-driven

<< 以下為轉載文章。。。>>


2019/6/10
接下來,我們來看到規格第五項:當 G/L Account 的項目被加到 Purchase Line 中,”Expense Code” 的值要能從 G/L Account 複製到 Purchase Line。我們曾分析過,Purchase Line 中以 Type 加上 No. 來代表一要購買的品項。在這個情況下,就是 Type 為 “G/L Account” 且 No. 被決定的當下,”Expense Code” 的資訊會被帶進到 Purchase Line 中。所以去查看 Purchase Line 中 No. 的 OnValidate() 程式碼。

值得一提的是,在每張 Table 的每個欄位都有其相應的 OnValidate() 區塊。這個區塊的程式碼會在 “使用者完成輸入該欄位的值” 時被觸發。其實在 Business Central 中有非常多的程式碼都是這種 Event-driven 的模式:例如 OnInsert() 的程式碼區塊是在一筆完整資料被寫入資料庫時觸發、OnModify() 是在資料被修改時觸發、OnOpenPage() 是在頁面被開啟時所觸發。

在 Purchase Line 的 No. 的資料被鍵入時,會觸發並執行 No. — OnValidate() 的程式碼

因為我們是要將 G/L Account 中的 “Expense Code” 資訊帶入到 Purchase Line 中,於是我們一路追蹤程式碼到 “CopyFromGLAccount” 這個 function。

trace codes to function “CopyFromGLAccount”
Codes in function “CopyFromGLAccount”

在古老的時期,追到這裡並加上一行程式碼 “Expense Code” := GLAcc.”Expense Code”,已經大功告成 (如下圖):

Add codes in function “CopyFromGLAccount”

然而,我們發現一件有點嚴重的事情:儘管這個需求已經完成了,但是我們卻改動了標準的物件 Table “Purchase Line”。在未來系統升級時,我們需要手動把這行程式碼加上去。很明顯,這不是最佳的做法。
於是,我們往下看到 function “OnAfterAssignGLAccountValues”。這個 function 在古老時期的 Business Central 是沒有的 (古老時期的 BC 通常叫做 NAV 或是 Navision,有興趣可以去 google 這段歷史),而他的命名又臭又長,且開頭 OnAfter 頗有像是 OnValidate() 這種事件的味道。我們追蹤這個 function,卻發現這個 function 追到最後是一個空的 function,裡頭一行程式碼都沒有。

function OnAfterAssignGLAccountValues()
No codes in function “OnAfterAssignGLAccountValues()



到這裡有一點一頭霧水是吧?在本篇文章最後,我會先直接完成這個需求,下篇文章再來細講原理。閱讀者可以先看我表演,有個感覺即可。
首先建立一個 Codeunit 50000, 我們把它命名做 Expense Subscribers。在其中,我們建立了一個 function “TransferExpenseCodetToPurchLineFromGL”

function “TransferExpenseCodetToPurchLineFromGL”

並且,選取並設定其 Properties:Event 為 ‘Subscriber’, EventPublisherObject 為 ‘Table Purchase Line’, EventFunction 為我們剛剛追蹤到最後的函式 ‘OnAfterAssignGLAccountValues’

Properties of function “TransferExpenseCodetToPurchLineFromGL”

最後,在我們的函式 TransferExpenseCodetToPurchLineFromGL() 中加入三行程式碼 (如下圖),儲存後即大功告成。

Codes in function “TransferExpenseCodetToPurchLineFromGL”

我們發現這個方法不僅可以滿足這個需求,也完全沒有動到標準的物件。我們的程式碼從加在 Table “Purchase Line” 中,轉換到外部新增的 Codeunit 50000。系統升級時,我們只需要把 Codeunit 50000 直接匯入開發環境即可。在下一篇文章中,我會講解其中的原理,並且繼續完成後面的客製。



*****************************************************************************

<< 以上文章,經作者 Ray 同意,轉載自 https://medium.com/@nturay0321 >>


留言