Das Notes Forum

Domino 9 und frühere Versionen => Administration & Userprobleme => Thema gestartet von: bificypdog am 30.10.03 - 17:27:01

Titel: Benötige Hilfe bei Script
Beitrag von: bificypdog 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

Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros 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 ...)
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi 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...
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros 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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv 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" ;-)
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog 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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog 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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: eknori 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros am 30.10.03 - 18:41:19
Ich schliesse mich meinem praescriba an.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv am 30.10.03 - 21:21:51
Andreas, das wird auch nix ...
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros 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 :-)
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi 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
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros 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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: MOD am 31.10.03 - 10:59:05
@Moderatoren
Gehört das nicht in den Bereich Entwicklung?

 ;D MOD
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros am 31.10.03 - 11:03:26
Nein, im Bereich Entwicklung 6 ist bereits ein Thread zur Fehlerbehandlung entstanden, wo das Thema ergreifend diskutiert wird. Das hat ja wirklich mit einem Problem begonnen hier.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: MOD am 31.10.03 - 11:08:15
Möchte hier nicht offtopic werden.
Verstehe zwar deinen Ansatz, doch habe ich eine andere Auffassung von diesem Problem.
Alleine der Betreff (Benötige Hilfe bei Script) verweist auf einen anderen Bereich dieses Forums. Nehme ich dann noch die Ansätze zur Problemlösung wird diese Vermutung bestätigt.

 ;D MOD

@Semeaphorus
Ich kann mich natürlich auch total irren.  ;D
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros am 31.10.03 - 11:11:45
Neinnein, das ist eindeutig Grauzone und solche Fälle werden wir immer mal wieder haben. Jetzt noch verschieben macht in meinen Augen keinen Sinn, und beim Start des Thread war das ja eigentlich nicht azusehen. Hätte er im Title geschrieben "Problem mit Script", dann wäre Dein Argument etwas schwieriger .... aber lass uns nicht Haare spalten, ich bin einfach dagegen, das jetzt noch zu verschieben.
Titel: @all und natürlich auch an bificypdog
Beitrag von: Thomas Schulte am 02.11.03 - 09:34:59
Der ganze Thread liest sich echt lustig. Dummerweise ist dem Manne/Fraue mit der ganzen Diskussion nicht geholfen.
Im Prinzip habt ihr recht, wenn man es nicht kann soll man es sein lassen, speziell dann wenn man "nur Scripte zusammenbaut". hut ab übrigens vor deinem Mut bificydog. Das habe ich mich in noch keiner Sprache die ich kann undich kann einige getraut. Sourcecode den ich nicht verstehe in einer Sprache die ich nicht beherrsche umzubauen. Aber das ist ein anderes Thema und dafür hast du hier ja jetzt Prügel genug bezogen.

Dein Problem ist allerdings damit nicht gelöst und dabei ist es eigentlich soooo einfach.

Deine For Next Schleife soll bis 25 Zählen. Wenn man es genau nimmt bis 24.
Die Abbruch Bedingung ist dann gegeben wenn I = Ubound(Array). Jetzt zählst du dummerweise mit i= i+1 immer noch eins dazu. Noch eins deswegen, weil eine For next Schleife in Script selbstständig zählt. Deine Addition ist also überflüssig. Deine Fehler kommt deswegen zustande, weil die Abbruchbedingung nie erfüllt wird. Der Zählt halt nicht 1,2,3,.....24,25 Abbruch sondern
2,4,6,....24,26,28.... Error.
Also hast du geloost.
Die Art wie Abbruchbedingungen in For next Schleifen zu setzen sind ist allerdings nicht nur ein Basic bei der Lotus Script Programmierung, sondern auch der Programmierung allgemein.
Das macht man nämlich nie so for i=0 to i=x sondern immer so for i=0 to i>x.

So Ende des Kommentars. Immerhin ist Sonntag Morgen.

Thomas
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Semeaphoros am 02.11.03 - 21:12:12
Thomas, das ist leider Unsinn.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Thomas Schulte am 03.11.03 - 10:19:48
Semaphorus hat leider recht, das ist Blödsinn, zumindest was die Bedingungen des Zählers der For Schleife in Script betrifft. Da war ich wohl geistig gerade bei einer anderen Sprache.

Was aber die Zählerei an sich betrifft habe ich recht. Die zusätzliche Addition ist an dieser Stelle vollkommen fehl am Platz. Also ist seine Aussage auch nur teilweise richtig.

Und eine Lösung gibt es auch. Ohne das Error Handling zu vergewaltigen.
DB auf nothing prüfen. Schaut im Prinzip so aus. ohne gewähr, nicht getested.
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  
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 12:46:23
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.


Code
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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 12:50:57
Zusammenfassung:
Ich habe das ErrorHandling nach Thomas' Vorschlag mal komplett weggelassen. Jedoch erhalte ich beim "Set oDb" direkt einen Zugriffsfehler.

Lass ich die Zeile weg, dann ich nicht mit "If Not oDb Is Nothing " arbeiten, weil die Datenbank ja noch nicht "gesetzt" wurde.

Wie mache ich das, dass ich keinen Fehler bei "Set oDB" erhalten?
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi am 03.11.03 - 12:51:08
Probier doch mal meinen Vorschlag aus...

Andreas
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 14:25:46
@Glombi:

