无法使用Lotusscript

时间:2019-03-13 14:45:20

标签: lotus-notes lotus-domino lotusscript

我有一个带有字段的注释文档。在此文档上,我创建了一个新字段(称为状态),该字段具有以下文本值:QUEUED。 现在,如果我通过以下方式从视图中获取文档:

Set nvwQueuedOrderLines = dbCurrent.Getview("QueuedOrderLines")
Dim docOrderRegel As NotesDocument
Set docOrderRegel = nvwQueuedOrderLines.GetFirstDocument

最终获取数据:

If docOrderRegel.Status(0) = "QUEUED" Then

...

然后,当在调试器中检查docOrderRegel的项目时,我看不到任何状态项目/字段。但是,当右键单击文档中的文档属性(在Lotus客户端中)时,我会看到带有值的项目/字段状态。 我可以在调试器中看到的所有其他字段,但不是此状态字段。 该如何在我的docOrderRegel对象中获取该字段。

2 个答案:

答案 0 :(得分:4)

我认为字段/项在那里,但您只是在调试器会话中看不到它。

如上面的注释所讨论:LotusScript调试器对每个文档对象可以显示多少个项目有一个限制。显然,该限制为256个项目。调试器不会处理存储在items数组中索引位置高于255的任何项目。

为您提供的一种解决方案是添加一些类似于以下内容的临时代码:

Dim itemStatus as NotesItem
...
Set itemStatus = docOrderRegel.GetFirstItem("Status")

这样,您将在状态字段中创建一个专用的NotesItem对象,使其独立于所描述的限制。然后,您应该可以在调试器会话中查看项目的内容。

答案 1 :(得分:3)

在Notes / Domino表单(=设计)和文档中是不同的(或多或少)独立的事物。

无论何时创建文档,它都采用AT THAT MOMENT形式,并为创建文档时表单上所有字段创建项目。

打开现有文档时也会发生同样的情况:它会查找表单并以在其中设计的方式显示其数据。按需添加了新字段的新项目。

但是:在您明确地将它们保存到文档之前,它们没有被保存到文档中。

这个过程是纯前端。

注意永远不要仅仅因为您以相应的形式进行了更改而自动更改现有文档(也就是创建一个值为“ QUEUED”的新字段“ Status”。 这就是为什么脚本无法获取项目的原因(除非您打开文档,并且表单中的字段成为项目)。

有多种方法可以通过对表单所做的更改来更新文档。 第一个是:在前端打开所有文档并保存它们...但这非常耗时。

您可以使用公式代理来更新文档。 只需选择“ None”作为目标(这很重要,因为我们需要使用@Commands,并且它们不适用于任何目标),并输入公式:

@Command([ToolsRefreshSelectedDocs])

然后选择要刷新的文档并在其上运行代理。

您还可以使用LotusScript Agent。这需要在选定的文档上运行:

Dim ses as New NotesSession
Dim db as NotesDatabase
Dim dc as NotesDocumentCollection
Dim doc as NotesDocument

Set db = ses.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument()
While not doc is Nothing
  Call doc.ComputeWithForm( False, False )
  Call doc.Save( True, true, True )
  Set doc = dc.GetNextDocument( doc )
Wend

当然,您可以-不仅仅是刷新所有文档-将该代码添加到您现有的代码中:

Set nvwQueuedOrderLines = dbCurrent.Getview("QueuedOrderLines")
Dim docOrderRegel As NotesDocument
Set docOrderRegel = nvwQueuedOrderLines.GetFirstDocument

If not docOrderRegel.HasItem( "Status" ) then
  Call docOrderRegel.ComputeWithForm( False, False )
End If

If docOrderRegel.Status(0) = "QUEUED" Then