以AOP來實現自動編號與過帳
訊光科技/Andy Kao
前言
在LEAP這個雲端開發平台中,有一個AOP的觀念,AOP就是Aspect Oriented Programming的意思,這個架構就是讓你可以動態掛入自己的橫切面程式,如在後端的資料新增更改刪除時,掛入自訂的Java Class程式等等。本文將利用LEAP所提供的『系統』類AOP,也就是LEAP為開發者寫好共用的AOP,讓開發者可以不必設計程式就可以完成類似自動編號與資料庫過帳功能。。
AOP的類型
LEAP的AOP共分成兩類,一種為「系統」AOP,另一種為「自訂」AOP,前者就是LEAP研發小組幫我們寫好固定的AOP程式(用Java事先寫好),使用時只要設定參數即可,不必設計程式;後者是由開發者以java寫好程式,並編譯成Class再上傳到LEAP的Server上,配合AOP的設定掛接進來。 如下圖,每個AOP設定,必須配合前端網頁某一個View來設定,並設定動作類型,如有加入客製化查詢條件、新增時,更改時,修改時等動作。這些動作類型就好像一般常用事件(Event)方式一樣,讓這個View回存到後端時所要執行的相對動作,用這些事件來完成所要達成的任務。
下圖就是代表「系統」類中現有的AOP,到目前為止共有自動編號、過帳、Stored Procedure、一對一更新等等功能,自動編號一般用於新增資料時所要編出的單據號碼,過帳則代表要對另一個資料表的同步異動,包括累加累減等動作,Stored Procedure就是用來呼叫資料庫的預存程序,一對一更新則用來同步另一個相同鍵值的另一個Table資料。
自動編號的AOP
本文的重點之一,就是要處理自動編號,很多企業的單據或編號都希望有自動編號的功能,自動編號的原則很多,並非單純的從1開始編下去。如下,這是LEAP為我們寫好的系統級AOP,我們只要設定參數即可完成這個功能:
header:代表編號字軌內容,不是必要屬性,會放在編號最前頭。上例中「P」代表都會編出P開頭的單據。 preCode:編號前引碼欄位,可以選擇一個欄位名稱,配合header加起來的內容去找編過的號碼,如果沒有會從startNum開始編,否則會加上incrementCount。本屬性可以不設定。 digit:代表流水號位數,如3代表001編到999等,本屬性一定要設定。 startNum:當header加上preCode欄位內容沒有重覆時,就會從startNum起編號,沒有設定則代表1。 incrementCount:每次增加多少號碼,預設為1,代表每次加1。 writeColumn:所要回寫的自動編號欄位,一般是主鍵欄位,當然一定要設定。 split:header與perCode間的分隔符號,可以不必設定。
針對以上的例子來說明,可以在Order訂單的新增上定義一個AOP程序,然後在「新增時」設定此自動編號AOP,如此即根據yymm欄位內容編號,如2012年05月新增的單據,會編出 P1205001到P1205999的單據號碼。
過帳的AOP
LEAP的AOP都是在資料送回資料庫的同時來觸發自訂程式或系統固定程式,過帳就是「系統」固定程式的一種,可以用參數設定方式來達到對另一個資料表的過帳處理,如對另一個Table資料累加或累減,或對另一個Table資料回寫,針對過帳設定說明如下:
postingColumn:指過帳來源欄位,過帳設定的每個屬性都是必須設定的,不能省略。 targetTable:所要過帳的對方資料表,來源資料表與對方資料表必須於LEAP的資料表外鍵關係中先定義好。 targetColumn:過帳要寫入的對方欄位。 postingType:過帳模式,共有三種,「+」代表累加數值,「-」代表累減數值,「=」代表將欄位覆蓋。 以上的實例,來源Table是指OrderDetail訂單明細表,過帳的對方Table是指Product產品資料表,當OrderDetail新增時,會同步對Product的unitonorder欄位進行累加處理,相對的,如果刪除資料也會累減回來,更改動作也會累減舊值累加新值等等。所以,這個AOP必須在新增/更改/刪除都必須定義上去,否則就會有遺漏。
結論
延續訊光DBTOOLS或EEP的客群們,已經習慣對這種常用的後端處理以元件或參數設定來對應,並不需要去開發程式。在LEAP架構中,我們也盡量延續這樣的精神,儘量多開發一些『系統』類AOP程序,讓大家都能以參數設定方式來處理後端資料處理,來大量節省開發時間,相對也可增加程式品質。除此之外,亦可以藉由資料庫Stored Procedure來取代後端AOP Java的程式開發,讓較不熟習Java語言的開發者可以有另外的選擇,來滿足不同需求與應用。 |