Lotus notes 根据字段值查找Lotus Notes文档

Lotus notes 根据字段值查找Lotus Notes文档,lotus-notes,lotus-domino,lotusscript,lotus-formula,Lotus Notes,Lotus Domino,Lotusscript,Lotus Formula,我有一个名为“JobID”的字段,它在notes数据库中必须是唯一的。我的计划是在数据库中搜索文档的JobID,如果它等于当前文档的JobID,则通知用户并取消保存。不过,我似乎不知道该怎么做。嗯,恐怕除了遍历数据库中的所有文档之外,别无其他方法,因为这些文档使用包含字段的特定表单。与每次迭代相比,更有效的方法是将使用过的JobID保存在两个位置—与文档一起保存,并保存在包含所有使用过的JobID的存储中—然后您可以检查收集的集合,和/或可能在下班时间扫描所有文档以确保数据完整性。您可以通过使用

我有一个名为“JobID”的字段,它在notes数据库中必须是唯一的。我的计划是在数据库中搜索文档的JobID,如果它等于当前文档的JobID,则通知用户并取消保存。不过,我似乎不知道该怎么做。

嗯,恐怕除了遍历数据库中的所有文档之外,别无其他方法,因为这些文档使用包含字段的特定表单。与每次迭代相比,更有效的方法是将使用过的JobID保存在两个位置—与文档一起保存,并保存在包含所有使用过的JobID的存储中—然后您可以检查收集的集合,和/或可能在下班时间扫描所有文档以确保数据完整性。您可以通过使用特定的自定义视图来缩小搜索范围,并在该视图中迭代文档,而不是在数据库中迭代所有文档,但是这种解决方案存在风险,即由于数据集成有点伪造,您将陷入麻烦。

自行管理唯一编号可能会给您带来麻烦。有一个公式
@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").
希望这有助于激励您:-)
Phil

您可以将代码缩短一点,不需要遍历所有文档

搜索速度非常慢,我会使用视图查找。您可以使用db.FTSearch,但如果全文索引不是最新的,则无法获得正确的返回值。 因此,只需创建一个隐藏的查找视图,将作业ID作为第一列也是唯一一列(已排序)

您还应该在函数中声明session/db/etc。确保始终使用选项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

新用户提示-如果您觉得某个答案有帮助,您可以接受/投票支持该答案。是否有多个数据库副本?如果有,那么任何试图验证唯一性的东西都需要考虑到这一点。我不担心拥有100%的唯一ID。基本上,项目经理过去一直在处理同一个项目,并且都意外地使用相同的JobID创建了一个新表单。例如,管理层告诉Bob和Cindy为“101-ABC”创建订单。与Bob创建表单和Cindy编辑表单不同的是,Bob和Cindy都使用JobID“101-ABC”创建表单,然后每个人都不知道该使用哪个表单。基本上,我想让Lotus提醒Cindy“101-ABC”已经存在,这样她就知道要重新打开Bob制作的表单。这一点很好,但要发现Bob刚刚使用了101-ABC,你仍然需要检查它,确切地说,当Cindy进入她家时,这实际上会导致相同的问题:)除非你生气了,你用Bob使用的每一个JobID提醒Cindy,而你没有,对吗?:)我总是推荐@Unique。其他一切都有太多重复的可能性。任何低于100%唯一性的东西实际上都不是唯一的。认真地您可以允许他们选择任何他们想要的内容并承担复制风险,或者您始终禁止复制。在验证公式中,您需要注意这一点,因为如果文档已经保存,并且有人试图编辑并重新保存文档,则该公式将在视图中找到现有文档并防止其重新保存。一种方法是使用ATDbLookup的[ReturnDocumentUniqueId]选项,根据ATDocumentUniqueId检查结果,如果结果不匹配,则仅发出ATFailure。但是,公平警告。。。一些较旧版本的Domino中有一个bug,如果代理刷新使用[ReturnDocumentUniqueId]的表单的字段,服务器可能会崩溃。IBM技术说明中讨论了这个问题:斑点十足的Richard。另一个选项可能是使用:@If(!@IsNewdoc;@Success;@Do())?主要问题是检查副本时出现问题。如果作业ID包含一些对创建它的服务器的引用,那么就不会那么令人担忧了。介意添加一些解释吗?
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
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