Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: matze72 am 02.04.05 - 19:37:17
-
Hallo,
ich bau grade an einem Programm (VB) das aus einer mail.nsf die selektierten Emails herausholt.
Ziel ist der Im- und Export von und nach Lotus von einem VB Programm aus.
Soweit läuft alles ganz gut. Nur an einem Problem beiße ich mir seit zwei Tagen die Zähne aus. Wie bekomme ich herraus ob in Notes in der Inbox zum Beispiel eine Email mit Häckchen ausgewählt ist oder nicht.
Hier das was ich bis probiert habe. (Ich bin kein Notes Programmierer also bitte ich um Nachsicht ;))
Ich hab mich durch das Objektmodell von Domino Com mittels Objektüberwachung gewuselt und hab den Eindruck, dass das ganze irgendwo in db.views steckt. Im Designer gibt es eine View $Inbox. Ich hab mir darauf hin die Views über die Überwachung von VB angeschaut und in db.Views(27).columns(1) den Eintrag gefunden, der vermutlich zu select margin in der view gehört, die ich mir über den Designer anschauen kann. Weiter bin ich nicht gekommen, und ich weiss auch nicht ob ich komplett auf dem Holzweg bin.
Vielen Dank im Vorraus, Gruß Mattias.
-
Also soweit ich das blicke brauchst Du die UnprocessedDocuments Eigenschaft der NotesDatabase - Klasse.
Das hat natürlich einen Haken:
When invoked on a NotesDatabase object that was not obtained from the CurrentDatabase property, this method raises an error.
CurrentDatabase hast Du aber nur von Notes aus. Somit sehe ich da keine Möglichkeit.
Aber umgekehrt könntest Du das machen, erscheint mir eh viel sinnvoller: Wenn es was zu exportieren gibt, dann steuere das von Notes aus. Z.B. Button-Klick durch User. Damit hast Du dann auch UnprocessedDocuments zur Verfügung.
-
Hallo erst, erst mal danke für die schnelle Antwort.
Aus Notes herraus zu arbeiten ist möglich, solange ich dabei nicht in der Datenbank des Users rumfummeln muss.
Ich hab bereits hinbekommen per Code von außen einen Menübutton zu installieren, von dem aus ich das VB-Tool starten kann. Ich glaube aber nicht dass ich damit noch irgendwelche Aufrufe in Notes absetzen kann. ???
Wichtig ist: Das ganze muss per Setup zu installieren sein (also kein Eingiff in die DB) und die Daten der User dürfen nicht verändert werden.
-
Damit auch ich das verstehe ;)
Du hast:
a) Lotus Notes
b) irgend ein externes Programm, das wohl VB kann
Du willst Dokumente von Notes in das externe Programm exportieren. Dabei sollen aber nur Dokumente behandelt werden, die der User markiert hat?
Geht meines Erachtens nur via NotesDatabase.UnprocessedDocuments.
D.h. Du brauchst Lotus Script. Du baust da ein, dass NotesDatabase.UnprocessedDocuments in eine NotesDocumentCollection geschrieben wird.
Diese DocCollection arbeitest Du über eine Schleife ab.
Forall doc_loop in NotesDocColl z.B.
Mit doc_loop hast Du dann das aktuelle Dokument. Mit diesem NotesDocument-Object kannst Du dann weiterarbeiten.
Wichtig ist: Das ganze muss per Setup zu installieren sein (also kein Eingiff in die DB) und die Daten der User dürfen nicht verändert werden.
Was meinst Du damit? Darfst Du in der Notes-DB nix machen oder in der Ziel-App nix machen?
Wenn Du die selektierten Docs brauchst, dann muss der Auslöser m.E. aus der entsprechenden Notes-DB kommen. Siehe oben.
-
Ich erzähl noch mal was ich vorhabe.
Ich bin Azubi (Fachinformatik) und soll für ein Programm das Informationen organisieren kann ein Addin für Lotus bauen.
Für Outlock gibt es diese Funktion bereits.
Der Vorgang:
User selektiert eine oder mehrere Mails, drückt einen Button, ein Export-Assisten erscheint der den Nutzer fragt an welcher Stelle in unserer DB die Mails gespeichert werden sollen.
Das ganze soll natürlich nicht die Notesdatenbank beeinflussen oder verändern.
Unser Programm ist in VB
Dass Addin das ich nutze ist in C++ geschrieben und ruft den VB Assistenten auf .
Ich hoffe das ganze ist jetzt etwas klarer.
Gruß Mattias.
-
Matthias, ich befürchte, dass das nicht funktionieren wird. Alle Methoden, die Bezug nehmen auf im Notes-Frondend markierte Dokumente, sind nicht für COM und damit externe Programme greifbar.
Wenn die Aufgabenstellung "nur" heisst, dass die Mailfiles Design-mässig nicht angefasst werden dürfen: Du kannst aus beliebigen Notes-DBs auf beliebige andere Notes-DBs zugreifen und dort Dokumente markieren und diese dann weiter verarbeiten. Das ganze muss aber innerhalb von Notes passieren.
Kannst Du diesen Weg auch gehen ?
Bernhard
-
Guten Morgen Bernhard ,
Alle Methoden, die Bezug nehmen auf im Notes-Frondend markierte Dokumente, sind nicht für COM und damit externe Programme greifbar.
Ist so etwas denn wenigstens mit Hilfe der C API möglich ?
Eine Alternative wäre , wenn ich mir einen Assistenten baue, der die Orddnerstruktur von Notes nachstellt und der User kann dort auswählen welche mails er exportieren will. Dazu müsste ich aber ermitteln in welchem Folder sich die Emails gerade befinden, und welche Folder es überhaupt gibt. - Ist das möglich ?
Gruß & Dank
Mattias
-
Du kannst mit OLE aufs Frontend zugreifen. Ob das Dein Problem wirklich löst, weiss ich allerdings "aus dem Handgelenk heraus" nicht und ob das eine vernünftige Lösung ist, da OLE leider nicht immer ganz stabil ist, musst Du allerdings abklären.
-
@Semeaphoros
Du kannst mit OLE aufs Frontend zugreifen
Hast du irgenwelche Quellen parat, wo ich mehr darüber erfahre was OLE kann und wie man es einsetzt ?
Danke im Vorraus
Mattias
-
Die Designer-Hilfe
-
@Semeaphoros
Die Designer-Hilfe
Hab ich mir gerade angeschaut.
Bringt mich leider im Augenblick nicht weiter.
Das ist ja der Weg, den ich ohnehin schon gehe. Ich erstelle ein Session objekt , initialisiere ....
Ich wusste nur nicht, dass ich dabei OLE verwende. Ich bin noch ein ziemlicher Neuling auf dem Gebiet.
Im Augenblick greife ich über VB (Domino Com) auf die Datenbank zu.
Nutze ich dabei bereits OLE oder ist OLE nocheinmal ein anderer Zugriffsweg auf Notes ?
Gruß und Dank
Mattias
-
Wenn Du Domino Com verwendest, gehst Du über COM und nicht OLE, das sind zwei verschiedene Paar Schuhe, COM, eigentlich der Nachfolger von OLE, kann bei Notes eben kein Frontend.
Suche in der Designer-Hilfe das Dokument mit dem Titel "Using OLE".
Und ein UI-Objekt beginnt mit einer Zeile so ähnlich wie diese:
Set workspace = CreateObject("Notes.NotesUIWorkspace")
(stammt aus obigem Dokument)
-
@Semeaphoros
Hallo,
Erst einmal Vielen Dank für deine Hilfe.
Suche in der Designer-Hilfe das Dokument mit dem Titel "Using OLE".
Ich hab mir den Artikel angeschaut. Leider ist alles sehr spärlich beschrieben.
Als ich
dim workspace as object
Set workspace = CreateObject("Notes.NotesUIWorkspace")
verwendet habe, hat mir VB auch leider keine Hinweise auf die dahinterliegenden Objekte gegeben.
Habe ich da irgendetwas falsch gemacht ?
Gibt es irgendwo eine Referenz in der man nachschauen kann was OLE kann ?
Gruß Mattias
-
Da fragst Du mich was, was ich auch nicht entgültig beantworten kann. Aber über Ole kannst Du eigentlich alles machen, was LotusScript eben auch bietet. Schau Dir die beiden Objekte NotesUIWorkspace und NotesSession an, und schau Dir auch die Beispiele zu oben genanntem Ole-Dokument an und bring das zusammen.
Gruss, Jens
-
@ Jens : Danke nochmal für deine Hilfe
Um noch einmal kurz zu umreißen um was es geht:
Ich suche entweder eine Methode um mit Hächchen selektierte mails zu ermitteln oder eine Methode um zu ermitteln welches Dokument sich in welchem Folder befindet (Inbox , Sent etc).
Wichtig ist nur dass dies von aussen geschieht.
Gibt es einen Zugriff auf das Genannte über Com ,C-API , oder OLE oder vielleicht noch eine andere Schnittstelle, die ich noch nicht
kenne ?
Für Hilfe bei diesem Problem wäre ich echt dankbar.
So langsam gehen mir die Ideen aus :'( .
Gruß Mattias
-
Die Eigenschaft "UnprocessedDocuments" der Datenbank, dazu musst Du aber eine Ansicht entsprechend öffnen, wo Du die Auswahl machen kannst. Ich nehme mal an, dass das über OLE machbar ist, da ich es aber selber noch nicht gemacht habe, kann ich das nicht mit Sicherheit sagen. Alle anderen Zugriffsverfahren kommen definitiv nicht in Frage.
-
@TMC
Also soweit ich das blicke brauchst Du die UnprocessedDocuments Eigenschaft der NotesDatabase - Klasse.
Hallo, ich bins mal wieder.
Ich hab gerade mal probiert das ganze über OLE zu realisieren.
Habe folgendes probiert:
Dim session As Object 'New NotesSession
Dim db As Object 'NotesDatabase
Dim collection As Object 'NotesDocumentCollection
Dim doc As Object 'NotesDocument
Set session = CreateObject("Notes.NotesSession")
Set db = session.CurrentDatabase 'GetDatabase("zx81/ontaris", "mail\admin.nsf")
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument()
Set collection = db.UnprocessedDocuments
wurde vom VB6 Compiler anstandslos verarbeitet.
Doc war nothing
@TMC
Du hattest geschrieben , dass man mit UnprocessedDocuments an die selektieren Mails heran kommt. Kannst Du mir bitte erklären wie ich da vorgehen muss.
;) wenn ich mich jetzt total verrannt habe bitte ich um Nachsicht, ich merke das ich noch viel zu lernen habe :)
Gruß Mattias
-
UnprocessedDocuments liefert je nach Kontext verschiedene Ergebnisse. Scheinbar in diesem eines, das nicht für dich geeignet ist.
eine Alternative wäre, die Dokumente, d.h. ihre Subjects, einfach in deinem VB Programm anzuzeigen und dort auswählen zu lassen. (fände ich persönlich auch angenehmer, Auswahl und Aktion an einer Stelle zu haben, aber was ich finde ist hier egal)
-
@Matze:
Set collection = db.UnprocessedDocuments
wurde vom VB6 Compiler anstandslos verarbeitet.
Doc war nothing
Ich habe jetzt die Diskussion zw. Jens und Dir nicht komplett verfolgt.
Die Designerhilfe sagt:
Note This property is not implemented in COM.
(...)
In scripts that are not a part of an agent or view action, this method returns a NotesDocumentCollection with zero documents.
Ich sehe hier eigentlich 2 Alternativen:
- a) Die Aktion vom Notes-Client aus zu steuern als View-Button, dadurch hast Du db.UnprocessedDocuments zur Verfügung (hatte ich oben schon mal vorgeschlagen)
- b) Wie von Thomas vorgeschlagen, die Dokumente im VB-Programm anzeigen und auswählen lassen.
@TMC
Du hattest geschrieben , dass man mit UnprocessedDocuments an die selektieren Mails heran kommt. Kannst Du mir bitte erklären wie ich da vorgehen muss.
Das geht m.E. (und auch lt. Help) wie schon mehrfach erwähnt nur von der aktuellen DB aus, also z.B. Button-Aktion in entsprechender Notes-View.
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument
While Not(doc Is Nothing)
'===== Hier Dein Code um das doc-Objekt zu bearbeten ======
Set doc = collection.GetNextDocument(doc)
Wend
db wird hier wie folgt deklariert:
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
-
Hallo,
ich hab es endlich hingekriegt ;D.
Ziel war ja dass ich irgendwie an die Mails aus VB herraus rankommen musste die per Häckchen selectiert sind.
Das ganze hat den Sinn das der Notes User in Notes über die Häckchen die Emails auswählen kann die in unsere DB exportiert werden sollen.
Über einen Button im Aktionsmenü (der mit Hilfe einer C++ dll die über einen Notes.ini Eintrag aufgerufen wird eingebunden wird)
Kann unser Programm gestartet werden.
Das Programm holt sich nun alle selektierten Mails mit samt NotesURL über die Routine unten aus der view herraus und kann sie danach in unsere DB importieren.
Dim currView As Object
Dim collection As Object 'NotesDocumentCollection
Dim doc As Object 'NotesDocument
Dim workspace As Object
Set workspace = CreateObject("Notes.NotesUIWorkspace")
Set currView = workspace.CURRENTVIEW
'Jetzt wird die aktuelle View angezeigt
'Die View ist der aktuelle Mailordner
'Den in unserer DB können wir dann ein entsprechendes Buch mit dem Titel des Mailordners
'anlegen und die Mails dort ablegen
Call MsgBox(currView.VIEWNAME) 'der String wird später unserem Programm übergeben
'Die collection enthält alle ausgewählten (Haekchen)
Set collection = currView.DOCUMENTS
Set doc = collection.GetFirstDocument
' Wenn Notes geöffnet ist werden alle Dokumente bei denen
' das Haeckchen gesetzt ist ausgelesen.
' In dem Beispiel ist es die Betreffzeile und die NotesURL
' Die NotesURL können wir dann nutzen um die Mails in unsere DB zu holen
While Not (doc Is Nothing)
Call MsgBox(doc.GetFirstItem("Subject").Text)
Call MsgBox(doc.NotesURL)
Set doc = collection.GetNextDocument(doc)
Wend
Den Quellcode für den Eintrag in das Actionsmenü hab ich übrigens von "the codeproject " ein Programierer mit dem Nickname "TiNgZ aBrAhAm" hat dort eine C++ .dll veröffentlicht die das kann.
http://www.thecodeproject.com/dll/notesmenuaddin.asp
An dieser stelle noch einmal herzlichen Dank an alle, die ich hab nerven dürfen.
Gruß Mattias