Autor Thema: Notes COM  (Gelesen 3220 mal)

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Notes COM
« am: 16.06.06 - 08:54:27 »
Hallo,
habe im Archiv gesucht und ATAs Hilfedatenbank heruntergeladen komme aber leider nicht ganz klar mit dem was ich gefunden habe.

Ich habe ein geöffnetes NotesDoc aus diesem erstelle ich ein Worddokument und übergebe bestimmte Daten (das funktioniert). Nun habe ich in Word einen selbst erstellten Menüpunkt (Speichern in Notes). Bei Klick soll das Worddoc in das im Hintergrund noch geöffnete Notesdoc angehängt werden (in das RichTextFeld Anhang).

Mir fehlt leider der Ansatz wie ich eine Instanz von Word (VBA) auf das geöffnete Notesdoc bekomme um die Datei anzuhängen.

Für einen Tipp wäre ich euch dankbar.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Notes COM
« Antwort #1 am: 16.06.06 - 10:02:28 »
An das geöffnete Dokument kommst Du via COM überhaupt nicht heran:
- NotesUI classes unterstützen COM nicht.
- Das Dealing mit rich text items muss daher im Backend von Notes geschehen, was das Schliessen des Docs im Frontend erfordert.

Du musst also einen anderen Gesamtansatz wählen.

Bernhard

y20frank

  • Gast
Re: Notes COM
« Antwort #2 am: 16.06.06 - 11:43:26 »
Hi, ich weiß nicht, ob dir das unten stehende Script (zumindest als Ansatz) weiterhilft... aus einem NotesDoc wird ein Word-Objekt(Document) erstellt und mit Daten aus dem NotesUIDocument befüllt und diesem dann angehängt...

Code
Sub Click(Source As Button)
' ###########################################################
' # Mit diesem Script werden Word-Dokumente erstellt und deren Feldern mit den 
' # Werten aus den Feldern des NotesUIDocumentes gefüllt.
' # Das Word-Object wird beim Speichern des Dokumentes als EmbedObject
' # angehängt. 
' # Eine nachträgliche Änderung des Dokumentes ist durch dieses Script 
' # nicht möglich!
' ###########################################################	
	
	' ----- Deklarationen
	Dim session As New NotesSession
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Dim todaydate As New notesdatetime("Today")
	Dim word As Variant
	Dim wordoc As Variant
	Dim zimmer As String
	
	' ----- Vordefinierte Variablen (oder aus Feldern des Front-End-Documents gelesene Werte)
	todaysdate = todaydate.localtime
	Zimmer = uidoc.FieldGetText("Zimmer")
	Auskunft = uidoc.FieldGetText("Auskunft")
	Fon = uidoc.FieldGetText("Fon")
	Fax = uidoc.FieldGetText("Fax")
	IhrZeichen = uidoc.FieldGetText("IhrZeichen")
	IhreNachrichtVom = uidoc.FieldGetText("IhreNachrichtVom")
	MeinZeichen = uidoc.FieldGetText("MeinZeichen")
	Datum = uidoc.FieldGetText("Datum")
	
	' ----- Word-Object erstellen
	Set word = CreateObject("Word.Application") 
	' ----- Erstellt neues Dokument auf der Basis der hier eingegebenen Word-Vorlage	
	Call word.documents.add("Return and Uplift 2.dot") 
	' ----- Handle für das aktive Word-Dokument
	Set worddoc = word.activedocument 
	
	' ----- Felder im Word-Dokument füllen.
	worddoc.FormFields(1).result = Zimmer
	worddoc.FormFields(2).result = Auskunft
	worddoc.FormFields(3).result = Fon
	worddoc.FormFields(4).result = Fax
	worddoc.FormFields(5).result = IhrZeichen
	worddoc.FormFields(6).result = IhreNachrichtVom
	worddoc.FormFields(7).result = MeinZeichen
	worddoc.FormFields(8).result = Datum
	
	filename$ = "c:\\temp\\notesword.doc"
	worddoc.saveas(filename$) 	' --- Word-Dokument speichern
	word.visible = True 		       ' --- Word nicht anzeigen
	word.quit 			            ' --- Word schließen
	
	' ----- Datei (WordDoc) anhängen
	Dim RTItem As NotesRichTextItem
	Dim doc As NotesDocument
	Set doc = uidoc.Document
	Set RTItem = New NotesRichTextItem(doc, "Body")  ' --- Anhang (erzeugte Datei) einfügen!
	Call RTItem.EmbedObject(EMBED_ATTACHMENT, "", filename$)
