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.
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
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:
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.
Danke für die rege Anteilnahme und für die Unterstützung.
Ich denke, dass ich mich langsam dem Ziel nähere.
Ihr müsst mir aber nicht für meine Mut danken:
Ich kenn' mich schon ein wenig mit Lotus Script aus.
Bzw. ich weiss was die Befehle in dem Script bedeuten und wie es funktioniert.
Ich denke ihr kennt das: Quellcode lesen und verstehen ist etwas anderes, als Quellcode schreiben.
Ich benötige jedoch noch einmal eure Hilfe. Ich habe das Script nach Thomas' Vorschlag modifiziert.
On Error Goto ErrorHandling
Redim sDb(2)
sDb(0) = "db1.nsf"
sDb(1) = "db2.nsf"
sDb(2) = "db3.nsf"
iArray = Ubound(sDb())-1
For iCount = 0 To iArray
Set oDb = oSession.getDatabase(sMailServer,sDb(iCount))
If Not oDb Is Nothing Then
Call oUiWs.addDatabase(sMailServer,sDb(iCount))
Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")
End If
Next
ErrorHandling:
Print ("Eine Datenbank konnte nicht Ihrer Arbeitsoberfläche hinzugefügt werden.")
Resume
In meinem Praxisbeispiel war eine Datenbank für mich ohne Zugriff.
Beim "Set oDb" springt Notes direkt ins ErrorHandling.
Arbeit ich im ErrorHandling mit "Resume" bleibt der Ablauf im Errorhandling stecken. --> Endlosschleife.
Arbeite ich mit "Resume Next" springt Notes nach dem Set-Befehl in die IF-Abfrage und ich erhalte die Notes-typische Fehlermeldung, dass die Datenbank nicht geöffnet werden kann.
Also hänge ich am "Set oDB" fest. Würde ich ohne ErrorHandling arbeiten bzw. das ErrorHandling nach dem Set-Befehl abarbeiten, dann ensteht dort (beim Set) der Zugrifffehler.
Ich komme nicht zu IF-Abfage.
Ich weiss nicht mehr weiter.
@Glombi:
Ich habe deine Vorschläge mal ausprobiert.
On Error Goto ErrorHandling
' Und hier beginnen die Array-assignments für die Datenbanken
Redim sDb(2) ' Hier wird die Größe des Array fest definiert (Anzahl der DB - 1)
sDb(0) = "db1.nsf"
sDb(1) = "db2.nsf"
sDb(2) = "db3.nsf"
' Wieviel Elemente hat der Array - 1 (da ein Array immer mit 0 beginnt muss hier 1 subtrahiert werden)
iArray = Ubound(sDb())-1
For iCount = 0 To iArray
Set oDb = oSession.getDatabase(sMailServer,sDb(iCount))
If Not oDb Is Nothing Then
Call oUiWs.addDatabase(sMailServer,sDb(iCount))
Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")
End If
ErrorHandling:
Print ("Eine Datenbank konnte nicht Ihrer Arbeitsoberfläche hinzugefügt werden.")
Resume NextDB
NextDB:
iCount = iCount +1
Next
End Sub
Jedoch wird bei einer Datenbank MIT Zugriff auch das Errorhandling linear durchgeführt.
Ausserdem wird das ErrorHandling zweimal durchlaufen?
Und kann das sein, dass "iCount = iCount +1" überflüssig ist?
Soll ich vor dem Errorhandling ein zusätzliches "Next" setzen?
---
Wie lager ich das ErrorHandling denn programmiertechnisch 100%ig aus, so wie ein guter Programmierer es machen würde?
Irgendwie kommt mir das alles ein wenig provisorisch vor.