我有一个名为“JobID”的字段,它需要在笔记数据库中是唯一的。我的计划是在数据库中搜索文档的 JobID,如果它等于当前文档的 JobID,则提醒用户并取消保存。我似乎无法弄清楚我会如何做到这一点。
5 回答
像这样自己管理唯一号码可能会给您带来麻烦。有一个公式@Unique
,它将返回给您一个唯一的值,您可能应该使用它。
或者,您可以在数据库中维护一个文档,该文档包含一个您每次手动递增的数值。它的工作量更大,但会给你一些类似关系数据库所具有的自动递增 ID 的东西。
我是第一个承认这相当丑陋的人,但是如果您有一个视图,其中第一列是 JobID,它是有效且非常简单的。
Put this in the input validation of the JobID field.
outcome := @DbLookup("":"NoCache"; "":"" ; "<viewname>"; JobID; 2);
@If(@IsError(outcome); @Success; @Failure("A Job with this ID already exists").
或类似的东西。
您还可以通过许多其他方式做一些更好的事情:
e.g. LotusScript in the Exiting event of the JobID field using
....
set doc= NotesView.GetDocumentByKey(workspace.currentdocument.fieldgettext("JobID"))
If doc Is Nothing Then ....
etc.
希望这有助于启发你:-)菲尔
您可以稍微缩短代码,无需遍历所有文档...
db.Search 非常慢,我会改用视图查找。您可以使用 db.FTSearch,但如果全文索引不是最新的,您将无法获得正确的返回值。因此,只需创建一个隐藏的查找视图,将作业 ID 作为第一列也是唯一的列(已排序)。
您还应该在函数中声明 session/db/etc。确保您始终使用 Option Declare...
Function JobIdIsValid (jobId As String) As Boolean
'*** Check if a form with this project number is already created
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim col as NotesDocumentCollection
Dim searchformula As String
Set db = session.CurrentDatabase
Set view = db.GetView("(LookupJobID)")
Call view.Refresh() 'Optional, but useful if documents are created often
Set col = view.GetAllDocumentsByKey(JobID)
If col.Count > 0 Then
JobIdIsValid = False
Else
JobIdIsValid = True
End If
End Function
嗯,恐怕除了迭代数据库中的所有文档之外别无他法,这些文档使用包含您的字段的特定表单。更有效的方法不是每次都进行迭代,而是将使用的 JobID 保存在两个地方 - 与文档一起,以及在包含所有使用的 JobID 的某些存储中 - 然后您可以检查收集的集合,和/或可能在关闭时执行所有文档的扫描小时以确保数据完整性。您可以通过使用某些特定的自定义视图来缩小搜索范围,并在此视图中迭代文档而不是 DB 中的所有文档,但是这样的解决方案将存在风险,如果数据集成有些伪造,您会遇到麻烦。
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView(("TMP_ID"))
Dim ckDoc As NotesDocument
Set ckDoc = view.GetDocumentByKey(ws.CurrentDocument.FieldGetText("ID"), True)
If Not ckDoc Is Nothing Then
Messagebox ("Запись с таким идентификатором уже существует")
Call source.GotoField( "ID" )
continue = False
End If