Autor Thema: Benötige Hilfe bei Script  (Gelesen 15276 mal)

bificypdog

  • Gast
Benötige Hilfe bei Script
« am: 30.10.03 - 17:27:01 »
Guten Tag,

ich habe ein Problem mit dem u.a. Script.
Mir wurde von einem entfernten Kollegen enorm geholfen, der auch hier
im Forum aktiv ist. Grüße und Dank.

Das Script soll einen NOTES.INI Eintrag setzen. Das funktioniert.
Außerdem soll eine Reihe von Datenbanken in der Arbeitsbereichseite hinzugefügt werden. Aber nur, wenn die Rechte vorhanden sind.
Also ein INSTALL-Script für alle Mitarbeiter.

Jedoch erhalte ich einen "Overflow"-Fehler, weil "iCount" bis 32767 zählt.
Ist wird innerhalb des Error-Handling-Abschnitts hochgezählt.
Das Script springt nicht mehr in die Schleife zurück.

Wenn ich das "Resume" entferne, dann wird nur in 2er Schritten gezählt.
Aber ich will ja jede Datenbank haben.

Leider bin ich überhaupt kein Script-Profi. Vielleicht könnt ihr mir einen Tipp geben. Ich denke, dass es nur eine Kleinigkeit ist.

Vielen Dank.



Code
Sub Click(Source As Button)
   Dim oSession As New NotesSession
   Dim oDb As NotesDatabase
   Dim oUiWs As New NotesUiWorkspace
   Dim sDb() As String  ' String-Array für die div. Datenbanken
   Dim sServer As String  ' String für den Server
   Dim iCount As Integer   ' Integer zum counten in der Forall-Loop
   Dim iArray As Integer     ' Integer für die Größe des Array
   Dim oReg As New NotesRegistration
   Dim db As NotesDatabase
   Dim sUser As String
   Dim sMailServer As String
   Dim sUsersServerChoice As String
   
   Const VBMADMINDB$ = "ADMIN\ADMIN.NSF" 'Pfad und Filename der ADMIN-Datenbank 
   
   Set db =oSession.CurrentDatabase
   sServer = db.server
   Set oSession = New NotesSession
   Set oUiWs = New NotesUiWorkspace
   
   oReg.RegistrationServer = sServer
   sUser = oSession.Username
   
   Call oReg.getUserInfo(sUser,sMailServer)
   
   Dim cMailServer As New NotesName(sMailServer)
   
'*************************************************************************** 
'User nach dem Server fragen / Hierbei wird als Default sein Mail-Server angeboten
'***************************************************************************
   
   sUsersServerChoice = Inputbox$ ("Bitte wählen Sie den Server Ihrer Fililale:", _ 
   "Server", cMailServer.common)
   If sUsersServerChoice = "" Then Exit Sub 'Klickt der Nutzer auf Cancel wird die Funktion sofort verlassen
   
'*************************************************************************** 
'NOTES.INI Einträge setzen
'***************************************************************************
   
   Call oSession.SetEnvironmentVar("AdminPfad",sUsersServerChoice+"!!"+VBMADMINDB,False)     
   
'*******************************************************************************
'Prüfen, ob NOTES.INI Einträge korrekt gesetzt
'*******************************************************************************
   iEnvironmentValidation = 1 'Validierungs-Variable initialisieren
   If Not oSession.GetEnvironmentString("AdminPfad",False) = sUsersServerChoice+"!!"+VBMADMINDB Then iEnvironmentValidation = 0
   
'Wenn NOTES.INI Einträge nicht so ausgelesen werden, wie sie eigentlich geschrieben wurden: Abbrechen + Fehlermeldung
   If Not iEnvironmentValidation = 1 Then
      errormessage = |Die benötigten Einträge in der Datei NOTES.INI Ihres Clients konnten nicht korrekt gesetzt werden.
Bitte versuchen Sie erneut. Sollten Sie diese Fehlermeldung wieder auftreten, informieren Sie Ihren System-Administrator.|
      Messagebox errormessage,16,"Admin-Pfad in der NOTES.INI falsch."
      Exit Sub
   Else  
      Print "Notes.ini Ihres Client wurde erfolgreich angepaßt."
   End If
   
'*************************************************************************** 
'Datenbanken hinzufügen
'***************************************************************************
   
     ' In diesem Fall bietet sich kein Resume an, sondern hier sollte bei einem Fehlerfall zu einer Sprungmarke gewechselt werden.
   On Error Goto ErrorHandling  
   
     ' Und hier beginnen die Array-assignments für die Datenbanken
   Redim sDb(25) ' Hier wird die Größe des Array fest definiert (Anzahl der DB - 1)
   sDb(0) = "db1.nsf"   
                (...)
   sDb(25) = "db2.nsf"       
   
     ' Wieviel Elemente hat der Array - 1 (da ein Array immer mit 0 beginnt muss hier 1 subtrahiert werden)
   iArray = Ubound(sDb())-1
   
     ' So jetzt beginnen wir die Schleife
   For iCount = 0 To iArray
         ' Wenn jetzt der Fehler aufläuft, dann wird in der Sprungmarke weitergemacht.
      Set oDb = oSession.getDatabase(sMailServer,sDb(iCount))
          ' Wenn die DB noch nicht offen ist => Öffnen
      If oDb.isopen=False Then
         Call oDb.open("","") 
      Else             
               ' Super, die DB ist offen => dann fügen wir die Db dem Workspace hinzu...
         Call oUiWs.addDatabase(sMailServer,sDb(iCount))
         Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")    
      End If
      
      
ErrorHandling:          
          ' Der Trick ist die Nutzung der Sprungmarke. Wenn die DB nicht geöffnet werden darf, dann wird hierhin verzweigt.
          ' Somit wird die Schleife nicht verlassen und der Array hochgecountet.
      iCount = iCount + 1
'          Resume
   Next   
   
   Print ("Die Datenbanken wurden erfolgreich hinzugefügt.")
'    Msgbox "Ihr Client wurde erfolgreich konfiguriert!",64,"Konfiguration erfolgreich"     
   
End Sub

« Letzte Änderung: 30.10.03 - 17:27:57 von bificypdog »

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #1 am: 30.10.03 - 17:36:17 »
>> Ich denke, dass es nur eine Kleinigkeit ist.


Das denkt man immer !!

Genauso wie man immer nach dem zweitletzten Fehler sucht. Hat man ihn gefunden, kommt der nächste zweitletzte Fehler. Den letzten Fehler findet man nie.

Weiter: ein ganz kurzer Blick hat gezeigt: Das Resume des Error-Handlings ist auskommentiert. Das ist schon mal ein katastrophaler Zustand.

Nochmal weiter: Das Error-Handling steckt miten in einem For-Next Loop!    Never, never, never do that!

Ok, ich hab noch nicht einmal den -- für Gratis-Support doch recht ufangreichen -- Code studiert, um gleich über merkwürdigste Erscheinungen zu stolpern. Ich denke mal, wenn Du da nicht in massive Probleme reinlaufen willst, übergibst Du das als Auftrag jemandem, der das innert kürzester Zeit lösen kann, denn selbst mit unserer Hife ist die Sache mit riesigen Unsicherheiten verbunden und -- die gesamte investierte Zeit von Dir und den Leuten, die sich hier gedanken machen massiv mehr als was ein Profi da reinstecken müsste (ich schätze mal, dass es sich in diesem Fall um einen Faktor 20 bis 50 handeln dürfte, also extrem ...)
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #2 am: 30.10.03 - 17:38:40 »
Der Overflow wird durch den Datentyp Integer erzeugt.
An Integer value is a whole number in the range -32768 to 32767, inclusive.

Nimm anstelle von Integer besser Long oder Single.

Also
Dim iCount As Long
Dim iArray As Long

Andreas

P.S. Ich muss dazu sagen, dass ich mir den Code nicht angesehen habe, nur die Fehlermeldung und das Dim as Integer
Im übrigen gilt das Gesagte von Semeaphorus...
« Letzte Änderung: 30.10.03 - 17:41:33 von Glombi »

Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Benötige Hilfe bei Script
« Antwort #3 am: 30.10.03 - 17:43:01 »
Vorab wieder meine Warnung, Code zu verwenden, den man nicht versteht - da kann sonstwas passieren ...

Andreas hat mit seiner Lösung natürlich vollkommen recht (wenn im Code nicht noch was anderes steckt - ich kann das jetzt nicht alles durchsehen).
Ich würde aber folgendes dringend empfehlen:
Der ursprüngliche Ersteller des Scripts hat sich wenigstens halbwegs an übliche naming conventions gehalten - SEHR wertvoll für professionelles Programmieren. Du solltest also nicht nur
Dim iCount as Integer
ersetzen, sondern
Dim lCount as Long
verwenden und per Suchen und Ersetzen jedes iCount durch lCount austauschen.

Der nächste Profi, der an das Script 'ran muss, wird es Dir danken.

HTH,
Bernhard

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #4 am: 30.10.03 - 17:44:47 »
Jo, ich hab auch nicht mehr Code angesehen, bin aber offensichtlich über schlimmeres gestolpert als Du, Andreas. Aufgrund meiner Stellen befürchte ich schlimmeres, Long Int wird das Problem wohl nur einfach zeitlich hinausschieben, so aus dem hohlen Bauch geschätzt
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #5 am: 30.10.03 - 17:52:08 »
Hi Jens,
in diesem Fall würde ich das programmierte Error Handling mal tolerieren. Es macht Sinn, denn es gibt wohl sonst keine Möglichkeit zu prüfen, ob der User das Recht hat, auf die Datenbank zuzugreifen.
Falls der User nicht das Recht hat, erzeugt

oDb = oSession.getDatabase(sMailServer,sDb(iCount))

oder spätestens

          ' Wenn die DB noch nicht offen ist => Öffnen
      If oDb.isopen=False Then
         Call oDb.open("","")

einen Fehler.

Sauberer wäre es allerdings, nicht On Error Goto... zu verwenden, sondern explizit die Fehlernummer abzufragen
Also
On Error 4000 goto...
(wobei ich nicht weiß ob tatsächlich die 4000 kommt, das müsste man ausprobieren).

Andreas
« Letzte Änderung: 30.10.03 - 17:53:08 von Glombi »

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #6 am: 30.10.03 - 17:56:51 »
Das war ja nicht, was ich angekreidet habe. Die Position innerhalb eines Loop und das fehlende (bzw. auskommentierte) Resume stellen das Problem dar. Mit dem "nackten" on Error könnte man zur Not noch leben, ist ja eigentlich egal, warum man die DB nicht erreicht, sauberer ist Deine Variante in jedem Fall.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Benötige Hilfe bei Script
« Antwort #7 am: 30.10.03 - 17:58:09 »
Oh Mann, Jens, Du hast vollkommen recht. Soweit hatte ich noch gar nicht geschaut (keine Zeit).
Jedenfalls ist das ein ErrorHandling, dass bestimmt noch Kopfzerbrechen bereiten wird.
Beweis: Es gibt keinen Grund, daß die Limits von Integer erreoicht werden - es gibt ja nur 26 hinzuzufügende DBs.
Long hilft also gar nicht weiter - es dauert nur erheblich länger bis zur Fehlermeldung.

Bye,
Bernhard



PS: By the way - es heisst auch "Filiale" und nicht "Fililale" ;-)

Glombi

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #8 am: 30.10.03 - 18:05:27 »
Ich glaube, uns liegt nicht der Originalcode vor sondern eine abgespeckte Version. Oder bificypdog?

Ausserdem wird es selbst nicht mit Long gehen, da ein Array folgende Limitierungen hat:

