【问题标题】:Find a Lotus Notes Document based on a field value根据字段值查找 Lotus Notes 文档
【发布时间】:2012-09-25 13:26:26
【问题描述】:

我有一个名为“JobID”的字段,它需要在备注数据库中是唯一的。我的计划是在数据库中搜索文档的 JobID,如果它等于当前文档的 JobID,则提醒用户并取消保存。不过,我似乎无法弄清楚我会如何做到这一点。

【问题讨论】:

  • 新用户提示 - 如果您发现某些答案有帮助,您可以接受/投票。
  • 虽然数据库的副本不止一个?如果有的话,那么任何试图验证唯一性的东西都需要考虑到这一点。

标签: lotus-notes lotus-domino lotusscript lotus-formula


【解决方案1】:

您可以稍微缩短您的代码,无需遍历所有文档...

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

【讨论】:

    【解决方案2】:

    这样自己管理唯一号码可能会给您带来麻烦。有一个公式 @Unique,它将返回给您一个唯一值,您应该使用它来代替。

    或者,您可以在数据库中维护一个单独的文档,该文档包含一个您每次手动递增的数值。它的工作量更大,但会给你一些类似关系数据库所具有的自动递增 ID 的东西。

    【讨论】:

    • 我不担心拥有 100% 唯一的 ID。基本上,项目经理过去一直在处理同一个项目,并且都意外地创建了具有相同 JobID 的新表单。例如。管理层告诉 Bob 和 Cindy 创建“101-ABC”订单。 Bob 和 Cindy 创建了 JobID 为“101-ABC”的表单,而不是 Bob 创建表单并由 Cindy 编辑,然后每个人都对使用哪个表单感到困惑。基本上,我想让 Lotus 提醒 Cindy “101-ABC”已经存在,以便她知道重新打开 Bob 制作的表单。
    • 好点,但要找出 Bob 刚刚使用 101-ABC,你仍然需要检查它,确切地说是 Cindy 进入她的,这实际上导致了同样的问题 :) 除非你是疯了,你用 Bob 使用的每个 JobID 提醒 Cindy,但你没有,对吧? :)
    • 我总是推荐@Unique。其他一切都有太多重复的可能性。任何低于 100% Unique 的东西实际上都不是唯一的。严重地。要么你允许他们选择他们想要的任何东西并冒重复的风险,要么你总是禁止重复。
    【解决方案3】:

    我是第一个承认这相当丑陋的人,但如果你有一个第一列是 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.
    

    希望这对您有所启发 :-) 菲尔

    【讨论】:

    • 您需要在验证公式中注意这一点,因为如果文档已经保存并且有人尝试编辑并重新保存它,公式将在视图中找到现有文档并阻止它不会被重新保存。一种方法是使用 ATDbLookup 的 [ReturnDocumentUniqueId] 选项,根据 ATDocumentUniqueId 检查结果,如果不匹配则仅发出 ATFailure。
    • 公平警告,但是... 一些旧版本的 Domino 有一个错误,如果代理刷新使用 [ReturnDocumentUniqueId] 的表单的字段,可能会导致服务器崩溃。此 IBM 技术说明中讨论了该问题:www-01.ibm.com/support/docview.wss?uid=swg21201399
    • 很好看的理查德。另一种选择可能是使用:@If(!@IsNewdoc;@Success;@Do(<..all the above stuff..>))?
    • 主要问题是检查副本时出现问题。如果作业 ID 包含对其创建所在服务器的一些引用,则不会那么令人担忧。
    【解决方案4】:

    嗯,恐怕除了迭代数据库中的所有文档之外别无他法,这些文档使用包含您的字段的特定表单。更有效的方法不是每次都进行迭代,而是将使用的 JobID 保存在两个地方 - 与文档一起,以及在包含所有使用的 JobID 的某些存储中 - 然后您可以检查收集的集合,和/或可能在关闭时执行所有文档的扫描小时以确保数据完整性。您可以通过使用某些特定的自定义视图来缩小搜索范围,并在此视图中迭代文档而不是 DB 中的所有文档,但是这样的解决方案将存在风险,如果数据集成有些伪造,您会遇到麻烦。

    【讨论】:

      【解决方案5】:
      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
      

      【讨论】:

      • 介意添加一些解释吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多