End Sub

HTH

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Notes COM
« Antwort #3 am: 16.06.06 - 11:48:28 »
Aus einer praktisch eingesetzten Anwendung stammt dieser Code aber nicht, oder? Jeder Aufruf dieser Routine erzeugt ein neues Item "Body", das angehängte Word-Dokument ist erst nach dem Schliessen und erneuten Öffnen des Frontend-Docs sichtbar usw.

Bernhard

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #4 am: 17.06.06 - 22:53:20 »
@Bernhard
@Y20frank
Danke für die Anworten!

Wie komme ich dann im Backend daran.

Das Problem ist das Worddoc wird geöffnet und von Notes mit Daten gefüllt und danach im Word weiter bearbeitet. Dann sollte das Doc wie schon gesagt über einen Button in das geöffnete bzw. auch übers Backend in das Notesdoc eingefügt werden.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Notes COM
« Antwort #5 am: 17.06.06 - 23:38:26 »
Wie gesagt: COM unterstützt nur das Backend. Du müsstest also das Frontnd-Dokument schliessen, Deine Aktionen in Word erledigen und das Backend-Dokument updaten und anschliessend wieder öffnen.

Bernhard

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #6 am: 17.06.06 - 23:58:24 »
@Bernhard
Danke, aber wie mache ich das über Word. Wie spreche ich da das Backenddoc an bzw. wie bekomme ich da eine Instanz auf das Notesdoc.

Ein Tipp würde mir sehr helfen.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Notes COM
« Antwort #7 am: 18.06.06 - 00:19:14 »
Da Du die Aktion von Notes aus startest, hast Du die Chance, das Frontend-Dokument zu schliessen. Du kannst so auch eine Stelle finden, wo Du für Word einen Handle / Hint auf das Backend-Dokument ablegst, so dass Du von Word aus wieder darauf zugreifen kannst, um das Backend-Dokument zu aktualisieren mit den aktuellen Word-Daten.

Bernhard

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: Notes COM
« Antwort #8 am: 18.06.06 - 20:57:11 »
Hallo,

Du hast ja das Frontend-Dokument, in dessen Backend-Dokument Du das Body-Feld mit dem Word-Dokument bestückst und speicherst.
Jetzt rufe das Backend-Dokument in derselben Instanz auf wie das aktuelle Frontend-Dokument. Schau Dir dazu mal EditDocument von NotesUIWorkspace an.

Set uidoc = ws.EditDocument([editMode] , [notesDocument] , [notesDocumentReadOnly] , [documentAnchor$] , [returnNotesUIDocument] true, [newInstance])

Set uidoc = ws.EditDocument(True, doc , False , "" , True, False).

Fals das nicht funzt, speicher nach dem Anhängen das Backend Dokument, refreshe das Frontend, öffne eine neue Instanz (ws.EditDocument(True, doc)),und schließe das 'alte' Frontend-Dokument, welches durch das refreshen, keine Speicher-Abfrage bringen sollte. Das geht eigentlich so schnell, das man es gar nicht bemerkt.

mfg

Kjeld
Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Notes COM
« Antwort #9 am: 18.06.06 - 21:42:33 »
... refreshe das Frontend, öffne eine neue Instanz (ws.EditDocument(True, doc)),und schließe das 'alte' Frontend-Dokument ...

Jetzt haben wir aber wieder den Moment, wo sich die Katze in den Schwanz beisst, Kjeld: Das ganze soll ja von Word aus passieren, und dann besteht wieder das Problem COM vs. UI-Klassen ...

Bernhard

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Notes COM
« Antwort #10 am: 19.06.06 - 11:25:39 »
Ich weiß die Frage zielt hier explizit auf COM ab. Aber warum etwas nehmen, dass nicht funktioniert, wenn es etwas gibt, dass sehr wohl funktioniert. Ich finde zwar den gesamten Ansatz  des ursprungsposter nicht sinnvoll, aber bitte.

Man kann sehr wohl von VBA auf das UI zurückgreifen. Hier ein Auszug aus der Hilfe:

Notes registers itself as an OLE automation server and provides the following OLE automation objects:
Notes.NotesUIWorkspace provides access to the Domino UI objects.
Notes.NotesSession provides access to the Domino Objects (that is, the back-end objects).
External applications can create and reference the automation objects, then work down through the object hierarchies. For example, a Visual Basic application might contain the following code:
Code
Set workspace = CreateObject("Notes.NotesUIWorkspace")
Set doc = workspace.CurrentDocument


Wobei wie gesagt, ich würde einen ganz anderen Ansatz wählen, da dieser sehr riskant ist, aber prinzipiell würde es funktionieren.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #11 am: 19.06.06 - 12:04:31 »
Danke, für die Anworten.
Aber ich verstehe immer noch nicht wie ich z.B. in VBA-Word über ein Modul auf mein Notesdoc zugreife.

Folgender Ansatzpunkt habe ich:
- Vor der Datenübergabe bzw. öffnen von Word schreibe ich die Doc-Id in die Notes.ini
- In Word, beim beenden des Documentes wird übers Backend (anhand der Doc-Id in der Notes.ini) das Doc geöffnet und der Anhang eingefügt und Word beendet.
- Das Notes UI-Doc ist noch geöffnet und wird geschlossen. Beim nächsten öffnen ist der Anhang sichtbar.

Würde das funktionieren?


 

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Notes COM
« Antwort #12 am: 19.06.06 - 12:32:25 »
Ähem was an meinem Code ist jetzt nicht verständlich?

Warum willst du die Doc ID in die Notes.ini schreiben. Was ist wenn mehrere Dokumente gleichzeitig offen sind?

Darf ich mal fragen, wie deine Kenntnisse von VBA und vom Notes Objektmodell sind?

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #13 am: 19.06.06 - 13:57:04 »
Danke Ralf,
ich habs schon verstanden.

Übers Backend mit der Dokid hab ich endlich hinbekommen:

Sub aa()
'Dimensionierung der Objektvariablen
    Dim SessionNotes As Object, NotesDB As Object, NotesDoc As Object
           
'Notes Datenbank-Objekt erstellen und initialisieren
    Set SessionNotes = CreateObject("Notes.NOTESSESSION")
    Set NotesDB = SessionNotes.GetDatabase("notessrv", "test.nsf")

'Set NotesDB = SessionNotes.CurrentDatabase
    If NotesDB.IsOpen = False Then
            MsgBox "Bitte melden Sie sich zunächst vollständig in Notes an!", vbInformation + vbOKOnly
            Exit Sub
        Else
            MsgBox "Datenbank ist geöffnet!", vbInformation + vbOKOnly
            MsgBox NotesDB.Title
    End If

  Set NotesDoc = NotesDB.GetDocumentByUNID("015301C889271DB4C1257192003D4600")
  If NotesDoc Is Nothing Then
        MsgBox ("Document nicht gefunden")
    Else
        MsgBox ("Document gefunden")
        MsgBox NotesDoc.Created
  End If
   
   
Dim subj As Variant
subj = NotesDoc.GetItemValue("dokument")
MsgBox subj(0)
End Sub



aber übers Frontend gekomme ich leider nur Fehlermeldungen. Hast Du mir nicht einen kleinen Codeschnipsel für den Ansatz:

