"Is Nothing"-Statement erst ab R6? Alternative?

  • Hi,


    leider konnte ich in der Hilfe nichts über das "Is Nothing"-Statement in LotusScript finden, muß aber wissen, ob es erst ab R6 ist. Allerdings ist @Nothing erst ab R6. Weiß das jemand von euch?


    Was wäre eine Alternative für dieses Statement? Ich kann ja schlecht


    If (doc = "") Then


    schreiben, oder?


    Grüsse

  • is nothing in Script sollte meiner meinung nach schon in R5 funktionieren.


    Auszug aus R5 Hilfe unter Nothing:
    LotusScript sets the initial value of an object reference variable to NOTHING. Use the Is operator to test an object reference variable for the NOTHING value.

  • Hallo,


    ich verstehe Dein Problem nur teilweise - brauche etwas mehr Infos!
    unter Notes R5 gilt auch:


    eine Schleife durchläuft alle Dokus einer Ansicht:



    While Not(doc_a Is Nothing)
    .
    .
    .


    Set doc_a = view_a.GetNextDocument(doc_a)


    Wend



    Hilft Dir das?



    Gruß
    broesel

    • Offizieller Beitrag

    "is Nothing" funktioniert auch schon in Notes 4.x


    ABER:
    set db = session.GetDatabase(ServerName, DBName)
    if Not db is Nothing then
    ...
    Kann in die Hose gehen, weil die DB existiert, Du aber nicht die rechte hast diese zu öffnen. Besser ist es in diesem Fall


    If not db.isOpen Then
    ...


    Verschiedendlich wird ein Objekt nicht auf Nothing gesetzt, wenn es nicht existiert. Dann hilft es das Objekt vorher definiert auf Nothing zu setzen. z.B.
    Set view = Nothing
    set view = db.GetView(ViewName)
    if Not view is Nothing then
    ...
    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Hallo Diali,


    ich kann das leider nicht nachvollziehen:


    Wenn ich keine Rechte habe, eine DB zu öffnen (Agent) und ich eine If-Anfrage einbaue, ob die DB.isopen
    ist, dann bricht LS ab und ich erhalte die Fehlermeldung objectvariable not set!!!!!!!!!!


    D. h. daß der else Zweig nicht durchlaufen wird.



    db_a.isOpen Then


    usw.


    Else
    Goto Error_DB
    End If


    usw.



    Hast Du darüber mehr Infos? - Ich kann gerade so eine Möglichkeit gut gebrauchen!




    Gruß
    broesel

    • Offizieller Beitrag


    Normalerweise brauchst Du bei diesem Code die Fehlerbehandlung nicht einschalten.


    Gruß
    Dirk

  • Guten Morgen Dirk,


    habe mich genau an Dein Script gehalten (Ausnahme: Set db = Nothing)


    und bei mir kommt objectvariable not set! - Schade


    Ich arbeite mit einem webqueryopen-Agenten


    Hast Du Dein Script getestet?



    Gruß
    broesel

    • Offizieller Beitrag

    habe es so mehrfach im Einsatz, allerdings nicht im WebQueryOpen.
    Beim WebQueryOpen arbeitest Du mir den Rechten des Servers auf der DB!


    Set Db sollte dann so aussehen
    Set db = session.GetDatabase("", DBName)


    Im WebQuerySave nutze ich schon LS

    Code
    Set db = session.GetDatabase("", doc_Prof.PfadDateiName(0))
    If db.isOpen Then


    Ist ein Auszug aus einem Script, welches seit ca einem Jahr läuft und die Fehlerbehandlung funtkioniert auch und dabe arbeite ich ohne On Error...


    Poste mal Dein Script, vielleicht liegt der Fehler an einer anderen Stelle.


    Gruß
    Dirk

  • Hallo Dirk,


    ich beziehe mich auf folgendes (Beitrag 7):





    Läuft Dein Script auch noch, wenn der ausführende kein Recht hat, die DB zu öffnen?-Nach meinen Erfahrungen knallt es dann - aber


    wenn Du das


    On error resume Next


    nach set db Is Nothing setzt, macht er natürlich was - es ist die Frage was. Das macht natürlich meine anderen Fehlerabfragen zunichte....


    In meinen Error-Fehler-Abfragen hatte ich ein Exit sub vergessen - mein Fehler ist nicht ObjectVariable not set, sondern ein allgemeiner Fehler und zwar hier:
    Set db = Nothing
    Set db = session.GetDatabase( Server, DBName )
    beim 2. set db - ich habe mir nämlich die Rechte auf die DB weggenommen - dadurch komme es erst gar nicht zur Abfrage, ob die DB nothing ist, bzw. isopen - es knallt nämlich schon viel früher.
    Wenn ich die entsprechenden DB Zugriffsrechte habe, habe ich natürlich kein Problem - aber das ist ja nicht der Sinn von Fehlerabfragen.


    Wie ich oben schon sagte:
    Läuft Dein Script auch noch, wenn der Ausführende kein Recht hat, die DB zu öffnen?-



    Gruß
    broesel

    • Offizieller Beitrag
    Zitat

    Läuft Dein Script auch noch, wenn der ausführende kein Recht hat, die DB zu öffnen?-Nach meinen Erfahrungen knallt es dann - aber


    ja läuft. Bei mir läuft ein script im WebQuerySave, welches mehrere DBs durchsucht und die Ergebnisse anzeigt. Die User haben kein Recht auf die DB im Notes oder Web zuzugreifen. Und es werden alle Ergebnisse aufgelistet, da der Agent mit den Serverrechten ausgeführt wird - sollte in dem Fall so sein. Falls Du mit Leserfeldern arbeitest, wird alles gefunden, auf das der Server Zugriff hat!


    Änder mal die Reihenfolge so:

    Code
    On Error Resume Next
    dim session as New NotesSession
    dim db as NotesDatabase
    Set db = session.GetDatabase("", DBName)
    If db.isopen tehn
    ...


    Wenn Du isOpen abfrägst brauchst Du in diesem Fall "Set db is Nothing" nicht.


    Gruß
    Dirk

  • Hallo Dirk,


    wir haben eine spezielle Entwickler ID mit der wir den Agenten unterschreiben. Was passiert, wenn Du in der ACL zusätzlich den Zugriff für denjenigen sperrst, der den Agenten unterschrieben hat? - dann müßte es doch knallen, oder?


    (und zwar hier: set db = session.GetDatabase(ServerName, DBName))



    Gruß
    broesel

    • Offizieller Beitrag

    wemm ich keinen Zugriff auf eine Db habe, bekomme ich ein db Objekt (ohne Fehlermeldung) und bei db.Isopen kommt ein False zurück.


    Mit Set db = session.GetDatabase("",DBName) wird die DB lokal auf dem Server geöffnet und sofern keine kon.ACL eingestellt ist, hast Du volle Rechte auf die DB.


    Gruß
    Dirk

  • Hallo Dirk,


    .... habe ich probiert! - Hilft nicht weiter - bin völlig verwirrt!


    1.) welchen Sinn hat die Abfrage, ob die DB is open? - wenn der Agent mit den Serverrechten läuft und der Server in der ACL der DB eingetragen ist, kommt es nicht vor, daß die DB nicht offen ist.


    2.) So wie ich die Sache verstehe, wird durch "on Error resume next", der Error überdeckt, der entsteht, wenn der Agent keine Rechte auf die DB hat - es ist aber trotzdem ein Error.


    3.) Wenn der Agent keinen Zugriff auf die DB hat, bekomme ich leider kein db Object


    4.) Hast Du mal das
    On Error Resume Next
    weggelassen - dies ist ja für 'ne Ausnahme und nicht für den Normalfall gedacht.



    Gruß
    broesel

  • Wenn der Server eingetragen ist, sollte db.isopen true zurueckliefern. Was aber, wenn man sich beim Dateinamen verschrieben hat.??
    dim db as new notesdatabase("","irgendeine.nsf").
    Hierbei bekommste zwar ein datenbank Objekt..aber dann wuerde db.isopen false liefern

    • Offizieller Beitrag

    zu 1.)
    bei fasch geschirebenem Dateinamen fällste sonst auf die Nase, weil Du ein db-Objekt bekommst und nicht Nothing.


    zu 2.)
    Die Fehlermeldung wird nicht ausgegeben und dann kannst Du mit Err <> 0 oder dem Fehlercode die Fehler in der nächsten Zeile selber abfangen.


    zu 3.)
    ??? ... solltest Du eigentlich bekommen, da habe ich mir mit "db is Nothing" schon mal die Zähne ausgebissen, weil die DB nicht existierte und das Objekt nicht Nothing war.


    zu 4.)
    ist im Normalfall nicht in meinen Codes drin, es sei denn ich kann Fehler nicht anders abfangen, dann schalte ich die Fehlerbehandlung ein und danach wieder aus.


    Z.B.
    On Error resume Next
    ... tu etwas eventuell mit Fehler
    If err <> 0 Then
    .... Fehler beheben oder auswerten
    End if
    On Error Goto 0


    Gruß
    Dirk

  • Hallo Dirk,


    was passiert denn in Deinem Code, wenn Du das


    On Error resume next


    wegläßt und der Agent keinen Zugriff auf die DB hat???????



    Bekommst Du dann wie ich einen Error?



    Gruß
    broesel

    • Offizieller Beitrag

    habe es jetzt einen Agent zum Testen geschrieben

    Code
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.GetDatabase("Test","test.nsf")
    If db.IsOpen Then
     Msgbox "geöffnet"
    else
     Msgbox "fehler"
    End If


    den Server Test gibt es nicht und es kommt auch kein Fehler, es wird nur "fehler" ausgegeben.


    Gruß
    Dirk