Autor Thema: db.Open --> Rotes Fenster- Problem beim holen der Eigenschaften einer DB  (Gelesen 4300 mal)

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
HI@all,

habe mal wieder ne kleine Frage.... ;)

Ich möchte eine DB erstellen in der Alle DBs eines Servers aufgelistet sind, und mit einem 2.ten Server abgeglichen werden ob diese DB dort ebenfalls vorhanden ist.

Dabei sollen aber auch noch die Datenbank Eigenschaften der beiden DBs auf den verschiedenen Servern angezeigt werden.

Der Abgleich soweit klappt ganz gut, jedoch ist mir aufgefallen das wenn ich an bestimmte Eigenschaften der Datenbanken möchte, muss ich die DBs erst öffnen. (z.B. ACL, Erstellt am etc.)

Mit dem Befehl db.Open("","") klappt das soweit auch,  jedoch mit nicht mehr als 3 Datenbanken, danach schmirt Notes immer wieder mit nem Roten Fenster ab.
Ich nehme an, das zuviele DBs offen sind und somit zuviel Speicher verbraten wird, hat jemand von euch ne alternative für meinen Code bzw. nen Rat wie ich zb. die geöffneten DBs wieder schließen kann (da es ja kein db.close gibt).

Ich hoffe die Fragestellung war klar.

Freue mich schon auf ne Antwort bis dann CU

P.S.

Der Code:
Code
	On Error Goto ERRORSTEP
	
REM Umgebung
	Dim workspace As New NotesUIWorkspace
	Dim session As New NotesSession
	
REM Standard
	Dim uidoc As NotesUIDocument
	Dim doc As NotesDocument
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase
	
	Set uidoc = workspace.CurrentDocument
	Set doc = uidoc.Document
	
	If doc.Server1(0) <> "" And doc.Server2(0)<> "" And doc.Server1(0) <> doc.Server2(0) Then
		Print "Vergleich der Server gestartet!"		
		
		Dim DBDir1 As New NotesDbDirectory(doc.Server1(0))
		Dim DBDir2 As New NotesDbDirectory(doc.Server2(0))
		Dim DB1 As NotesDatabase
		Dim DB2 As NotesDatabase
		
		Dim i As Integer
		Dim DocNew As NotesDocument
		
		Set DB1 = DBDir1.GetFirstDatabase(1246)
		
		Print "Lade Daten vom Server " & Cstr(DB1.Server)
		
		i = 0 		
		If Not db1 Is Nothing Then
			Do Until db1 Is Nothing
				Err = 0
				Call db1.Open("","")
				
				Set DocNew = db.CreateDocument
				DocNew.Form = "mDB"
				
				DocNew.Server1 = db1.Server			
				DocNew.TitelS1 = db1.Title
				DocNew.PfadS1 = db1.FilePath
				DocNew.ReplikIDS1 = Cstr(db1.ReplicaID)
				DocNew.groesseS1 = Cstr(db1.Size)	
				If Err <> 4060 Then 
					DocNew.ErstelltS1 = Cstr(db1.Created)
					DocNew.GeaendertS1 = Cstr(db1.LastModified)
					DocNew.FixUpS1 = Cstr(db1.LastFixup)
				Else
					DocNew.ErstelltS1 = "Keine Berechtigung"
					DocNew.GeaendertS1 = "Keine Berechtigung"
					DocNew.FixUpS1 = "Keine Berechtigung"
				End If
				
				DocNew.TitelS2 = "N.V."
				DocNew.PfadS2 = "N.V."
				DocNew.ReplikIDS2 = "N.V."
				DocNew.groesseS2 = "N.V."
				DocNew.ErstelltS2 = "N.V."
				DocNew.GeaendertS2 = "N.V."
				DocNew.FixUpS2 = "N.V."
				
				Set DB2 = DBDir2.GetFirstDatabase(1246)		
				DocNew.Server2 = db2.Server						
				Do Until db2 Is Nothing
					If db1.FilePath = db2.FilePath Then
						Err = 0
						Call db2.Open("","")
						DocNew.TitelS2 = db2.Title
						DocNew.PfadS2 = db2.FilePath
						DocNew.ReplikIDS2 = Cstr(db2.ReplicaID)
						DocNew.groesseS2 = Cstr(db2.Size)	
						If Err <> 4060 Then 							
							DocNew.ErstelltS2 = Cstr(db2.Created)
							DocNew.GeaendertS2 = Cstr(db2.LastModified)
							DocNew.FixUpS2 = Cstr(db2.LastFixup)
						Else
							DocNew.ErstelltS2 = "Keine Berechtigung"
							DocNew.GeaendertS2 = "Keine Berechtigung"
							DocNew.FixUpS2 = "Keine Berechtigung"
						End If
						Exit Do
					End If				
					Set db2 = dbdir2.GetNextDatabase()
				Loop
				
				DocNew.Status = "Abgeschlossen"
				Call DocNew.Save(True,False)
				
				i = i +1
				If i >= 5 Then Exit Do	
				
				Set db1 = dbdir1.GetNextDatabase()					
			Loop
		End If 
		
		Print "Vergleich der Server erfolgreich beendet!"
	Else
		Messagebox ("Bitte geben Sie 2 verschiedene Server ein die miteinander verglichen werden sollen.")
	End If
	
	Exit Sub