Ich habe deine Vorschläge mal ausprobiert.


Code
   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.
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi am 03.11.03 - 14:30:10
Stimmt, dass Error Handling ist falsch platziert.

Das iCount = iCount +1    wird benötigt

So wäre es richtig:

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      
     
     
NextDB:
      iCount = iCount +1    
     
   Next

exit sub

     
ErrorHandling:          
      Print ("Eine Datenbank konnte nicht Ihrer Arbeitsoberfläche hinzugefügt werden.")    
      Resume NextDB

   
End Sub
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv am 03.11.03 - 14:35:18
Das si t noch falsch:
Zitat
' Wieviel Elemente hat der Array - 1 (da ein Array immer mit 0 beginnt muss hier 1 subtrahiert werden)
  iArray = Ubound(sDb())-1

UBound (sDB) = 2

HTH,
Bernhard
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 14:40:44
Das si t noch falsch:
Zitat
' Wieviel Elemente hat der Array - 1 (da ein Array immer mit 0 beginnt muss hier 1 subtrahiert werden)
  iArray = Ubound(sDb())-1

UBound (sDB) = 2

HTH,
Bernhard

Das verstehe ich jetzt nicht.
Soll ich "UBound(sDB)=2" im Script einfügen? Das dürfte doch nicht funktionieren?
Oder willst du mich auf irgend etwas aufmerksam machen?
Titel: Re:Benötige Hilfe bei Script
Beitrag von: koehlerbv am 03.11.03 - 14:42:41
In Deinem Array ergibt LBound 0 und UBound 2.

Bernhard
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 14:43:00
Stimmt, dass Error Handling ist falsch platziert.

Das iCount = iCount +1    wird benötigt

So wäre es richtig:

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      
     
     
NextDB:
      iCount = iCount +1    
     
   Next

exit sub

     
ErrorHandling:          
      Print ("Eine Datenbank konnte nicht Ihrer Arbeitsoberfläche hinzugefügt werden.")    
      Resume NextDB

   
End Sub


JUCHU.
Ich bin jetzt wirklich ganz nah dran.
Jedoch läuft die Schleife wg. dem "iCount=iCount+1" jetzt in 2er Schritten.
Bist du sicher, dass ich das benutzen soll?
Oder geht es nur darum, dass hinter der Sprungmarke noch etwas steht?
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 14:44:27
In Deinem Array ergibt LBound 0 und UBound 2.

Bernhard

Also weg mit dem "-1" beim UBound in meinem Script? Gelle?
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi am 03.11.03 - 14:50:08
Ubound(sDb())-1
ist natürlich Schrott, also
iArray = Ubound(sDb())

Andreas
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi am 03.11.03 - 14:52:55
Hier was ohne counter:

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"      
 
 
  Forall d in sDb
     
      Set oDb = oSession.getDatabase(sMailServer,cstr(d))
     
     
      If Not oDb Is Nothing Then
        Call oUiWs.addDatabase(sMailServer,cstr(d))
        Print (oDb.title+" wurde Ihrer Arbeitsoberfläche hinzugefügt.")    
       
      End If      
   
     
NextDB:
     
end forall

exit sub

     
ErrorHandling:          
      Print ("Eine Datenbank konnte nicht Ihrer Arbeitsoberfläche hinzugefügt werden.")    
      Resume NextDB

 
End Sub
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 14:59:51
ICH BIN AM ZIEL


ICH LIEBE EUCH ALLE
Titel: Re:Benötige Hilfe bei Script
Beitrag von: bificypdog am 03.11.03 - 15:22:43
SNÜFF. Ich hab noch was. Aber zur Abwechslung mal etwas ganz anderes.
Schaut doch bitte mal in den Anhang.

Beim "Call oReg.getUserInfo" stürzt Notes mit einem RedScreenOfDeath ab.

Bisher habe ich das Script unter OS/2 Notes 4.6.7 getestet.
Ich habe es jetzt unter Windows XP und 2000 in Notes 5 Private Ed. und Notes 5.0.10 (deutsch) getestet und sehe nur den RedScreen.

So langsam verzweifel ich.

- Der Fehler taucht auch im "Nicht-Debugging-Modus" auf.
- Die Schaltfläche (in einem Mail-Dok) wurde auf verschiedenen Rechnern getestet.
- Unterschiedliche Mail-DBs
- Fix-Up gemacht
- Script auch schon in anderen Button hinterlegt (Copy&Paste)
Titel: Re:Benötige Hilfe bei Script
Beitrag von: Glombi am 03.11.03 - 15:52:31
Versuch mal anstelle von
Call oReg.getUserInfo(sUser,sMailServer)

folgendes:
Call oReg.getUserInfo(sUser$,sMailServer$)

Falls das nicht geht: Du willst doch eigentlich nur den Mailserver des Users haben, oder? Das geht auch einfacher:

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 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
   
   sUser = oSession.Username

   sMailServer = oSession.GetEnvirnmentString("MailServer",true)    'Hole Mailserver aus NOTEs.INI
   
 
'***************************************************************************
'User nach dem Server fragen / Hierbei wird als Default sein Mail-Server angeboten
'***************************************************************************
   
   sUsersServerChoice = Inputbox$ ("Bitte wählen Sie den Server Ihrer Fililale:", _
   "Server", sMailServer)
   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)    



... ... ...

Andreas