表達公式是我們平臺為了簡化簡單功能的實現(xiàn)難度,以及增加平臺的靈活性而設計的一個非常實用的功能。使用好表達公式可以讓我們的很多設計少寫很多代碼。也可以實現(xiàn)一些動態(tài)配置,修改部分功能也不需要頻繁地升級、更新客戶端軟件。
公式的寫法:
a.首先從語法上講,條件公式使用的是VB.Net語法。但是為了實現(xiàn)部分特殊需求,我們又稍微作了一點調整。
b.可以用“[列名稱]”這樣的方式引用當前行指定列的數據。這里“[”與“]”為英文的方括號,“列名稱”為列名稱。當前行就是指觸發(fā)執(zhí)行此表達公式的RowData行。這種表達式
c.表達公式只能寫一行代碼,并最終返回一個值。這個返回值可以是字符串、邏輯型、數值型、日期型等等。這一句代碼無論寫多長,但是請保證是一句表達式。
比如:[條件格式]<60
或:[條件格式].ToString().Length>0
或:Proj.CurrentGrid IsNot Nothing AndAlso Proj.CurrentGrid.DataTableHelp IsNot Nothing AndAlso Proj.CurrentGrid.DataTableHelp.DataRows.Count>0
或:[單價]*(1-[折扣])
備注:我們可以合理利用本平臺中引用表數據的方式,來實現(xiàn)非常復雜的功能。請合理利用平臺集成功能,充分發(fā)揮自己的想象,理論上可以實現(xiàn)所有常規(guī)需求。引用某表當前行的數據示例:Proj.OpenedForms("窗口名稱").Grids("表名稱").CurrentRowData("列名稱")
d.表達公式可以通過CurrRow變量來訪問到公式正在運行的當前行。CurrRow是RowData類型的,可以訪問其PreviousRowData與NextRowData屬性來訪問上一行與下一行,以方便地實現(xiàn)像流水賬、累計值這樣的功能。
比如:CurrRow.PreviousRowData("列名稱")>85
上面的條件公式“[列名稱]<60”我們還可以寫成“CurrRow("列名稱")<60”。
提問:為什么有了CurrRow可以直接取當前行中的列數據,還需要“[列名稱]”這樣的引用方式呢? |
答:因為“[列名稱]”這樣的引用方式一個是相對簡單,可以讓表達公式看起來相對簡潔一點。另外一個非常重要的作用就是,在表屬性設置窗口中,我們可以給已經存在于數據庫中的基礎列設置表達公式,這個帶方括號(“[列名稱]”)的引用方式是觸發(fā)表達公式的條件,即表達公式中包含多少個這種列,這些列的數據有變動了(觸發(fā)ColDataChanged事件)就會觸發(fā)此表達公式的執(zhí)行。 例如表達公式為:[單價]*(1-[折扣]) 這時候,無論“單價列”還是“折扣”列有數據變動都會觸發(fā)表達公式的執(zhí)行,執(zhí)行的結果將會返回設置了此表達公式的列中。 |
e.CurrGrid變量。表達公式還可以使用CurrGrid這個變量來訪問到當前表。CurrGrid是IDataRuleGrid接口類型的。我們可以很方便地通過此變量獲得當前表(CurrGrid.BaseBaseGrid)、當前表的父表(CurrGrid.Relation.ParentGrid)、當前表的子表(CurrGrid.Relation.ChildrenGrids)、當前表的拷貝表(CurrGrid.BaseBaseGrid.CopyGrids)、當前表的窗體(CurrGrid.Form)
f.系統(tǒng)靜態(tài)變量。我們還可以直接通過類似Proj.CurrentGrid的方法直接訪問Proj空間下的所有靜態(tài)屬性、對象。理論上在表達公式里面我們是自由的,想做任何事情都可以。只要你足夠有想象力,把代碼控制在一行以內。
g.執(zhí)行SQL語句。我們可以在表達公式里面做任何事情,當然包含執(zhí)行SQL語句。
例:CurrGrid.DataTableHelp.Database.ExecuteScalar("select Name from tabelName where ID='" & [ID] & "'")
這里的“[ID]”用這種方式來組合連接字符串,主要是讓平臺檢測出,我們希望CurrGrid表中的ID列有變動了,就執(zhí)行此表達公式,并到當前表中的數據庫中執(zhí)行一段SQL返回一個值。如果我們希望執(zhí)行其他數據庫中的SQL怎么辦?可以通過下面的方式執(zhí)行。
Proj.SysDataFactory("UserDB").ExecuteScalar("select Name from tabelName where ID='" & [ID] & "'")
h.返回常量。如果我們希望返回一個固定的值時要注意一下。返回字符串請使用英文雙引號:"男"
使用場景
1、列屬性的表達式、默認值。
2、條件格式。
3、通用Excel導入的默認值。
4、高級篩選參數中的最大值、最小值、默認值。
5、用戶自定義表達式。
6、自動編碼。
觸發(fā)條件
1、表在加載時,會檢查所有設置了表達公式并且還為空值的,就會逐條按照表達公式計算填充數據。
2、當表達公式中包含“[列名稱]”這樣的引用方式時,就會為這些列添加一個觸發(fā)點,這些列有數據變動就會觸發(fā)執(zhí)行相應的表達公式。
3、如果表達公式里面包含PreviousRowData這種引用上下行的方法的話,有一行數據改動,會觸發(fā)此行及下面所有行的重新計算。
注意點:
1、用“[列名稱]”這樣的方式引用返回的值有一個特點,就是針對空值,它是有默認返回值的。邏輯列返回False,字符串列返回空字符串“”,數值列返回0,日期列返回DateTime.MinValue,顯示結果是(0001-01-01 0:00:00)。所以在常規(guī)計算時我們是需要考慮判斷空值的情況的。主要就是考慮數值型字段作為被除數的場景,以及日期計算的場景。如果單單是字符串拼接的話,我們可以忽略空值的影響,這就大大地簡化了我們表達公式的復雜度。
2、判斷空值可以通過CurrRow.IsNull("列名稱")來判斷。
3、通過IIF函數來實現(xiàn)三元判斷。