ERRORSTEP:
	If Err = 4060 Then Resume Next
	Msgbox "Es ist ein Fehler aufgetreten." & Chr(10)  & Chr(10) _
	& "Fehlermeldung: " & Error$ & Chr(10) _
	& "Fehlernummer: " & Err & Chr(10) _
	& "Codezeile: " & Erl & Chr(10) _
	,64,"Error"
	Print Cstr(Error$) & " - " & Cstr(Err) & " - " & Cstr(Erl)
	Exit Sub
Viele Grüße

Christian T.

Offline WernerMo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.050
  • Geschlecht: Männlich
Hallo,

ich glaube, du kannst Dir viel Arbeit sparen, die Datenbank in der alle Datenbanken verzeichnet sind gibt es schon, diese heißt catalog.nsf.

Gruß Werner
Gruß Werner
  o                                                  o   
 /@\  Nächster @Notes-Stammtisch  /@\  online Sept. 2020?
_/_\__________________________/_\_ Details folgen.

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
HI Werner,

danke für den Hinweis, die Datenbank kenne ich, doch:
1. ist die den 100% Aktuell?
2. es fehlen mir so auf den ersten Blick auch ein paar Daten die ich noch in meiner DB aufgelistet haben möchte. (z.B. zuletzt geändert, letztes FixUp etc.)

Viele Grüße

Christian T.

Offline thomson666

  • Senior Mitglied
  • ****
  • Beiträge: 285
  • Geschlecht: Männlich
  • niemand hats leicht, aber leicht hats oan...
ist ein Servertask der die Aktualisiert

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
hm ok  dannk kann ich das ja eigentlcih mache...

dennoch würde es mich interessieren warum ich nen rotes Fenster bekomme , bzw. wie ich das umgehen kann?

und hast du ne idee wie ich zb an das erstelldatum der db bzw das zuletzt geändert datum herankomme???


Danke dir
Viele Grüße

Christian T.

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
SO hi leute

erstmal die Antwort auf meine eigene Frage:
"Das Rote Fenster tritt auf da zu viele DBs geöffnet werden und es daher einen Speicherüberlauf gibt..."

Nun aber weiter, ich habe es ausprobiert das oben beschriebene Projekt über die catalog zu mache, jedoch (an was ich vorher nicht gedacht habe) gibt es genügend DBs die nicht katalogisiert werden. Doch diese DBs brauche ich auch.

Somit muss ich also doch wieder zurück zur DB Collection um alle Datenbanken zu erhalten. Da ich halt wie gesagt nicht übers "DB.open" gehen kann habe ich mich nun selbst nach recherchieren im Netzt davon überzeugt mit Notes API zu arbeiten.

Wie ich damit eine DB öffne und schließe hab ich verstanden, doch ich finde im momment nicht herraus wie ich z.B. an die Dokumentenanzahl der DB herandkomme. (Also die API Funktion in der NOTES.DLL)

Kann mir da jemand helfen ?

Vielen Dank
Viele Grüße

Christian T.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Zitat
die nicht katalogisiert werden
Es werden grundsätzlich ALLE Datenbanken katalogisiert; nur werden die nicht alle in den Ansichten der catalog.nsf angezeigt.
Das liegt an den Auswahlformeln der Ansichten ...  WAs man da ändern muss, ist entweder hier im Forum beschrieben; das findest du aber auch ganz schnell selber raus ...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Zitat
z.B. an die Dokumentenanzahl der DB herandkomme.

AllDocumets property in LotusScript

Syntax
To get: Set notesDocumentCollection  = notesDatabase.AllDocuments

Return value
notesDocumentCollection
An unsorted collection containing all of the documents in the database.

Usage
Since many databases contain large numbers of documents, you may use the FTSearch or Search methods instead of the AllDocuments property. Both methods return a smaller collection of documents that meet specific criteria. Using AllDocuments is, however, more efficient than using the Search method with an @All formula.

