如何在LotusScript函数中设置文档参数?

时间:2013-05-28 03:31:39

标签: lotusscript

考虑以下示例。 preferencesDoc作为空值传入。它在此函数中的赋值被忽略,并且在集合之后它保持不变。 tmpDoc设置得很好。两个作业都是相同的,因此它不是视图问题。 preferenceDoc的赋值被阻止,显然是因为它是一个参数。没有错误,并且按键查找工作正常,这可以通过成功分配tmpDoc来证明。

Function test(preferencesDoc As NotesDocument) 
    If preferencesDoc Is Nothing then
        Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
    End if

    Dim tmpDoc As NotesDocument
    Set tmpDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
End Function 

有人可以解释这里发生了什么以及如何解决这个问题吗?

澄清。

很高兴看到人们在想法中掏钱。但是,你必须意识到这个功能只是为了说明我的问题。这是一个简单的方法,可以帮助我沟通问题,而不是我的真实代码的一部分。请留意这个问题。

同样,如果将preferencesDoc作为空传入,则完全忽略函数中的“修复”赋值。 Tode似乎在做点什么。当我传入设置的preferenceDoc时,我可以将其重新分配给不同的doc。

答案

call test(Nothing) // will not work

---

Dim doc as NotesDocument
call test(doc) // will work

来自Tode的关键语句:如果您将“Nothing”作为参数传递,那么它将保持不变。如果您传递未初始化的NotesDocument,那么它将被初始化。

Tode和Knut都很重要,我认为Rich暗示同样的事情。谢谢。我相信克努特是第一个,所以我会赞美他。

我在Notes编写的所有年份,这是我第一次遇到这个问题。每天学习一些东西。 :)

3 个答案:

答案 0 :(得分:1)

这在LotusScript中是正常的。如果你传入“nothing”,那么这不是NotesDocument类型的Object,而只是“Nothing”......并且没有任何东西不能赋值。

但是你已经做了正确的事:使用一个函数。

你可以这样调用这个函数:

Set preferenceDoc = test(preferenceDoc) 

是对的。但是你忘了送回一份文件。你的功能应如下所示:

Function test(preferenceDoc as NotesDocument) As NotesDocument
  Dim docTemp as NoresDocument
  If preferenceDoc is Nothing then
    Set docTemp = docLkpView.GetDocumentBykey( "GENERAL_PREFERENCES", True )
  Else
    Set docTemp = preferenceDoc
  End If
  ' here comes the "magic"
  Set test=docTemp
End Function

当然你可以完全取出docTemp,只需用相应行中的函数名替换docTemp,那么你就不需要最后一行......

答案 1 :(得分:1)

您的代码确实有效。只需使用Call test(doc)调用您的函数即可使用

进行测试
Dim doc As NotesDocument
Call test(doc)
If doc Is Nothing Then
    Print "Nothing"
Else
    Print doc.form(0)
End If 

获取首选项文档的一种更舒适的方法是不使用参数:

Function GeneralPreferences() As NotesDocument
    Static preferencesDoc As NotesDocument
    If preferencesDoc Is Nothing Then
        ' ... get your docLookupView
        Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True)
    End If
    Set GeneralPreferences = preferencesDoc
End Function

然后你可以使用这样的结果

Print GeneralPreferences.form(0)
Print GeneralPreferences.created

并且您不需要声明额外的NotesDocument。使用preferencesDoc的Static,文档只从数据库中读取一次 - 它在函数中被“缓存”

答案 2 :(得分:0)

对象通过引用传递,因此您描述的行为肯定是奇怪的。但作为一种风格问题,我不建议无论如何都这样做。 Sode效应模糊了代码的逻辑。您的函数应声明为返回NotesDocument,并应通过

调用
Set doc = test(doc)