宣告變數:var 與 let
var 與 let 都可以用來宣告變數。與 JavaScript 不同的是,在 Ninox 中 let 和 var 在作用範圍上並沒有差別。
變數的型別取決於指派給它的值的型別:
var t := "my text";
var b := false;
var n := 10;同一段程式碼中,一個變數可以宣告多次。這種情況下,變數會一直保有先前指派給它的型別與值,直到執行到新的宣告為止:
var b := true;
dialog("Message 1", "Value of b: " + b, ["ok"]);
var b := 12;
dialog("Message 2", "Value of b: " + b, ["ok"]);變數名稱與表格/欄位 ID 的混淆
Ninox 儲存程式碼的格式,和畫面上顯示的略有不同。具體來說,欄位與表格的名稱會被換成它們的 ID,也就是字母。
例如,下面這段計算已售項目總和的腳本:
sum('Invoice Items'.Total)在系統程式碼中會被存成下面這樣,其中 D 是表格 'Invoice Items' 的 ID,而 E 是欄位 Total 的 ID:
sum(D.E)在這種情況下,如果建立了一個名為 D 的變數,就可能讓編譯器混淆,因為下面這段系統程式碼會讓人搞不清楚 D.E 指的是表格,還是先前宣告的變數 D:
(var D := "hello"; sum(D.E))為了避免這類混淆,變數的命名應該盡量不要與表格或欄位的 ID、或表格/欄位的名稱相同。這也是為什麼變數常常取簡短的小寫名稱(例如 a、b 或 c),以免被誤認為 ID。
誰占上風:變數,而且沒有任何提示
Ninox 不會給出任何提示:程式碼一旦儲存,變數就會蓋過具有相同 ID 的欄位。例如,在一個資料庫中,表格 Sessions 的欄位 Number 的 ID 為 B:
var B := 5;
cnt(select Sessions[Number = 1])這段程式碼會以 (var B := 5; cnt(select A[B = 1])) 的形式儲存。重新讀取時,篩選條件不再拿欄位 Number 與 1 比較,而是拿變數 B 比較:結果為 0,而且沒有任何錯誤。若寫成 [Number = 5],就會計算所有記錄;order by Number 排序也不再依照編號排列。(透過 API 在一張 48 筆記錄的表格上實測。)
這個陷阱只有在儲存之後才會出現:以畫面上顯示的文字(含欄位名稱)進行測試——例如透過 API 送出的查詢——可以編譯,結果也正確。在儲存後重新讀取的程式碼中,原本是欄位名稱的位置仍原樣寫著 ID B:這正是混淆的跡象(在 Ninox 命令列工具下載的程式碼中觀察到;未在程式碼編輯器中驗證)。
最簡單的規則:變數或參數的名稱絕對不要只由一兩個大寫字母組成(B、KD、A1)。最好使用能說明其內容的小寫名稱(firstDay、total)。