Dim workspace As Object, uidoc As Object
Set workspace = CreateObject("Notes.NotesUIWorkspace")
Set uidoc = workspace.CURRENTDOCUMENT
MsgBox uidoc.FIELDGETTEXT("dokument") - hier kommt Fehlermeldung

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Notes COM
« Antwort #14 am: 19.06.06 - 13:59:12 »
Hm was für eine Fehlermeldung?

Grüße

Ralf

P.S. Habe deinen Code für das UIDoc gerade ausprobiert, funktioniert einwandfrei.
« Letzte Änderung: 19.06.06 - 14:00:50 von Ralf_M_Petter »
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #15 am: 19.06.06 - 14:20:23 »
Sorry, hast recht der Code funktioniert. Hatte nur zu viele Fenster geöffnet.

Wenn ich jetzt das uidoc ins Backend lege müsste ich doch den Anhang einfügen können oder?

Dim doc As notesdocument
Set doc = uidoc.document   
usw....

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Notes COM
« Antwort #16 am: 19.06.06 - 14:25:52 »
Ja kannst du, aber du bekommst das Frontend bei Rich Text nicht aktualisiert. Dazu musst du das Frontend Dokument schliessen und wieder öffnen. Funktioniert an und für sich ausser der Benutzer  hat irgendwas geändert, dann kommt der Schliessen Dialog mit der Abfrage ob du Änderungen speichern kannst. Das kann man mit diversen Tricks aber auch verhindern. z.B. das du das UIDOC zuerst programmatisch speicherst. Halte das aber trotzdem nicht für gut. Was ist, wenn der Benutzer während des Edits des Worddokuments in Notes ganz andere Fenster aufmacht?

Grüße

Ralf

P.S. Mir ist es nur um Richtigstellung der Behauptung gegangen, dass eine Benützung von UI Objekten von ausserhalb Notes nicht möglich ist. Wird immer wieder behauptet, sogar auf der DNUG in Karlsruhe. Ist aber nicht richtig wie man sieht. Liegt meiner Meinung nach daran, dass die meisten den Unterschied zwischen COM und OLE nicht kennen. Habe mich köstlich amüsiert auf der Dnug über den Vortrag zur Office Integration wo der Vortrag in diesem Bereich Lücken wie ein schweizer Käse hatte ;-)
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline skywook

  • Senior Mitglied
  • ****
  • Beiträge: 445
  • Ich liebe dieses Forum!
Re: Notes COM
« Antwort #17 am: 19.06.06 - 15:02:59 »
Es reicht mir wenn der Anhang erst beim nächsten öffnen des Dok angezeigt wird. Das Backend-Doc wird über "Word" gespeichert und das Frontend speichert der User.

Was ist, wenn der Benutzer während des Edits des Worddokuments in Notes ganz andere Fenster aufmacht?
Da ist meine Überlegung doch über die DokID zu gehen.

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Notes COM
« Antwort #18 am: 19.06.06 - 15:22:43 »
Sorry bin jetzt verwirrt. In deinem letzten Post wolltest du über das UIDOC gehen.

Wenn du rein über Backend gehst, dann hast du das Problem, dass du einen Speicherkonflikt bekommen wirst, wenn du sowohl über das Backend als über das Frontend speicherst.

Ich hab mir da eine etwas andere Lösung einfallen lassen. Wobei ich nicht weiß ob die auch mit Word funktioniert. Ich öffne aus Notes das Writer Dokument. Wenn jetzt der Benutzer z.B. das Notesdokument schliessen will, dann checke ich ob das Writer Dokument noch offen ist und sage im, dass er erst schliessen kann wenn er das Writer Dokument geschlossen hat. Wenn er das Writer Dokument ohne speichern geschlossen hat, dann mache ich beim Schliessen des Notes Dokuments gar nichts. Wenner das Writer Dokument gespeichert und geschlossen hat dann hol ich mir beim schliessen des Notes Dokuments das Writer Dokument und hänge es an das Notesobjekt. Das läuft ziemlich gut. Und ich habe bis jetzt (bin erst in der Testphase) noch keine Löcher in der Implementierung gefunden.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz