NotesForm:用程式讀一個資料庫有哪些表單、欄位、誰能用
你接手一個沒人留文件的 NSF:想先搞清楚它到底有哪些表單、每個表單長什麼樣、誰被允許用它建文件。打開 Designer 一個一個點當然可以,但如果你要寫一支稽核 agent、跑過幾十顆資料庫做盤點呢?
這時候靠的是 NotesForm。它的定義很簡單 —— 「Represents a form in a database」 —— 但重點在於:它讓你在程式裡讀到表單的設計資訊,不用開 Designer。這在「處理文件」之外、難得碰到的「讀設計」這一面,NotesForm 是主要入口之一。
重點摘要
- 從
NotesDatabase取得:db.Forms(全部,回傳陣列)或db.GetForm("表單名")(指定一個) - 讀設計:
Name、Aliases(別名)、Fields(所有欄位名,陣列) - 讀權限:
FormUsers(誰能用此表單建文件,即$FormUsers欄位)、Readers($Readers) IsSubForm:判斷是不是子表單;GetFieldType(欄位名):查某欄位的型別- 複寫保護:
ProtectReaders/ProtectUsers(讀寫Boolean)防止$Readers/$FormUsers被複寫蓋掉 Remove()永久刪除表單;多數屬性唯讀,FormUsers / Readers / Protect* 是讀寫
取得表單:db.Forms 與 db.GetForm
表單屬於資料庫,所以從 NotesDatabase 取得。要列出全部,用 db.Forms(回傳陣列)——官方範例就是這樣跑的:
Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase Forall form In db.Forms Messagebox form.Name End ForallEnd Sub要指定某一個,用 db.GetForm("Memo")。一個官方提醒:「You can’t get access to private forms belonging to other people.」 —— 別人的私有表單你讀不到,只能拿到共用的與自己的。
讀設計:Name / Aliases / Fields
拿到 form 之後,這三個唯讀屬性是「盤點」最常用的:
| 屬性 | 內容 |
|---|---|
Name | 表單名稱 |
Aliases | 表單的別名(陣列) —— 表單常有「顯示名|別名」,程式參照多半用別名 |
Fields | 此表單上所有欄位名稱的陣列 |
Fields 特別有用 —— 一行就能列出某表單定義了哪些欄位,不用開 Designer 看 form 設計:
Dim form As NotesFormSet form = db.GetForm("Order")Forall fld In form.Fields Print fld & " : " & form.GetFieldType(fld) ' 欄位名 + 型別End ForallGetFieldType(欄位名) 回傳那個欄位的資料型別,跟 Fields 搭起來就是一張「表單欄位清單 + 型別」。
讀權限:FormUsers 與 Readers
NotesForm 也讓你讀(並改)表單層級的存取控制:
FormUsers(讀寫)—— 官方:建立表單時若指定了「誰可以用這個表單建文件」,那些名字就存在$FormUsers欄位裡,這個屬性讀的就是它。Readers(讀寫)—— 讀的是$Readers欄位內容。
搭配的是兩個複寫保護開關:ProtectReaders 跟 ProtectUsers(讀寫 Boolean)。它們的作用是「防止 $Readers / $FormUsers 在複寫時被另一個副本蓋掉」。如果你在多伺服器環境用程式改了表單的 reader/user 設定,記得這兩個旗標決定你的改動會不會被複寫沖掉。
還有
IsSubForm(唯讀Boolean)—— 判斷這是不是子表單。Remove()—— 永久刪除表單(謹慎用)。HttpURL/NotesURL—— 表單在 HTTP / Notes 協定下的 Domino URL。Lock()/LockProvisional()/UnLock()—— 設計元素鎖定,多人改設計時用。
同類別在其他語言
| 語言 | 對應類別 | 取得方式 |
|---|---|---|
Java(lotus.domino.*) | Form | db.getForm(name) / db.getForms() |
| SSJS / XPages | Form | database.getForm(name) |
三邊一致:都從 database 取得、都能讀 Name / Fields / FormUsers 等。要注意 Fields、Aliases 在 Java/SSJS 是 getFields() / getAliases() 方法回傳字串陣列。寫 Java 稽核工具掃描設計時,這篇的屬性對照可以直接用。