If the collection is empty, AllDocuments.Count is 0.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Driri

  • Gast
Und wenn Dir der Catalog nicht reicht, schau Dir mal DomainPatrol an. Die Clientbasierte Version gibts bei OpenNTF, die serverbasierte (die dann auch automatisiert scannt) ist dagegen kostenpflichtig.

http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/DomainPatrol

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
@eknori 1:
Vielen Dank für den Tip werde es glecih mal ausprobieren

@eknori 2:
Du hast einen Satz bei deinem Zitat vergessen ;) :
Zitat
Read-only. All the documents in a database.

Defined in
NotesDatabase

Data type
NotesDocumentCollection

Syntax
To get: Set notesDocumentCollection  = notesDatabase.AllDocuments

Return value
notesDocumentCollection
An unsorted collection containing all of the documents in the database.

Usage
Since many databases contain large numbers of documents, you may use the FTSearch or Search methods instead of the AllDocuments property. Both methods return a smaller collection of documents that meet specific criteria. Using AllDocuments is, however, more efficient than using the Search method with an @All formula.
If the collection is empty, AllDocuments.Count is 0.

The database must be open to use this property.

@driri:

Danke werde ich mir anschauen...
Viele Grüße

Christian T.

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
@eknori
HI
muss meinen Kommentar von vorhin halb zurücknehmen...

Habe festgestelle das

Dim db as notesdatabase
Set db = dbcol.getfirsentry(1246)

nicht das gleiche ist wie

Dim db as notesdatabase
Set db = dbcol.getfirsentry(1246)
Set db = new notesdatabase(db.server,db.filepath)

In beiden Fällen ist db eine notesdatabase und ich verstehe auch zurzeit nicht den unterschied zwischen den beiden aufrufen, jedoch kann ich bei der Variante den Befehl bzw die Eigenschaft "AllDocuments" nicht benutzen bei der 2.Variante schon....

ALso bis dann

Verwirrt und Ratlos,
Viele Grüße

Christian T.

Offline Pyewacket

  • Senior Mitglied
  • ****
  • Beiträge: 310
  • Geschlecht: Männlich
dbcol ist vermutlich ein DbDirectory.
Die bei getfirst bzw getnext zurückgelieferten Datenbankobjekte sind geschlossen (db.isopen=false)
Du kannst nur ganz wenige Properties abfragen wie Server, Filepath, Replicaid,
deshalb kannst du nicht auf die Alldocuments collection zugreifen.

in der zweiten Variante erzeugst du das Datenbankobject quasi neu und dabei wird es geöffnet.

Aber Vorsicht, das kann seltsame Effekte geben wenn du das db-object das aus dem dbdirectory zurückkommt weiterverwendest. Ich habe die Beobachtung gemacht daß dann öfter das GetNextEntry nicht mehr sauber funktioniert und manche Datenbanken mehrfach zurückgeliefert bzw manche ausgelassen werden.

Ich mache das so daß ich ein dbWork definiere und dann dieses mit
   set dbWork = new notesdatabase(db.server,db.filepath)
initialisiere.

Gruss
 Peter
ATOS.org - Feel the music!

Offline C_T

  • Senior Mitglied
  • ****
  • Beiträge: 272
  • Geschlecht: Männlich
Danke Peter genau so habe ich das gestern abend auch gemacht zumindest so ähnlich. Trotzdem erhalte ich ziemlich schnell immer wieder nen Rotes Fenster mit nem Roten Fenster und der meldung:

"OSVBlockAddr: Bad VBlock handle"

kann mir jemand von euch nen Tip geben warum das so passiert?
habe sogar schon testhalber mal ne Begrenzun eingebaut....

Code: (Dies ist der Originalcode der das Rote Fenster bringt....)
Code
Sub ServerVergleichNewDok_V2
	On Error Goto ERRORSTEP
	
REM Umgebung
	Dim workspace As New NotesUIWorkspace
	Dim session As New NotesSession
	
REM Standard
	Dim uidoc As NotesUIDocument
	Dim doc As NotesDocument
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase
	
	Set uidoc = workspace.CurrentDocument
	Set doc = uidoc.Document
	Dim s2 As Integer
	
	If doc.Server1(0) <> "" And doc.Server2(0)<> "" And doc.Server1(0) <> doc.Server2(0) Then
		Print "Vergleich der Server gestartet!"		
		
		Dim DBDir1 As New NotesDbDirectory(doc.Server1(0))
		Dim DBDir2 As New NotesDbDirectory(doc.Server2(0))
		Dim DB1Dir As NotesDatabase
		Dim DB1 As NotesDatabase
		Dim DB2 As NotesDatabase
		Dim Item1 As Notesitem
		Dim Item2 As Notesitem
		
		Dim intRCS1 As Integer
		Dim lngDBHandleS1 As Long
		Dim intRCS2 As Integer
		Dim lngDBHandleS2 As Long
		
		Dim i As Integer
		Dim DocNew As NotesDocument
		Dim docCol As NotesDocumentCollection 
		
		Set DB1Dir = DBDir1.GetFirstDatabase(1246)
		
		Print "Lade Daten vom Server " & Cstr(DB1Dir.Server)
		
		i = 0 		
		If Not db1Dir Is Nothing Then
			Do Until db1Dir Is Nothing
				
				Set DB1 = New NotesDatabase(DB1Dir.server,DB1Dir.filename)
				
				Set DocNew = db.CreateDocument
				DocNew.Form = "mDB"
				
				DocNew.Server1 = db1.Server			
				DocNew.TitelS1 = db1.Title
				DocNew.PfadS1 = db1.FilePath
				DocNew.ReplikIDS1 = Cstr(db1.ReplicaID)
				DocNew.groesseS1 = Cstr(db1.Size)	
				DocNew.AnzahlS1 = Cstr(db1.AllDocuments.Count)
				
				DocNew.TitelS2 = "N.V."
				DocNew.PfadS2 = "N.V."
				DocNew.ReplikIDS2 = "N.V."
				DocNew.groesseS2 = "N.V."
				DocNew.ErstelltS2 = "N.V."
				DocNew.GeaendertS2 = "N.V."
				DocNew.FixUpS2 = "N.V."
				DocNew.ANzahlS2 = "N.V."
				Set DB2 = DBDir2.GetFirstDatabase(1246)
				DocNew.Server2 = db2.Server				
				s2 = 0
				Print "Suche auf Server 2 nach Datenbank"
				Do Until db2 Is Nothing
					If db1.FilePath = db2.FilePath Then
						Print "Datenbank gefunden - Trage Werte ein"
						Set DB2 = New NotesDatabase(DB2.server,DB2.filename)						
						DocNew.TitelS2 = db2.Title
						DocNew.PfadS2 = db2.FilePath
						DocNew.ReplikIDS2 = Cstr(db2.ReplicaID)
						DocNew.groesseS2 = Cstr(db2.Size)	
						DocNew.AnzahlS2 = Cstr(db2.AllDocuments.Count)
						Exit Do
					End If				
					s2 = s2 +1
					If s2 >= 10 Then Exit Do
					Set db2 = dbdir2.GetNextDatabase()
				Loop
				
				DocNew.Status = "Abgeschlossen"
				Call DocNew.Save(True,False)
				Set DB1 = Nothing
				i = i +1
				If i >= 3 Then Exit Do					
				
'				Sleep(15)
				Print "Nächste Datenbank auf Sersve 1"
				Set db1Dir = dbdir1.GetNextDatabase()		
				Sleep(10)
			Loop
		End If 
		
		Print "Vergleich der Server erfolgreich beendet!"
	Else
		Messagebox ("Bitte geben Sie 2 verschiedene Server ein die miteinander verglichen werden sollen.")
	End If
	
	Exit Sub
ERRORSTEP:
	If Err = 4060 Then Resume Next
	Msgbox "Es ist ein Fehler aufgetreten." & Chr(10)  & Chr(10) _
	& "Fehlermeldung: " & Error$ & Chr(10) _
	& "Fehlernummer: " & Err & Chr(10) _
	& "Codezeile: " & Erl & Chr(10) _
	,64,"Error"
	Print Cstr(Error$) & " - " & Cstr(Err) & " - " & Cstr(Erl)
	Exit Sub
End Sub

Viele Grüße

Christian T.

Offline it898ur

  • Senior Mitglied
  • ****
  • Beiträge: 478
Hallo,

die Meldung "Bad VBlock handle" habe ich lange nicht mehr gesehen - zuletzt unter Notes 6. Damals gab es einen Bug, wenn die Bezeichnung von Reitern des Arbeitsbereichs zu lang waren. Zu lang bedeutete dabei > 32 Zeichen bzw falls ein Sonderzeichen (wie z. B. ein deutscher Umlaut) enthalten war > 10 Zeichen.

Kann es sein, dass dein Arbeitsbereich ähnliche Probleme hat - in diesem Fall sollte es mit einem Jungfräulichen Desktop gehen.

Gruß

André

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz