Autor Thema: NotesDatabase-Objekt wird fälschlicherweise auf Nothing gesetzt  (Gelesen 5397 mal)

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Hallo zusammen,

ich habe mal wieder einen komischen Effekt, den ich mir irgendwie nicht erklären kann.

Szenario: Ich bastel an einer Inventurdatenbank, mit der so ziemlich sämtliche Infos zu allen Datenbanken auf allen Servern gesammelt werden. Also gehe ich mit Hilfe des NotesDbDirectory-Objektes alle Datenbanken eines Servers durch. Auch solche, bei denen ich keinen Zugriff habe (das ist auch ok so). Zu allen Datenbanken werden noch zusätzliche Informationen in einer anderen Datenbank gesucht....

Nun zum eigentlichen Problemchen: Bei folgendem Code wird durch die Zeile "Set db2 = s.GetDatabase(s.CurrentDatabase.Server, "names.nsf", False)" das Objekt "db1" auf Nothing gesetzt. Dieser Effekt tritt nur bei Datenbanken auf, bei denen man keinen Zugriff hat. Zum Test habe ich mir eine Datenbank "noaccessdb.nsf" angelegt.
Code
	
	Dim db1 As NotesDatabase
	Dim db2 As NotesDatabase
	Dim dbdir As NotesDbDirectory
	Dim s As NotesSession
	Dim str_noaccessdb As String
	
	Set s = New NotesSession
	Set dbdir = New NotesDbDirectory(s.CurrentDatabase.Server)
	str_noaccessdb = "noaccessdb.nsf" ' hier habe ich keinen Zugriff
	
	Set db1 = dbdir.GetFirstDatabase(DATABASE)
	Do Until db1 Is Nothing
		
		If db1.FilePath = str_noaccessdb Then
			
			If db1.IsOpen = False Then
				On Error 4060 Resume Next
				Call db1.Open(db1.Server, db1.FilePath)
				If Err = 4060 Then
					Print Error
					Err = 0
				End If
				On Error Goto 0
			End If
			
			If db1 Is Nothing Then
				Msgbox "db1 is nothing"
			Else
				Msgbox "db1 is NOT nothing"
			End If
			
			Set db2 = s.GetDatabase(s.CurrentDatabase.Server, "names.nsf", False)
			
			If db1 Is Nothing Then
				Msgbox "db1 is nothing"
			Else
				Msgbox "db1 is NOT nothing"
			End If
			
		End If
		
		Set db1 = dbdir.GetNextDatabase
	Loop
	

Dat is doch nich normal, oder?


Gruß
Johnson

PS: Ich nutze Notes 7.0.3 auf einer Windows XP SP3 Büchse
Gruß
Johnson

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Merkwürdig. Ich würde s.CurrentDatabase.Server vor der Schleife in einen String schreiben und den dann beim Setzen von db2 verwenden

Set db2 = s.GetDatabase(str_server, "names.nsf", False)

Vielleicht hilfts (nur ein Bauchgefühl und einen Versuch wert)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Noch was ganz anderes. Warum setzt Du db2 überhaupt in der Schleife? Ist doch immer die gleiche db, die kannst Du doch schon vor der Schleife definieren

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Ja. Wenn man db2 vorher setzt, dann würde es funzten. Nur den Servernamen in eine String-Variable zu schreiben, reicht nicht.

Dieser Test-Code ist natürlich auch nur zum Reproduzieren des Fehlers entstanden. Im eigentlichen Code wurde mit vielen Prozeduren gearbeitet, in denen einer Funktion bisher lediglich eine Datenbank übergeben wurde und diese öffnet die names.nsf, ließt dort ein paar Daten zu dieser Datenbank und gibt einen UDT mit den Daten zurück.
Solange die Datenbank nicht aus einem NotesDbDirectory-Objekt kam, hatte ja alles wunderbar funktioniert.

Aber komisch finde ich das ganze schon. Vor allem sucht man irgendwann schon nach einem Denkfehler.
Gruß
Johnson

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Das kommt mir sehr bekannt vor. session.currentDatabase darf nicht als Parameter verwendet werden.

Hatte damals folgendes Problem entdeckt:
http://www-01.ibm.com/support/docview.wss?uid=swg21439472

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Roland, danke!

Das ist wieder ein prächtiges Beispiel dafür, dass man niemals auslernt, dass schon das blosse Mitlesen bei AtNotes bildet und das sich manche Fehler bei Software-Produkten (das gibt es ja bei weitem nicht nur Bei Notes / Domino) ewig halten.

Mir fällt jetzt hier auch keine logische Schlussfolgerung ein, warum das Verhalten dann doch stimmig wäre. Keine Ahnung, wo der "Selbstvernichtungsknopf" da vor (sehr) vielen Jahren von den Entwicklern der API eingebaut wurde.

Bernhard

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
NotesSession.CurrentDatabase nicht als Parameter?! Das ist ja auch mal geil.  ::)

Den Servernamen im obigen Script erst in eine Stringvariable zu schreiben und sowohl beim Initializieren des NotesDbDirectories, als auch beim Öffnen der names.nsf zu verwenden, hat den selben Effekt. Das Objekt "db1" wird auf Nothing gesetzt.
Schön ist auch, dass das Objekt vor dem Aufruf "GetDatabase" voll zur Verfügung steht. Danach nicht mehr.
Meinen Code habe ich bereits so umgestellt, dass kein "GetDatabase" in irgendeiner Funktion während des Schleifendurchlaufs aufgerufen wird. Jetzt funzt es so und alle anderen Features der Datenbank funktionieren auch noch so wie sie sollen. Aber das war schon ein Hickhack.

Manmanman! Lotus Script ist ja recht einfach zu erlernen, aber der Fundus solcher Eigenarten ist doch ganz enorm.  ;)

Waidmanns Heil
Johnson
Gruß
Johnson

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Ich verwende immer

Set db = New NotesDatabase (server, dateiname)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz