Domino 9 und frühere Versionen > Administration & Userprobleme
Benötige Hilfe bei Script
bificypdog:
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
--- Ende Code ---
Semeaphoros:
>> 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 ...)
Glombi:
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...
koehlerbv:
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
Semeaphoros:
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
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln