iCoder後端處理功能
訊光科技/Andy Kao
前言
當iCoder讀入很多不同的表格的同時,其實不同的表格通常是有關連性的,有的只是單純的關聯關係,如請假單表格有用到員工表格,報價單表格有用到客戶表格與員工表格等;這種情況下,必須讓較為基本的表格先新增讀入到iCoder中(如員工表與客戶表),再新增後面的表格(請假單與報價單)才可以自動建立關聯關係。
除了表格的關聯關係外,表格間還有一些特殊的關係,如A表格進行新增更改刪除動作後,B表也必需做出相對的反應動作,這種我們大都會稱為資料交易處理,因為這種交易是前端看不到的,所以我們也會稱之"後端商業邏輯處理" 或Transaction簡稱為"TRS"。如"出貨單"新增時,希望同時建立客戶應收帳,庫存出庫帳,或是可以即時扣除庫存避免重複出貨等等,就屬於這種後端的交易處理。
新增TRS後端邏輯
1. 我們可以在Word表單按下右鍵以 [打開] / [後端邏輯] 來新增這個TRS後端邏輯。如下圖:
2. 下圖為 TRS後端邏輯的設定畫面。我們可以在主表(出貨單INVO)上方的按下"+"的按鈕來增加"對方資料表"。
3. 下圖為新增一個 "對方資料表" 的設定畫面。 透過上方選擇一個"對方資料表",如我們選擇 "客戶資料表",此時會顯示出所有客戶資料表內的所有欄位。右上方有一個 "對方的交易模式" 我們選擇 "異常終止"(Exception) 將代表找不到相對的客戶時會自動停止交易(連同出貨單都無法存檔)。下方的 "對應欄位"系統會自動選出 "客戶編號=客戶編號",代表會用 出貨單的客戶編號去找客戶資料表的客戶編號。
4. 上圖,接著下方為 "交易欄位明細",系統會自動幫你新增雙方相同欄位並設定為"="(代表置換)的關係,此時為了避免每次出貨單內容都會影響到基本檔的客戶資料內容,我們先以下方的 "X" 按鈕將 "交易欄位全數清除"。
5. 再如上圖,我們選擇左方的出貨單 [總計] 欄位,右方選擇客戶表的 [營業額] 欄位,選 "類型" 為 "累加" ( + ),代表出貨單的 [總計] 會累計加總到 客戶資料表的 [營業額] 欄位;左方的出貨單選 [地址] 欄位,右方客戶表也選擇 [地址] 欄位",選 "類型" 為 "替換" (=),代表出貨單每次輸入地址之後都會去即時更新客戶資料表的地址欄位。
6. 同上面的方法,我們在出貨明細表(INVODetail)也來新增一個 "對方資料表",我們選擇了 "產品資料表(Product)"。如下圖:
7. 上圖中,我們選擇了出貨明細的 [數量],產品表選擇 [庫存],類型為"累減不小於0" (-X),代表出貨明細的 [數量] 會去累減產品表的 [庫存],如果庫存不夠減就會終止交易進行(整張出貨單都不能存檔成功);另一個交易欄位為 [售價] = [及時售價],類型也是"替換" (=),代表出貨明細的 [售價] 會去即時更新到產品表的 [即時售價] 欄位。
8. 按下 [保存] 後,[TRS後端邏輯] 的節點會增加一個 "出貨單",畫面如下,會以視覺的方式來表現出後端的商業邏輯關係。
9. 最後可以在此TRS的出貨單上按下右鍵,執行 [編程匯出] ,如圖可以自動產生這些交易的程式到後端邏輯處理中。
相對於EEPCloud的TRS組件
上文中所提到 [TRS後端邏輯] 的定義,透過 iCoder其實是自動產生相對於 [服務端] 的 InfoTransaction組件(後端交易組件),原來這部分是屬於EEPCloud程式師所負責,我們透過 iCoder把他移轉給iCoder開發者來使用。
透過 [TRS]的一個項目,如上面的出貨單為例,右鍵 [打開] / [服務端] 後,可以打開 [服務端] 的設定畫面,如下圖,因為我們出貨單的主表與明細表都有設定對方資料表,所以會產生兩個 Transaction組件,分別為 trsINVO與trsINVODetail。
就以 trsINVO為例,可以看到把 [TRS後端邏輯] 的設定對應到後端的 Transaction組件屬性中,因為這屬於 EEPCloud雲平台的開發範圍,在此省略說明。
用 [TRS] 處理交易整合
有些交易系統的表單有很多種,分開在不同的交易表單中,但因為統計與計算的原因必須合併,所以通常會以即時或月結的方式撰寫程式來合併這些資料。就以庫存管理來說,影響庫存的就有進貨單、出貨單、進貨退回單、出貨退回單、調撥單、盤點單、報廢單等不同的表單,此時通常我們會另外建立一個資料表來合併與紀錄各個單據的"庫存進出明細表",好方便統計與統一管理。
我們就以出貨單為例,以 [TRS]的設定來完成對 "庫存進出明細表" 的即時同步更新,如下步驟:
1. 如下圖,透過 "庫存進出明細表.doc" 讀入iCoder中來產生相對應的資料表。
2. 同上個實例,在 [INVODetail] 出貨明細表中,我們再以 [ + ] 來增加一個交易對象,如下圖的設定:
對方資料表選擇剛剛加進來的 [庫存進出明細表],交易模式選擇為 "同步新增" 代表 [出貨明細表] 在新增/更改/刪除等動作時都會同時對 [庫存進出明細表] 做同樣的動作。為了彼此是1對1的對應關係,在"對方欄位"除了原本的"產品編號"外,又加了一個"出貨編號=單據號碼"來滿足彼此的一對一關係。
3. 接著設定彼此的交易欄位明細,除了上面的"產品編號"、"單據號碼"外,交易欄位有多了"產品名稱"與"數量"都是可以從 INVODetail中帶值過來,但因為這裡是銷貨,所以我們把欄位交易"類型"改成"替換為負值"(正變為負,負變為正)。接著設定"日期",日期因為INVODetail並沒有對應欄位,本來也可以設定"變數或常數"以$TODAY寫入今天的日期,但為了與單據一致,這裡我們使用主表INVO的"日期"欄位更為精準 (前面多了一個'#'代表為主檔欄位) 。
4. 接著設定"單價"欄位,在INVODetail是"售價"欄位,選擇後加入交易欄位明細即可。最後剩下"進銷"欄位,此欄位 INVODetail也沒有,所以我們就以"常數"的方式來設定,設定"銷貨"這個字串寫入到"進銷"這個欄位。如下:
5. 最後按下"OK"後,重新按下 [存檔] 後,同樣再執行一次 [編程匯出] ,出貨明細表(INVODetail)往後每次新增更改刪除一筆,就會自動同步到此"庫存異動明細表"中。
預覽或執行
透過iCoder的 [預覽] 或 [執行] 功能來驗證這個 [TRS]的成果,我們就以 "出貨單"為例,來看看這個 [TRS後端邏輯] 的執行結果。
1. 如下圖,新增一張出貨單,例如選擇一個6號客戶之後,接著我們故意把"地址"欄位改成 "6號";接著輸入兩筆出貨明細,一個產品編號為"6",數量為6,單價為60,另一個產品編號為"8",數量為8,單價為80;最後按下 [確定] 存檔。
2. 接著我們先來檢驗 [客戶資料表] 被 [TRS]交易的結果,我們在 Word的節點上右鍵選 "打開/主表",就可以發現這個 [客戶資料表] 有了不一樣的變化,如下圖: 6號客戶的地址被改成"6號",營業額也自動累加成 1050 (原本為0)。
3. 接著來檢驗 [產品資料表] 被 [TRS]交易的結果,我們在 Word的節點上右鍵選 "打開/主表",就可以發現這個 [產品資料表],如下圖: 6號與8號產品的最近售價被改成60元與80元,庫存量也從100分別變成94與92。
4. 最後檢查最精彩的 [庫存異動明細表] ,如下圖,我們會發現,從出貨明細表中所輸入的2筆資料,早已經被同步到這個異動明細表中了。
[TRS] 交易模式與欄位類型
前面提到 [TRS後端邏輯] 中的交易模式與交易欄位類型,在此簡單說明如下:
1. 新增對方資料表之後,可以設定對方的"交易模式",就是主表(或明細表)去找對方對應的資料後,會根據這個模式有不同的結果,如下定義:
對方的交易模式 |
說明 |
AutoAppend(自動新增) |
找不到對方相對資料就自動新增一筆相對資料 |
Exception(異常終止) |
找不到對方資料,強制終止交易處理 |
Ignore(忽略異常) |
找不到對方資料會忽略,並持續進行後續處理 |
AlwaysAppend(異動新增) |
無論對方是否有相對資料,每次總是會新增,也就是用來記錄本表的新增、更改前後、刪除的資料 |
SyncAppend(同步新增) |
跟著本表同步新增更改刪除等動作 |
2. 主表(或明細表)與對方的交易欄位類型,定義如下:
交易欄位類型 |
說明 |
累加(Increase) |
以本表的欄位去累加對方資料表的欄位。(本表+對方) |
累減(Decrease) |
以本表的欄位去累減對方資料表的欄位。(本表-對方) |
累減(DecNotZero) |
同樣累減但對方不能小於0,否則終止交易。(本表-對方) |
替換(Replace) |
以本表的欄位去替換取代對方資料表的欄位。(本表=對方) |
替換負值(ReplaceNegative) |
同樣替換取代,但會將對方欄位改成負值。(本表=-對方) |
寫回替換(WriteBack) |
以對方的欄位反過來替換取代本表欄位。(本表<=對方) |
結語
商用應用軟體通常分為三大部分,一為資料輸入,對應到iCoder就是Word表單;二為輸出,對應到iCoder就是為Excel查詢與報表; 三為資料處理與交易, iCoder當然可以透過[TRS]即可很簡單地設定來輕易達到資料處理功能。不但如此,本文中的實例都是以On-Line的方式進行過帳與交易,未來iCoder還會再透過 [TRS] 來進行難度更高的批次結帳處理,就讓我們持續看下去。