评估语句 (@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
安藤当然用同样的方式更新按钮动作。
是的,它多了几行,但它的可读性更高,也更易于维护和调试。你也有错误处理。
上周我问了如何解决 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 functiongetNameDirector
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 workIt 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
安藤当然用同样的方式更新按钮动作。
是的,它多了几行,但它的可读性更高,也更易于维护和调试。你也有错误处理。