2017-03-13 1 views
1

Die letzte Woche fragte ich, wie man einen Fehler in einem evaluate statement (Error in Evaluate statement macro) zu lösen.Auswerten Anweisung (@DbLookUp) funktioniert nicht mit Lotusscript

Sobald es zu beheben, habe ich andere Fehler mit der gleichen Auswertung, es gibt mir keinen Wert.

Ich werde beschreiben, was ich habe und was ich versuche.

@DbLookup in berechnen Text

Ich habe diesen Code in in einem Text berechnen und es funktioniert gut.

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.

Bewerten Statement (@DbLookup) in der Klasse

ich eine Klasse DirectorSucursal haben.

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 

Dann in einer Schaltfläche instanziiert ich das neue Objekt DirectorSucursal mit dem Parameter des Feldes doc.LlcPoliza (0) wie folgt aus.

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

Bewerten Statement (@DbLookup) in Klick-Taste

ich das gleiche, aber in einem Klick Unter versucht haben.

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

Meine Frage ist: , was mache ich falsch? Warum funktioniert der Code in einem Text mit @Formula, aber mit Lotusscript nicht?

Danke.

EDIT 1:

ich hinzugefügt haben und Error Goto, modifiziert, um den Klassencode, modifizierte @DbLookup in calculate Text, und ich habe diesen Fehler:

Error in EVALUATE macro

Antwort

2

1) Mein Vorschlag ist, niemals (oder zumindest sehr selten) Evaluate() in Lotusscript zu verwenden. Sie haben die richtige Lotusscript-Funktionalität, um fast alles zu machen. Einer der Hauptgründe ist, dass der Code sehr schwer zu debuggen ist (was Sie gerade erleben).

2) Verwenden Sie keine erweiterte Notation, wenn Sie mit Feldern arbeiten. Die beste Methode besteht darin, die Methoden GetItemValue und ReplaceItemValue der NotesDocument-Klasse aus Gründen der Leistung und der Kompatibilität zu verwenden.

3) In den Beispielen mit Schaltflächen haben Sie einen Verweis auf doc, aber es wird im Code nie deklariert oder initialisiert. Wenn Sie Option Declare oben in Ihrem Code verwenden würden, würden Sie diese Art von Fehlern feststellen.

4) Ich empfehle auch, die Replik-ID zu verwenden, um Datenbanken zu referenzieren, was es sehr schwierig macht, in der Zukunft zu warten. Wenn Sie nicht einen sehr guten und überzeugenden Grund haben, verweisen Sie stattdessen auf Server und Dateinamen.

Ich würde vorschlagen, dass Sie Ihren Code so etwas wie dieses Refactoring:

'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 natürlich die Schaltfläche Aktionen in der gleichen Art und Weise aktualisieren.

Ja, es ist ein paar Zeilen länger, aber es ist viel lesbarer und einfacher zu warten und zu debuggen. Und Sie haben auch Fehlerbehandlung.

+0

Vielen Dank für Ihre Ratschläge Karl. Und der Refactor des Codes ist besser als das Original. Ich stimme Ihnen zu, dass es lesbarer und einfacher zu pflegen ist. Ich schätze wirklich Ihre Ratschläge. Vielen Dank. In die Zukunft werde ich versuchen, die notesdocuments-Klasse zu verwenden. Ich muss viel lernen. – David

3

Bitte Dokumentation lesen und Hilfe verwenden ! bewerten immer gibt ein Array, wie in der Hilfe angegeben:

Return value
variant
The result of the evaluation. A scalar result is returned.

Code Um einen String zurück, müssen Sie es wie folgt zu ändern:

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 

Der CSTR ist nur da für den Fall, die @DBLookup gibt einen Fehler oder eine Zahl (beide möglich)

Nur ein paar Dinge im allgemeinen:

  • NIE w rite sogar eine Zeile LotusScript-Code ohne Fehlerhandler. Es wird Ihnen Schwierigkeiten bereiten.Wenn Sie Fehlerbehandlung an Ort und Stelle hatten, dann hätte es Ihnen gesagt, in welcher Zeile der Fehler aufgetreten ist ...
  • Verwenden Sie niemals das Ergebnis von @DBLookup ohne Prüfung auf @IsError ... Es wird viel Probleme beim Nachschlagen verursachen schlägt fehl.
  • Wenn Sie @Iserror verwenden, führen Sie das Lookup nicht zweimal durch, weisen Sie das Lookup einer Variablen zu und überprüfen Sie dieses für @Iserror, so. Andernfalls wird die Leistung in großen Formen nach unten gehen:

Beispiel:

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

EDIT: Wie Knut richtig die eigentliche Ursache für den Fehler in seiner Antwort angegeben war ein Tippfehler in der Formel (Fullname)" statt Fullname") . so gut, dass ich in meinem Beispiel fest

+0

Danke für Ihre Ratschläge, ich werde die @formula Codes ändern. Mit der Klasse habe ich es aber immer noch mit dem gleichen Fehler geändert. – David

2

ändert letzten Teil in @DbLoookup Code Zeile:

"FullName")}) 
+0

Perfekt! Vielen Dank Knut. – David