【问题标题】:Evaluate statement (@DbLookUp) doesn't work with Lotusscript评估语句 (@DbLookUp) 不适用于 Lotusscript
【发布时间】:2017-03-13 10:31:20
【问题描述】:

上周我问如何解决evaluate statement (Error 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,然后查找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 宏出错

【问题讨论】:

    标签: lotus-notes lotusscript lotus lotus-designer


    【解决方案1】:

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

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

    要让你的代码返回一个字符串,你需要像这样改变它:

    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 )
    

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

    【讨论】:

    • 感谢您的建议,我将更改@formula 代码。有了这个类,我已经改变了它,但它仍然有同样的错误。
    【解决方案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 当然会以同样的方式更新按钮操作。

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

    【讨论】:

    • 非常感谢卡尔的建议。并且代码的重构比原来的要好。我同意你的观点,它更易读,更容易维护。我真的很欣赏你的建议。谢谢。将来我会尝试使用 notesdocuments 类。我要学很多东西。
    【解决方案3】:

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

     "FullName")})
    

    【讨论】:

    • 完美!非常感谢克努特。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多