评估语句(@DbLookUp)不适用于Lotusscript

时间:2017-03-13 10:31:20

标签: lotus-notes lotusscript lotus lotus-designer

上周我问过如何解决evaluate statementError in Evaluate statement macro)中的错误。

一旦修复它,我在同一个评估语句中有其他错误,它没有给我任何价值。

我将描述我拥有的和我尝试的内容。

计算文字中的@DbLookup

我将此代码放入计算文本中,它可以正常工作。

suc := @Trim(@Left(LlcPoliza;2));
_lkp := _lkp := @DbLookup("":"NoCache";"C1256EAD:00478951";"People2"; "D"+suc; "FullName");
@If( @IsError( _lkp ) ; " " ; _lkp );
@Name([CN];_lkp)
  

LlcPoliza是一个文档字段(doc.LlcPoliza),在文档中,它具有值 C2H2H2

     

公式首先给出值 C2 ,然后查看 D + C2 People2并给我一个人。

     

工作正常。

评估一个类

中的语句(@DbLookup)

我有一个类DirectorSucursal。

Class DirectorSucursal

    Private m_branch As String

    'Constructor class
    Public Sub New (branch)
        Dim subString As String
        subString = Left(branch, 2)
        me.m_branch = subString
    End Sub

    'Deleter Class
    Public Sub Delete

    End Sub

    'Sub show the code about Suc
    Public Sub GetCodSuc
        MsgBox m_branch
    End Sub

    'Function get the name director
    Public Function getNameDirector As String
      Dim varResult As Variant
      varResult = Evaluate({@DbLookup("":"NoCache";"C1256EAD:00478951";"People2"; "D} & m_branch & {"; "FullName)"})
      getNameDirector = CStr( varResult(0) )
    End Function

End Class

然后,在一个按钮中,我使用字段doc.LlcPoliza(0)的参数来实例化新对象DirectorSucursal。

Sub Click(Source As Button)
    Dim director As New DirectorSucursal(doc.LlcPoliza(0))
    director.GetCodSuc
    director.getNameDirector
end Sub
  

字段doc.LlcPoliza(0)的值为 C2H2H2 GetCodSuc显示值 C2 ,但函数getNameDirector不起作用。

     

显示错误:   操作失败

点击按钮

评估声明(@DbLookup)

我尝试了相同的但是点击子。

Sub Click(Source As Button)
    Dim subString As String
    subString = Left(doc.LlcPoliza(0), 2)

    Dim eval As String
    eval = Evaluate({@DbLookup("":"NoCache";"C1256EAD:00478951";"People2"; "D} & subString & {"; "FullName)"})

    Msgbox eval
End Sub
  

字段doc.LlcPoliza(0)的值为 C2H2H2 。但它不起作用

     

显示错误:   操作失败

我的问题是:我做错了什么?为什么代码在使用@Formula但使用Lotusscript的计算文本中正常工作?

感谢。

编辑1:

我添加了Error Goto,修改了类代码,在计算文本中修改了@dblookup,我有这个错误:

  

EVALUATE宏中的错误

3 个答案:

答案 0 :(得分:3)

请阅读文档并使用帮助! evaluate总是返回一个ARRAY,如帮助中所述:

  

返回值
  的 变体
  评估结果。返回标量结果。

要使代码返回STRING,您需要更改它:

Public Function getNameDirector As String
    Dim varResult as Variant
    varResult = Evaluate({@DbLookup("":"NoCache";"C1256EAD:00478951";"People2"; "D} & m_branch & {"; "FullName")})
    getNameDirector = Cstr( varResult(0) )
End Function

对于@DBLookup返回错误或数字(两者都可能)的情况,CStr就在那里

一般来说只有几件事:

  • 甚至不写错误处理程序的一行LotusScript代码。它会给你带来麻烦。如果您有错误处理,那么它会告诉您错误发生在哪一行......
  • 永远不要使用@DBLookup的结果而不检查@IsError ...当查找失败时会造成很多麻烦。
  • 如果您使用@Iserror,则不要两次执行查找,将查找分配给变量并检查该变量是否为@Iserror,如下所示。否则,表现会以较大的形式下降:

示例:

_lkp := @DbLookup("":"NoCache";"C1256EAD:00478951";"People2"; "D"+suc; "FullName");
@If( @IsError( _lkp ) ; " " ; _lkp )

编辑:正如Knut在他的回答中正确指出的那样,错误的真正原因是公式中的拼写错误(Fullname)"而不是Fullname")我也在我的例子中修正过。

答案 1 :(得分:2)

将@DbLoookup代码行中的最后一部分更改为:

 "FullName")})

答案 2 :(得分:2)

1)我的建议是永远(或至少很少)在Lotusscript中使用Evaluate()。你有适当的Lotusscript功能来做几乎所有事情。 其中一个主要原因是代码很难调试(这正是您现在所经历的)。

2)使用字段时,请勿使用扩展表示法。最佳实践是出于性能原因以及兼容性原因使用NotesDocument类的GetItemValue和ReplaceItemValue方法。

3)在带按钮的示例中,您有对doc的引用,但它从未在代码中声明或初始化。如果你在代码的顶部使用Option Declare,你会发现这些错误。

4)我还建议不要使用副本ID来引用数据库,这使得将来很难维护。除非你有一个非常好的和令人信服的理由,否则请用服务器和文件名来引用它们。

我建议您将代码重构为以下内容:

'Function get the name director
Public Function getNameDirector() As String
  Dim db as NotesDatabase
  Dim view as NotesView
  Dim doc as NotesDocument
  Dim key as String
  Dim fullname As String
  Dim varResult As Variant

  Set db = New NotesDatabase("Server/Domain","path/database.nsf")
  If db Is Nothing Then
      MsgBox "Unable to open 'path/database.nsf'"
      Exit Function
  End if
  Set view = db.GetView("People2")
  If view Is Nothing Then
      MsgBox "Unable to access the view 'People2'"
      Exit Function
  End if
  key = "D" & m_branch 
  Set doc = view.GetDocumentByKey(key)
  If doc Is Nothing Then
      MsgBox "Could not locate document '" & key & "'"
      Exit Function
  End if
  fullname = doc.GetItemValue("FullName")(0)
End Function

Ando当然以同样的方式更新按钮操作。

是的,它延长了几行,但它更易读,更易于维护和调试。而且你也有错误处理。