Bounds of a dimension: -32,768 to 32,767 (the range of values of the Integer data type)

Und dann ist das On Error... natürlich fatal, da der Fehler nicht wegen des fehlenden Zugriffs auftritt sondern wegen des Overflows.

Andreas

bificypdog

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #9 am: 30.10.03 - 18:22:05 »
Ich muss etwas hinzufügen:
Der ursprüngliche Ersteller des Scripts hat seine Arbeit sehr gut gemacht.
Jedoch war ich anschließend noch mal dran und habe drei Scripts zusammengefasst.

Was wichtiges:
Das Resume habe ich nur zum Debuggen auskommentiert.
Beim Posten des Beitrags habe ich vergessen den "REM" zu entfernen.

Das Script zählt so hoch (hier "nur" bis 32767), weil Notes in folgender Schleife nach dem ersten Durchlauf festsitzt:

Code
ErrorHandling:          
          ' Der Trick ist die Nutzung der Sprungmarke. Wenn die DB nicht geöffnet werden darf, dann wird hierhin verzweigt.
          ' Somit wird die Schleife nicht verlassen und der Array hochgecountet.
      iCount = iCount + 1
'          Resume
   Next  

Ihr seid doch Profis. Könntet ihr das Script mal ausprobieren? Bitte?

Ich habe übrigens nichts weggelassen. Ich habe nur die DB-Namen und den Namen der Konstante verändert. Man muss ja nicht gleich wissen, worum es hier geht.

Danke.

bificypdog

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #10 am: 30.10.03 - 18:24:55 »
Zitat
Ok, ich hab noch nicht einmal den -- für Gratis-Support doch recht ufangreichen -- Code studiert, um gleich über merkwürdigste Erscheinungen zu stolpern. Ich denke mal, wenn Du da nicht in massive Probleme reinlaufen willst, übergibst Du das als Auftrag jemandem, der das innert kürzester Zeit lösen kann, denn selbst mit unserer Hife ist die Sache mit riesigen Unsicherheiten verbunden und -- die gesamte investierte Zeit von Dir und den Leuten, die sich hier gedanken machen massiv mehr als was ein Profi da reinstecken müsste (ich schätze mal, dass es sich in diesem Fall um einen Faktor 20 bis 50 handeln dürfte, also extrem ...)

Da kann ich dir zustimmen. Aber was soll ich machen?
Da ich davon ausgehe, dass es sich hier wirklich nur um eine Kleinigkeit handelt, dachte ich, ich frage mal die Profis, die direkt auf Anhieb den Fehler finden.

Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Benötige Hilfe bei Script
« Antwort #11 am: 30.10.03 - 18:29:26 »
Tja, ich würde mal sagen, daß ist ein Fall, womit wir (Profis) unser Geld verdienen (und da Kleinvieh auch Mist macht - das wäre wohl in einer Stunde erldigt, wenn die genauen Spezifikationen vorliegen, und in zwei Stunden, wenn das ganze Teil auch noch konfigurierbar sein soll).

Ich werde also keinen weiteren Kannibalismus mehr betreiben und schweige jetzt fein still.

Bernhard

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re:Benötige Hilfe bei Script
« Antwort #12 am: 30.10.03 - 18:37:49 »
Statt

Zitat
If oDb.isopen=False Then
         Call oDb.open("","")
      Else            
              ' Super, die DB ist offen => dann fügen wir die Db dem Workspace hinzu...
         Call oUiWs.addDatabase(sMailServer,sDb(iCount))
         Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")    
      End If

Also, wenn ich das richtig deute, lässt du das Script über alle Datenbanken laufen und prüfst mittels Call oDb.open, ob der User die Datei öffen kann. Wenn ja, dann ab damit auf den Arbeitsbereicht, wenn nicht weiter zur nächsten Db.
Dann solltest du es mal mit

     Call oDb.open("","")
     If oDb.isopen Then
        ' Super, die DB ist offen => dann fügen wir die Db dem Workspace hinzu...
         Call oUiWs.addDatabase(sMailServer,sDb(iCount))
         Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")    
      End If

