Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: theBastian am 25.10.05 - 09:03:59

Titel: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 09:03:59
Hallo,

ich möchte in einer DB, in der User Private views (shared, private on first use) erstellen dürfen, diese views beim Schließen der DB löschen (QueryClose).

Habe schon alle Beiträge zu diesem Thema gelesen, konnte jedoch keine Lösung finden.

Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim vUserName As Variant
	Dim view As NotesView
	Dim docView As NotesDocument
	Dim itmFlags As NotesItem
	Set db = session.CurrentDatabase
	'Get current user
	vUserName = session.UserName
	Forall v In db.Views
		Set view = v
		'Get flag for private view
		Set docView = db.GetDocumentByUNID( view.UniversalID )
		Set itmFlags = docView.GetFirstItem( "$Flags" )
		'Check if view is private and readers is current user
		If Instr( itmFlags.Values( 0 ), "V" ) And _
		v.Readers = vUserName Then
			Call v.Remove 
		End If
	End Forall

Natürlich ergibt der Vergleich v.Readers = v.UserName ein Type Mismatch, da ja

vUserName Variant,
v.Readers Variant
v.Readers(0) String

Leider kriege ich v.UserName nicht so deklariert, dass der Vergleich durchläuft.  ???

Habt Ihr vielleicht eine Idee?

cu
der B@sti
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 09:21:17
vusername.canonical gibt den ensprechenden String (CN=.../OU=.../O=..../C=...) aus.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 09:23:14
Ach ja, vusername muss dazu natürlich noch ein Notesname sein:
set vusername=new notesname(session.username)
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 11:00:30
Ja klar, Readers ist doch Names. Danke.
Mein Code sieht jetzt so aus:

Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim vUserName As Variant
	Dim view As NotesView
	Dim docView As NotesDocument
	Dim itmFlags As NotesItem
	Set db = session.CurrentDatabase
	'Get current user	
	Set vUserName=New notesname(session.username)
	Forall v In db.Views
		Set view = v
		'Get flag for private view
		Set docView = db.GetDocumentByUNID( view.UniversalID )
		Set itmFlags = docView.GetFirstItem( "$Flags" )
		'Check if view is private
		If Instr( itmFlags.Values( 0 ), "V" ) Then
			'Check if readers is current user
			If v.Readers = vUserName.canonical Then
				Call v.Remove 
			End If
		End If
	End Forall

Leider tritt der Type Mismatch noch immer auf.  :(

cu
der B@sti
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 11:27:42
Nun, da v.readers ein Array von Strings sein sollte musst Du den String vusername.canonical gegen die einzelnen Elemente prüfen:

equality=false
for i=0 to Ubound(v.readers)
  if v.readers(i)=vusername.canonical then
    equality=true
    exit for
  end if
next
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 12:39:56
Dank dir,

aktueller Stand:

Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim vUserName As Variant
	Dim view As NotesView
	Dim docView As NotesDocument
	Dim itmFlags As NotesItem
	Set db = session.CurrentDatabase
	'Get current user	
	Set vUserName=New notesname(session.username)
	Forall v In db.Views
		Set view = v
		'Get flag for private view
		Set docView = db.GetDocumentByUNID( view.UniversalID )
		Set itmFlags = docView.GetFirstItem( "$Flags" )
		'Check if view is private
		If Instr( itmFlags.Values( 0 ), "V" ) Then
			'Check if readers is current user
			equality=False
			For i=0 To Ubound(v.readers)
				If v.readers(i)=vusername.canonical Then
					equality=True
					Exit For
				End If
			Next
			If equality = True Then
				Call v.Remove
			End If
		End If
	End Forall

Beim Schließen der DB tritt folgender Fehler auf:

Notes Error: invalid or nonexistent document ()

Wenn ich versuche per Debugger rauszukriegen, wo der Fehler auftritt, schmiert Notes komplett ab (NSD).

Dachte weil ich eine View löschen will, die noch offen ist, habe aber keine Private view offen.

???
der B@sti
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 14:11:03
Das Script läuft durch?
Falls nein: Was ist die letzte vom Debugger angezeigte Zeile, wenn Du schrittweise durchgehst?

Die Fehlermeldung hört sich so an, als sei das Dokument nicht mehr vorhanden - bzw. schon gelöscht.
Ach ja: Ist das eine View auf dem Server oder auf dem Desktop?
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 14:36:08
Also View ist natürlich in der DB, an die in der desktop.ndk komme ich ja so nicht ran.

Wenn ich versuche per Debugger rauszukriegen, wo der Fehler auftritt, schmiert Notes komplett ab (NSD).
 <--- darum weiß ich nicht, in welcher Zeile der Fehler auftritt.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 14:38:02
Bereits beim Starten des Debuggers ???
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 14:59:20
Bereits beim Starten des Debuggers ???

Sobald der Debugger anspringen sollte, schmiert Notes ab.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 25.10.05 - 15:09:52
OK, dann musst Du wohl per Print debuggen - was das generelle Absturzproblem - dass doch sehr eigenartig ist (sieht so aus, als ob was beim Interpretieren direkt am Anfang schief läuft).

Prüfe doch mal, ob v nothing ist (lass es Dir ausdrucken)
Evtl. ist es dann schon mit dieser Prüfung getan - wenn das Dokument tatsächlich schon gelöscht ist. Ist das der Fall?
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 25.10.05 - 15:59:35
So, habe jetzt mal fast alle views gelöscht (manuell) und debuggt.

Nach der 4. oder 5. Ansicht schmiert Notes bei

--> End Forall

ab.

Scheint also so, als ob das Ende der Views nicht erkannt wird, oder so...

Im Fault Recovery Report steht "Access Violation" als Grund für den Absturz. Fehlt mir da ev. ein Recht, obwohl ich Admin bin)?
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 26.10.05 - 11:42:31
Hi,

nachdem ich jetzt weiter getestet habe, ist folgendes klar:

Existiert eine Private view für den User wird diese korrekt gelöscht. Existiert keine, stürzt Notes komplett ab (NSD running).  :(

Aktuell sieht das so aus:

Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim vUserName As Variant
	Dim view As NotesView
	Dim docView As NotesDocument
	Dim itmFlags As NotesItem
	Set db = session.CurrentDatabase
	'Get current user	
	Set vUserName=New notesname(session.username)
	Forall v In db.Views
		Set view = v
		'Check if readers is empty
		If Not Isempty(v.readers) Then
		'Get flag for private view
			Set docView = db.GetDocumentByUNID( view.UniversalID )
			Set itmFlags = docView.GetFirstItem( "$Flags" )
		'Check if view is private
			If Instr( itmFlags.Values( 0 ), "V" ) Then
			'Check if readers is current user
				equality=False
				For i=0 To Ubound(v.readers)
					If v.readers(0)=vusername.canonical Then
						equality=True
						Exit For
					End If
				Next
				If equality = True Then
					Call v.Remove
				End If
			End If
		End If
	End Forall

Hat jemand noch eine Idee, wie ich das verhindern kann?

Dank schonmal im voraus.
der B@sti
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 26.10.05 - 11:45:01
Also vor dem v.remove würde ich auf jedenfall prüfen, ob v initialisiert ist:
if not (v is nothing) then
   call v.remove
end if
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 26.10.05 - 12:34:01
Das hilft mir, wenn v leer ist aber nicht in diesem Fall.

1. Variante:
Views:
1. shared
2. shared private on first use
3. private aus view 2 erstellt

alle 3 views werden geprüft, die 3 gelöscht und die DB korrekt geschlossen.

2. Variante:
Views
1. shared
2. shared private on first use
alle 2 views werden geprüft, bei der 2. kommt der Debugger bis End Forall und Notes stürzt ab.

Das ist doch nicht normal.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 26.10.05 - 14:55:36
Es stellt sich mir ohnehin die Frage:

Warum prüfst Du nicht, ob der View private ist mit v.isprivate?
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 27.10.05 - 13:38:15
Hi,

also es scheint irgendwie an der DB oder den views zu liegen. Bei einer neuen DB mit nur 2 views geht das ohne Probs.

Weiß halt nur nicht, welches Designelement verantwortlich ist dafür.

cu
der B@sti
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 27.10.05 - 14:07:39
Dann würde ich mal versuchen eine Kopie der DB anzulegen (evtl hilft auch eine Replik).
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 27.10.05 - 15:14:28
Hab ich natürlich schon versucht.

Habe sogar eine leere DB angelegt und manuell alle Designelemente reinkopiert. Gleiches Ergebnis.

M.E. ist das buggy.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: Gandhi am 27.10.05 - 16:01:28
Aus der Ferne habe ich da leider wohl keine Chance - kann sein, dass da irgendeine ungünstige Konstellation dabei ist.
Titel: Re: Private view eines Users löschen - Deklarationsprobleme
Beitrag von: theBastian am 30.10.05 - 17:27:36
Hi,

danke Dir für Deine Hilfe.

Werde hier erst mal abbrechen und wenn ich mal Zeit habe, die DB neu erstellen und prüfen, woran es liegen könnte.

cu
der B@sti