1

先週、evaluate statement( Evaluate ステートメント マクロのエラー) のエラーを解決する方法を尋ねました。

修正すると、同じ評価ステートメントで他のエラーが発生し、値が得られません。

私が持っているものと試したことを説明します。

テキスト計算の @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+C2People2が誰であるかを調べて、私に人を与えます。

それは正常に動作します。

クラス内のステートメント (@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です。GetCodSucC2を表示しますが、関数は機能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 マクロのエラー

4

3 に答える 3

3

ドキュメントを読み、ヘルプを使用してください。ヘルプに記載されているように、常に 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

CStr は、@DBLookup がエラーまたは数値 (どちらも可能) を返す場合に備えてあります。

一般的ないくつかのこと:

  • エラーハンドラなしで、LotusScript コードを 1 行も書かないでください。それは確かにあなたに問題を引き起こします。エラー処理が適切に行われている場合、エラーが発生した行が通知されます...
  • @IsError をチェックせずに @DBLookup の結果を決して使用しないでください。ルックアップが失敗すると、多くの問題が発生します。
  • @Iserror を使用する場合は、ルックアップを 2 回実行せずに、変数にルックアップを割り当て、次のように @Iserror をチェックします。そうしないと、パフォーマンスが大幅に低下します。

例:

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

編集:クヌートが彼の答えで正しく述べたように、エラーの本当の原因は式のタイプミスでした(Fullname)"代わりにFullname")、私の例でも修正しました.

于 2017-03-13T10:45:08.920 に答える
2

1) 私の提案は、Lotusscript で Evaluate() を決して (または、少なくともほとんど) 使用しないことです。ほとんどすべてのことを行うための適切な Lotusscript 機能があります。主な理由の 1 つは、コードをデバッグするのが非常に難しいことです (これが現在発生していることです)。

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

もちろん、安藤さんも同じようにボタンアクションを更新しています。

はい、数行長くなりますが、はるかに読みやすく、保守とデバッグが容易です。また、エラー処理もあります。

于 2017-03-16T01:45:25.013 に答える