web端的自動計算
自動計算就是當使用者在出報價時,當輸入了某産品的折扣後價格、數量後,自動計算價格小計、折扣率。由于jxTMS的架構是web服務,是以如果将此功能放到背景來實作,則反應會相當的遲緩,使用者使用感受會非常難受。是以自動計算就放到web端來實作。
自動計算的實作:
- 定義自動計算的算式
- jxTMS會解析這些算式,将其轉換為字尾表達式形式
- web端在建立控件時,會檢測本控件是否參與自動計算,如果本控件參與自動計算,則為其安裝自動計算的執行器
- 當使用者在某控件輸入後,如果該控件安裝有自動計算的執行器,則觸發該執行器,以字尾表達式計算方法執行計算,并将計算結果指派給結果控件,如果結果控件還參與了其它自動計算,則鍊式觸發相關算式的自動計算
- 執行器的結果指派等價于使用者的手工輸入,是以也會被pollData所收集并自動發送到背景
以常見的銷售報價為例,自動計算會用到:
- 産品明細表中小計一欄為單價×數量
- 産品總價應該為所有各行的小計的求和
- 運費應是産品總價×某種費率
- 最後的報價是(産品總價+運費)× 折扣
是以自動計算共有三種:
- pro row:就是對資料表逐行執行的行内各列參與的計算,如每行的小計=單價×數量
- sum col:列計算,就是對某一列進行累加,如總計是所有行的小計的累加
- ctrl:單個控件之間的計算,如總價=總計+運費-折扣
這三種自動計算的文法請參考【線上程式設計手冊->web界面->自動計算】中的說明。例子可參考demo中order的web檔案中銷售訂單中的定義:
/* 産品明細表每行的扣率 = 報價 / 清單價 的百分比 */
with sfApproveSalesOrderD1t2 compute pre row itemDiscount=realPrice / itemPrice * 100;
/* 産品明細表每行的清單價小計 = 清單價 × 數量 */
with sfApproveSalesOrderD1t2 compute pre row itemSum=itemPrice * itemNum;
/* 産品明細表每行的報價小計 = 報價 × 數量 */
with sfApproveSalesOrderD1t2 compute pre row realSum=realPrice * itemNum;
/* 訂單的清單總價 = 産品明細表每行的清單價小計的彙總 */
with sfApproveSalesOrder compute totalPrice = sum sfApproveSalesOrderD1t2.itemSum;
/* 訂單的報價彙總= 産品明細表每行的報價小計的彙總 */
with sfApproveSalesOrder compute sumPrice = sum sfApproveSalesOrderD1t2.realSum;
/* 訂單的報價折扣率= 報價彙總 / 清單總價 的百分比 */
with sfApproveSalesOrder compute discoutRatio=sumPrice / totalPrice * 100;
/* 訂單的成交金額= 報價彙總 - 折扣金額 */
with sfApproveSalesOrder compute realPrice=sumPrice - extDiscount;
/* 訂單的實際折扣率= 成交金額 / 清單總價 的百分比 */
with sfApproveSalesOrder compute realDiscoutRatio=realPrice / totalPrice * 100;
自動計算文法中的計算表達式的文法為:
計算式 (算符 計算式)*
其中,算法包括:+、-、*、/
計算式的文法:
計算單元 (算符 計算單元)*
左圓括号 計算單元 (算符 計算單元)+ 右圓括号
計算單元則包括:
(資料表名 .)? 變量名
數值
隻有列計算中的計算單元有【資料表名.】的字首,其它兩種自動計算都不需要。
列計算的時候還支援按條件彙總,即當有【when 條件表達式】時,隻有當條件表達式成立時,才彙總該行。列計算的完整文法為:
with div名 compute 資料名= 表名.列名 (frequency)? (when 條件表達式 (, 條件表達式)*)?
其中,如果有frequency,則不累加該列的數值,而是累加次數。
條件表達式的文法如下:
列名 比較符 值
列名 rule=正規表達式字元串
其中,比較符和之前其它條件判斷文法中的比較符一樣,包括:等于【==】、不等【!=】、大于【>】、大于等于【>=】、小于【<】、小于等于【<=】、相似【like】共七種。值包括字元串、數值、bool、日期等。
目前,jxTMS已經打包為雲伺服器鏡像,開發者開箱即用:
jxTMS-騰訊雲市場