上周我问过如何解决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 ,然后查看 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宏中的错误
答案 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就在那里
一般来说只有几件事:
示例:
_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当然以同样的方式更新按钮操作。
是的,它延长了几行,但它更易读,更易于维护和调试。而且你也有错误处理。