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

Evaluate statement (@DbLookUp) doesn't work with Lotusscript

上周我问了如何解决 evaluate statement () 中的一个错误。

修复后,相同的评估语句出现其他错误,它没有给我任何价值。

我会描述我所拥有的和我尝试的。

计算文本中的@DbLookup

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

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

LlcPoliza is a document field (doc.LlcPoliza) and in a document it has for example the value C2H2H2.

The formula give first the value C2 and then look up into People2 who is D+C2 and give me a person.

It works fine.

在 Class

中计算语句 (@DbLookup)

我有一个 class 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

The field doc.LlcPoliza(0) has the value C2H2H2. GetCodSuc show the value C2, but the function getNameDirector doesn't work.

It shows the error: Operation failed

在单击按钮中评估语句 (@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

The field doc.LlcPoliza(0) has the value C2H2H2. But it doesn't work

It shows the error: Operation failed

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

谢谢。

编辑 1:

我添加了错误转到,修改了 class 代码,修改了计算文本中的@dblookup,但我遇到了这个错误:

Error in EVALUATE macro

请阅读文档并使用帮助!始终评估 returns 一个 ARRAY,如帮助中所述:

Return value
variant
The result of the evaluation. A scalar result is returned.

要使您的代码 return 成为 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

CStr 仅用于 @DBLookup return 错误或数字(两者都可能)的情况

一般情况下只有几件事:

  • 永远不要在没有错误处理程序的情况下编写哪怕一行 LotusScript- 代码。这肯定会给你带来麻烦。如果您有适当的错误处理,那么它会告诉您错误发生在哪一行...
  • 切勿在不检查@IsError 的情况下使用@DBLookup 的结果...当查找失败时会造成很多麻烦。
  • 如果您使用@Iserror,则不要执行两次查找,将查找分配给一个变量并检查@Iserror 的那个变量,就像这样。否则性能将大幅下降:

示例:

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

编辑:正如克努特在他的回答中正确指出的那样,错误的真正原因是公式中的错字(Fullname)" 而不是我在示例中修复的 Fullname")

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

 "FullName")})

1) 我的建议是永远不要(或至少很少)在 Lotusscript 中使用 Evaluate()。您拥有适当的 Lotusscript 功能来完成几乎所有事情。 主要原因之一是代码很难调试(这就是您现在遇到的情况)。

2) 在处理字段时不要使用扩展符号。出于性能原因和兼容性原因,最佳做法是使用 NotesDocument class 的 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

安藤当然用同样的方式更新按钮动作。

是的,它多了几行,但它的可读性更高,也更易于维护和调试。你也有错误处理。