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