1

上周我询问了如何解决evaluate statementEvaluate 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是一个文档字段 ( doc.LlcPoliza),在文档中它具有例如值C2H2H2

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

它工作正常。

评估类中的语句 (@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)的值为C2H2H2GetCodSuc显示值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:

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

EVALUATE 宏中的错误

4

3 回答 3

3

请阅读文档并使用帮助!评估总是返回一个数组,如帮助中所述:

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

要使您的代码返回一个字符串,您需要像这样更改它:

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 返回错误或数字的情况(两者都可能)

一般只有几点:

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

例子:

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

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

于 2017-03-13T10:45:08.920 回答
2

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

 "FullName")})
于 2017-03-13T11:37:56.227 回答
2

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

2) 处理字段时不要使用扩展符号。出于性能原因和兼容性原因,最佳实践是使用 NotesDocument 类的 GetItemValue 和 ReplaceItemValue 方法。

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

4)我也不建议使用replica 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 当然以同样的方式更新按钮动作。

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

于 2017-03-16T01:45:25.013 回答