next

probieren und den ganzen quatsch mit errorhandling weglassen. was soll das eigentlichin einem Errorhandling einen Zähler zu erhöhen ?? Sehr ausgefeiltes Handling !

eknori
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #13 am: 30.10.03 - 18:41:19 »
Ich schliesse mich meinem praescriba an.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #14 am: 30.10.03 - 19:06:14 »
Der Overflow wird übrigens erzeugt, weil hinter Resume nichts mehr steht. LotusScript erwartet da ein Argument, welches hier fehlt. Daher wird ein Error erzeugt und dann geht es immer so weiter.

So wäre es richtig:

... ... ...

  ' Wieviel Elemente hat der Array - 1 (da ein Array immer mit 0 beginnt muss hier 1 subtrahiert werden)
   iArray = Ubound(sDb())-1
   
    ' So jetzt beginnen wir die Schleife
   For iCount = 0 To iArray
        ' Wenn jetzt der Fehler aufläuft, dann wird in der Sprungmarke weitergemacht.
      Set oDb = oSession.getDatabase(sMailServer,sDb(iCount))
          ' Wenn die DB noch nicht offen ist => Öffnen
      If oDb.isopen=False Then
         Call oDb.open("","")
      Else            
              ' Super, die DB ist offen => dann fügen wir die Db dem Workspace hinzu...
         Call oUiWs.addDatabase(sMailServer,sDb(iCount))
         Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")    
      End If
     
     
ErrorHandling:          
          ' Der Trick ist die Nutzung der Sprungmarke. Wenn die DB nicht geöffnet werden darf, dann wird hierhin verzweigt.
          ' Somit wird die Schleife nicht verlassen und der Array hochgecountet.
 

   Resume NextDB
NextDB:
      iCount = iCount + 1
Next  



Andreas
« Letzte Änderung: 30.10.03 - 19:06:57 von Glombi »

Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Benötige Hilfe bei Script
« Antwort #15 am: 30.10.03 - 21:21:51 »
Andreas, das wird auch nix ...

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #16 am: 30.10.03 - 22:10:51 »
Nope Andreas, Resume kann ohne Argument stehen (oder sollte wenigstens), sonst bricht es ANSI-Basic.  Hier die Defnition aus der Designer-Hilfe:

Resume [ 0 | Next | label ]

Sprich, die ganzen Argumente sind fakultativ, wobei

Resume
und
Resume 0

die gleiche Bedeutung haben: das Statement, das den Fehler verursachte, noch einmal ausführen. Wie gesagt, wir kommen dann gelegentlich noch auf Einzelheiten :-)
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #17 am: 31.10.03 - 09:45:53 »
Ich hatte es gestern ausprobiert: Solange ich nur Resume hatte, ist er mir immer in einen Fehler gelaufen und dann wieder zur Sprungmarke, so dass ich den Überlauf hatte.
Erst mit Einfügen der Sprungmarke Resume NextDB hat es dann geklappt.
Mit Resume 0 tritt der Fehler auch auf, denn:

Resume [ 0 ] directs LotusScript to execute again the procedure-calling statement that produced the error.

Und hier gilt wohl: Einmal Fehler, immer Fehler.

Andreas
« Letzte Änderung: 31.10.03 - 09:46:23 von Glombi »

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re:Benötige Hilfe bei Script
« Antwort #18 am: 31.10.03 - 09:48:52 »
Resume und Resume 0 sind Synonyme und versuchen, den Code nochmal auszuführen. Genau dieses Szenario steht in meinen Grundlagen als ACHTUNG drin: wenn der Fehler nicht beseitigt wird, gibts nen Endlos-loop, genau das haben wir hier.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

MOD

  • Gast
Re:Benötige Hilfe bei Script
« Antwort #19 am: 31.10.03 - 10:59:05 »
@Moderatoren
Gehört das nicht in den Bereich Entwicklung?

 ;D MOD

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz