Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: CLI_Andreas_Schmidt am 15.02.04 - 16:40:55
-
Hi an alle,
ich arbeite gerade an einem Agenten, der auf einem Server alle Maildatenbanken nacheinander aufrufen soll.
Ich habe zwar getnextdatabase gefunden, jedoch geht es leider nur über das directory und somit auf alle Datenbanken. Ich will aber Zugriff (nur) auf die Maildatenbanken. Also...
getfirst Maildatabase......agent.....fertig
getnextMaildatabase......agent.....fertig
getnextMaildatabase......
Fertig.
Hat jemand das auch schon mal probiert ?
Gruss
Andreas
-
Musst Du wohl aus dem Adressbuch auslesen, eine andere zuverlässige Methode ist mir nicht bekannt.
-
das geht nur ressourcenverschwenderisch über alle DB; du kannst aber die relevanten DB mittels db.path ( oder so ) ausfiltern.
Also wenn path nicht mail, dann zu nächsten DB sonst bearbeite aktuelle DB.
-
Ich habe zwar getnextdatabase gefunden, jedoch geht es leider nur über das directory und somit auf alle Datenbanken. Ich will aber Zugriff (nur) auf die Maildatenbanken. Also...
getfirst Maildatabase......agent.....fertig
getnextMaildatabase......agent.....fertig
getnextMaildatabase......
Fertig.
du kannst dir doch ne Klasse schreiben, die die NotesDBDirectory-Klasse nutzt und dir dann deine eigenen getFirst/nextMailDB-Funktionen schreiben. Dazu brauchst du dann halt ein Kriterium, woran du eine MailDB erkennst (Name ihres Mastertemplates z.B.)
-
Hi eknori,
wie sieht den dann der code aus ? muss ich dann wissen, wie die Datenbank heißt ? oder kann ich sagen: db.path und dann mit getfirstDatabase und getnextdatabase dieses Verzeichnis durchlaufen ? Das würde mir schon reichen. Ich habe bisher nur zugreifen können, wenn ich den Namen der Datenbank kannte.
???
Scheint gar nicht so trivial zu sein.
Gruss
Andreas
-
guck mal in die NotesDatabaseClass --> db.FilePath
-
irgendwie so (
Sub Click(Source As Button)
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.currentdatabase
path = db.filepath
file = db.filename
pos = Instr(path, file)
path = Left(path, pos-1)
Msgbox path
End Sub
oder einfacher
Sub Click(Source As Button)
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.currentdatabase
path = Left(db.filepath, (Instr(db.filepath, db.filename) -1))
Msgbox path
End Sub
-
nu isser weg und ich sitze hier und warte auf ein feedback... :'(
-
@Andreas: eknoris Ansatz ist gut.
Wait a moment. Meine Kristallkugel sagt mir gerade, dass sich die Mailfiles möglicherweise, durch irgendwelche Zufälle in verschiedenen Verzeichnissen befinden.
Du mußt du den notesDatabase.path eben gegen ein Array testen.
Gruß Axel
-
Nicht gegen ein Array testen, sondern das machen, was Semeaphoros schon sagte: Sicher geht das nur über das Adressbuch.
Bernhard
-
@Andreas: eknoris Ansatz ist gut.
Wait a moment. Meine Kristallkugel sagt mir gerade, dass sich die Mailfiles möglicherweise, durch irgendwelche Zufälle in verschiedenen Verzeichnissen befinden.
Du mußt du den notesDatabase.path eben gegen ein Array testen.
Gruß Axel
Hallo Axel,
verstehe ich das richtig ? Können die Postfächer wandern ?
Ciao
Don Pasquale
-
Können die Postfächer wandern
warum denn nicht ? Ich habe auch etliche Maildatenbanken in unterschiedlichen Verzeichnissen ( DirLink)
-
Kommt dazu, dass Mailfiles ganz normale Datenbanken sind und sich nicht zuverlässig als Mehlpfeile identifizieren lassen. Der Weg übers Adressbuch ist also unvermeidlich. Damit bekommt man aber solche Dateien nicht in den Griff, die nur als Replik auf dem Server liegen und bei denen Mail auf einem anderen Server eingeliefert wird.
-
Können die Postfächer wandern
warum denn nicht ? Ich habe auch etliche Maildatenbanken in unterschiedlichen Verzeichnissen ( DirLink)
Naja, es ist doch etwas anderes, ob ich Maildatenbanken an unterschiedlichen Orten speichere oder dieselbe Maildatenbank
sich heute hier und morgen dort befindet.
Nachfrage: Es ist also nicht klug den Zugriff auf eine Maildatenbank über ein Profildokument zu lösen in dem der Pfad steht ?
Ciao
Don Pasquale
-
Auf EINE oder auf ALLE? Und wie häufig?
Natürlich lassen sich diese Angaben cachen, nur sollte man sie dann regelmässig mit dem Adressbuch abgleichen und einen Fallback haben, wenn man die Datei nicht mehr am ursprünglichen Ort findet. Mehlpfeile werden nun mal zwischendurch abgeschossen (gelöscht) oder von einem Köcher in einen anderen verschoben, auch wenn das nicht unbedingt speziell häufig ist. Und dann kommen ja auch mal neue User dazu, oder gibt es die bei Euch nicht? :o
-
Wozu ein Profil-Document ?
Im Backend weiss der Server (oder mein Agent) über das Adressbuch, wo sich die gültige Mail-DB von User X befindet.
Im FrontEnd steht die Info im Location Document.
So what ?
Bernhard
-
@V.B. Köhler
>Wozu ein Profil-Document ?
Wenn man es nicht besser weiß ?!
>Im Backend weiss der Server (oder mein Agent) über das Adressbuch, wo sich die gültige Mail-DB von User X befindet.
OK, wieder was gelernt !
>So what ?
Red Zac ?
:-)
Alles klar, mit diesem Infos sollte ich das sauber umsetzen können.
Ciao
Don Pasquale
-
Hier wäre mal ein Beispiel Scritp was nur das Verzeichnis org und mail berücksichtigt:
Sub Initialize
Dim Session As NotesSession
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim NAB As NotesDatabase
Dim NABServer As String
Dim NABView As NotesView
Dim NABDoc As NotesDocument
Dim ServerMailFile As NotesDatabase
Dim ServerDirectory As NotesDbDirectory
Dim NABCollectList List As NotesDocumentCollection
Dim FileFromNABList List As String
Dim FileFromServerList List As ServerFileType
Set session = New NotesSession
Set ws = New NotesUIWorkspace
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
'Specify the server from which to get user information
If doc.serverver(0)="" Or doc.ServerToSearch(0)="" Then
Msgbox "Kein Server oder Verzeichnis angegeben!"
Exit Sub
End If
NABServer = doc.serverver(0)
'Open the Public Address Book
Print "Adressbuch öffnen"
Set NAB = Session.GetDatabase(NABServer,"names.nsf")
If NAB.IsOpen Then
'Server\Mail users view and place all the documents in a collection (one for each server)
Set NABView = NAB.GetView("Server\Mail Users")
FileCount%=0
Print "Ansicht ""Server\Mail Users"" öffnen"
'For each speficied server, find all the mail files (you might need to edit this section to specify the correct mail directory)
Forall TKServer In doc.ServerToSearch
Set ServerDirectory = Session.GetDbDirectory(Cstr(TKServer))
Set ServerMailFile = ServerDirectory.GetFirstDatabase(DATABASE)
While Not ServerMailFile Is Nothing
' test=Left$(Ucase$(ServerMailFile.FilePath),5) = "MAIL\"
' test2=Left$(Ucase$(ServerMailFile.FilePath),5) = "ORG\"
If Left$(Ucase$(ServerMailFile.FilePath),5) = "MAIL\" Or Left$(Ucase$(ServerMailFile.FilePath),4) = "ORG\" Then 'And Mid$(Ucase$(ServerMailFile.FilePath),6,7) <> "CLUSTER" Then
' Änderung 1 13.01.03 DH:
' es gibt auch DBen, die nicht auf ".NSF" enden (z.B. ".NS4"), deshalb robustere Selektion
' alter Code
' FileFromServerList(FileCount%).FilePath = Left$(Ucase$(ServerMailFile.FilePath),Instr(1,Ucase$(ServerMailFile.FilePath),".NSF")-1)
' neuer Code
FileFromServerList(FileCount%).FilePath = Left$(Ucase$(ServerMailFile.FilePath),Instr(1,Ucase$(ServerMailFile.FilePath),".NS")-1)
' Ende Änderung 1 13.01.03
FileFromServerList(FileCount%).ServerName = TKServer
FileFromServerList(FileCount%).Owner = ServerMailFile.Title
End If
Set ServerMailFile = ServerDirectory.GetNextDatabase()
FileCount%=FileCount%+1
Wend
End Forall
'Create an array list of the files in the mail directory
i=0
Forall TKServer In doc.ServerToSearch
Set NABCollectList(i) = NABView.GetAllDocumentsByKey(Cstr(TKServer),False)
i=i+1
End Forall
'For all the users in the Public address book for the same server, create an array list
FileCount%=0
Forall NABCollect In NABCollectList
For NABCount% = 1 To NABCollect.count
Set NABDoc = NABCollect.GetNthDocument(NABCount%)
If Right$(Ucase$(NABDoc.MailFile(0)),4) = ".NSF" Then
' Änderung 2 13.01.03 DH:
' es gibt auch DBen, die nicht auf ".NSF" enden (z.B. ".NS4"), deshalb robustere Selektion
' alter Code
' FileFromNABList(FileCount%) = Left$(Ucase$(NABDoc.MailFile(0)),Instr(1,Ucase$(NABDoc.MailFile(0)),".NSF")-1)
' neuer Code
FileFromNABList(FileCount%) = Left$(Ucase$(NABDoc.MailFile(0)),Instr(1,Ucase$(NABDoc.MailFile(0)),".NS")-1)
' Ende Änderung 2 13.01.03
Else
FileFromNABList(FileCount%) = Ucase$(NABDoc.MailFile(0))
End If
FileCount%=FileCount%+1
Next
End Forall
'Compare the mail files found on the server to those in the Public address book. Exit if found and continue
Forall FileFromServer In FileFromServerList
Found = False
Print "Prüfe die Maildatei " + FileFromServer.FilePath
Forall FileFromNAB In FileFromNABList
If FileFromServer.FilePath = FileFromNAB Then
Found = True
Exit Forall
End If
End Forall
'If a mail file is not listed in the Public Address Book, flag it
If Found = False Then
Call uidoc.FieldAppendText ("MailFileName", FileFromServer.FilePath & Chr$(10))
Call uidoc.FieldAppendText ("MailFileOwner", FileFromServer.Owner & Chr$(10))
Call uidoc.FieldAppendText ("ServerName", FileFromServer.ServerName & Chr$(10))
End If
End Forall
Else
Messagebox("Kann das Adressbuch nicht öffnen :-(")
End If
End Sub
-
Hol Dir das Adressbuch über die Session, das muss nicht unbedingt names.nsf heissen