<< 以下為轉載文章。。。>>
*****************************************************************************
<< 以上文章,經作者 Ray 同意,轉載自 https://medium.com/@nturay0321 >>
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() 是在頁面被開啟時所觸發。
因為我們是要將 G/L Account 中的 “Expense Code” 資訊帶入到 Purchase Line 中,於是我們一路追蹤程式碼到 “CopyFromGLAccount” 這個 function。
在古老的時期,追到這裡並加上一行程式碼 “Expense Code” := GLAcc.”Expense Code”,已經大功告成 (如下圖):
然而,我們發現一件有點嚴重的事情:儘管這個需求已經完成了,但是我們卻改動了標準的物件 Table “Purchase Line”。在未來系統升級時,我們需要手動把這行程式碼加上去。很明顯,這不是最佳的做法。
於是,我們往下看到 function “OnAfterAssignGLAccountValues”。這個 function 在古老時期的 Business Central 是沒有的 (古老時期的 BC 通常叫做 NAV 或是 Navision,有興趣可以去 google 這段歷史),而他的命名又臭又長,且開頭 OnAfter 頗有像是 OnValidate() 這種事件的味道。我們追蹤這個 function,卻發現這個 function 追到最後是一個空的 function,裡頭一行程式碼都沒有。
到這裡有一點一頭霧水是吧?在本篇文章最後,我會先直接完成這個需求,下篇文章再來細講原理。閱讀者可以先看我表演,有個感覺即可。
首先建立一個 Codeunit 50000, 我們把它命名做 Expense Subscribers。在其中,我們建立了一個 function “TransferExpenseCodetToPurchLineFromGL”
並且,選取並設定其 Properties:Event 為 ‘Subscriber’, EventPublisherObject 為 ‘Table Purchase Line’, EventFunction 為我們剛剛追蹤到最後的函式 ‘OnAfterAssignGLAccountValues’
最後,在我們的函式 TransferExpenseCodetToPurchLineFromGL() 中加入三行程式碼 (如下圖),儲存後即大功告成。
我們發現這個方法不僅可以滿足這個需求,也完全沒有動到標準的物件。我們的程式碼從加在 Table “Purchase Line” 中,轉換到外部新增的 Codeunit 50000。系統升級時,我們只需要把 Codeunit 50000 直接匯入開發環境即可。在下一篇文章中,我會講解其中的原理,並且繼續完成後面的客製。
*****************************************************************************
<< 以上文章,經作者 Ray 同意,轉載自 https://medium.com/@nturay0321 >>
留言
張貼留言
留下您的意見