Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Davidxx am 25.01.10 - 09:46:52

Titel: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 09:46:52
Guten Morgen zusammen,
die Woche beginnt direkt mit einer Frage meinerseits :)

Folgendes Problem habe ich aktuell:

Ich habe eine Datenbank erstellt, in der ich mir verschiedene Dokumente nach Words exportiere.
Die ganze Formatierung geschieht mit Hilfe einer Word Vorlage (nicht per Script da auch Bilder usw. in der Vorlage vorkommen)

Das alles funktioniert prima, vorausgesetzt man hat die Vorlage im richtigen Ordner.

Jetzt ist die Anforderung, dass der Benutzer der Datenbank nicht per Hand diese Vorlage (die ich in einer Page in der Datenbank als Attachment eingefügt hab) in das richtige Verzeichnis kopiert. - Das Verzeichnis variiert außerdem zwischen unterschiedlichen Word / Windows Versionen.

Das Problem mit Registry auslesen usw. zu lösen scheint mir auch fast unmöglich, da auch hier die Pfade variieren.

Meine aktuelle Idee zur einfachen und perfekten Lösung ist jetzt folgendes:

   Set wordObj = CreateObject("Word.Application")
   wordObj.visible = True
   Call wordObj.Documents.Add("VorlageLösungskatalog.dot") <-- anstatt den Dateinamen anzugeben einfach auf das Dokument innerhalb der Datenbank verweisen.

Ist es möglich direkt auf das Dokument zu verweisen und damit das Word Object zu erstellen?

Alternative Lösungsvorschläge nehme ich auch gerne entgegen.

Gruß David


Edit:
Die Überschrift lautet Rich Text Feld... da ich zuerst dachte man würde das Vorlagedokument am besten als Quelle aus einem Rich Text Feld nehmen.
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 10:04:27
Hallo,

Zitat
Ist es möglich direkt auf das Dokument zu verweisen und damit das Word Object zu erstellen?
Ist glaube ich nicht moeglich.

Aber warum bindest Du die Vorlage nicht in ein (Konfig-)Dokument in der Db ein.
Nun pruefts Du, ob der aktuelle Anwender die Vorlage in dem entsprechenden Verzeichnis hat.
Wenn nicht, dann kannst Du, auch mittels Script, die Datei (Vorlage) in das entsprechende Verzeichnis aus dem Konfigdokument extrahieren und anschliessend weiterverwenden.

Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 10:09:13
Danke für die Antwort,

theoretisch würde ich dir da zustimmen, das wäre auch nicht wirklich schwer.
Aber wie oben schon beschrieben ist mir nicht bekannt wie das Vorlageverzeichniss des aktuellen Nutzers ist.

Das steht nichtmal eindeutig in der Registry, zumindest wenn ich korrekt gesucht habe.

Gruß David
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 10:19:12
Ich stelle mal noch folgende Frage.

Was definierts Du in deinem Fall als das Vorlagenverzeichnis des Benutzers?
Das was Du in den Einstellungen in Word treffen kannst? (Arbeitsgruppenvorlagen, Benutzervorlagen)


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 10:26:21
Also das Verzeichnis in dem Notes standardmäßig nachguckt um die Vorlage zu finden habe ich in der Registry gesucht aber nicht finden können:
D:\Dokumente und Einstellungen\DRezman\Anwendungsdaten\Microsoft\Vorlagen

Nur daraus hat er die Vorlagen bisher verwendet.

Das sind die Benutzervorlagen in Word.
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 10:31:19
Die Verzeichnisse der Vorlagen, die in den Optionen hinterlegt sind, solltest Du eigentlich ueber das Application-Object herausbekommen.

Code
strUserVorlagen = Application.Options.DefaultFilePath(wdUserTemplatesPath)
Somit bekommt man das Verzeichnis, welches als Verzeichnis fuer dei Benutzervorlagen definiert ist.


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 11:19:12
Ah super Tipp, danke.

Allerdings gibt er mir jetzt "D:Daten/Eigene Dateien" wieder, was ja nicht stimmt.
Das ist der korrekte Pfad wenn es um normale Dokumente geht, aber nicht für Vorlagen.

Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 11:30:10
Kannst Du mal den betreffenden Code (anonymisiert natuerlich) hier posten?


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 12:26:49
klar:

'15.01.2010 DvR
Sub Click(Source As Button)
   
   On Error Goto err_handler
   
   Dim oSession As New NotesSession
   Dim ouiwks As New NotesUIWorkspace
   Dim oUIDoc As NotesUIDocument
   Dim dc As NotesDocumentCollection
   Dim oDb As NotesDatabase
   Dim oView As NotesView
   Dim strSuchbegriff As String
   Dim oDoc As NotesDocument
   Dim ocolSearch As notesdocumentcollection
   Dim vReturn As Variant
   Dim sReturn As String
   Dim vResult As Variant
   Dim vSchlagwortliste As Variant
   Dim vListe As Variant
   Dim sjoin As String
   Dim listOfViewNames As String
   Dim selected_viewname As String
   Dim oRTItemBody As NotesRichTextItem
   
   Set oDb = oSession.CurrentDatabase
   Set dc = oDb.AllDocuments
   Set oDoc = dc.GetFirstDocument
   
   'Dim wsh As Variant
   'Set wsh = CreateObject("WScript.Shell")
   
   Dim strUserVorlagen As String
   Set Application = CreateObject("Word.Application")   
   
   strUserVorlagen = Application.Options.DefaultFilePath(wdUserTemplatesPath)
   
   'Dim WshShell As Variant
   'Dim oShellLink As Variant
   'Set WshShell = CreateObject("Wscript.Shell")
   'Set oShellLink = WshShell.CreateShortcut("D:\Daten\Eigene Dateien\Eigene Bilder\Actionleiste BDB.JPG.lnk")
   'oShellLink.TargetPath = "D:\Actionleiste BDB.JPG" 
   'oShellLink.Save
   
   'Call WshShell.RegRead( "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Word\Recent Templates" )
   
   'Erfassen der Suchworte
   Dim squery  As String
   squery = |@Sort(@Unique(@DbColumn("";"";"Lösungskatalog";1)))|
   vSchlagwortliste = Evaluate(squery)
   
   Dim vUserChosenSearchKeys As Variant
   vUserChosenSearchKeys = ouiwks.Prompt(7, "Auswahl","Bitte Schlagworte auswählen", vSchlagwortliste(0),vSchlagwortliste)
   
   Dim ocolAllResults As notesdocumentcollection
   Dim ovwToSearchIn As notesview
   Dim ocoltmp As notesdocumentcollection
   Dim odoctmp As notesdocument
   
   Set ovwToSearchIn = odb.getview("Lösungskatalog")
   Set ocolAllResults = ovwToSearchIn.getalldocumentsbykey ("~~~~~~~~~~",True)
   
   'Maske Lösungskatalog erstellen
   Set oDocLoesung = New NotesDocument(oSession.CurrentDatabase)
   
   oDocLoesung.Form="Lösungskatalog"
   
   If oDocLoesung.HasItem("Body") Then Call oDocLoesung.RemoveItem("Body")
   Set oRTItemBody = New NotesRichTextItem( oDocLoesung, "Body" )
   
   Forall search_key In vUserChosenSearchKeys
      Set ocoltmp = ovwToSearchIn.getalldocumentsbykey(search_key)
      If ocoltmp.count > 0 Then
         Set odoctmp = ocoltmp.getfirstdocument
         While Not odoctmp Is Nothing
            Call ocolAllResults.addDocument(odoctmp)
            Set odoctmp = ocoltmp.getnextdocument(odoctmp)
         Wend
      End If
      Set ocoltmp = Nothing
   End Forall
   
'   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'ocolAllResults schleife (1 bis n) - aus Dokument  die Feldwerte ziehen, Feld fldInhalt +  Feldwerte aus maske "Lösungskatalog"
   Dim varSchlagworte As Variant
   Dim varKurzbez As Variant
   Dim varKunde As Variant
   Dim varProjekttitel As Variant
   Dim varKurzbeschreibung As Variant
   Dim oDocResult As NotesDocument
   Dim richStyle As NotesRichTextStyle
   Set richStyle = oSession.CreateRichTextStyle
   Set oDocResult = ocolAllResults.GetFirstDocument
   
   'Word Dokument wird erstellt
   Dim wordObj As Variant
   Dim rtItem As NotesRichTextItem
   Dim gesamtText As Variant
   
   gesamtText = oRTItemBody.GetUnformattedText
'   gesamtText = oRTItemBody.GetFormattedText(False,80)
   Set wordObj = CreateObject("Word.Application")
   wordObj.visible = True
   Call wordObj.Documents.Add("VorlageLösungskatalog.dot")
   Set wordDoc = wordObj.ActiveDocument
   
   While Not oDocResult Is Nothing
      varKurzbez = oDocResult.GetItemValue("Kurzbez")
      varKunde = oDocResult.GetItemValue("Kunde")
      varProjekttitel = oDocResult.GetItemValue("Projekttitel")
      varKurzbeschreibung = oDocResult.GetItemValue("fldKurzbeschreibung")
      
      richStyle.Bold = True
      'Zur Erkennung das es sich um eine Überschrift handelt
      
      wordObj.Selection.Font.Bold = True   'Fett einschalten
      wordObj.Selection.TypeText varProjekttitel(0)+Chr$(11)
      wordObj.Selection.Font.Bold = False  'Fett ausschalten
      
      wordObj.Selection.TypeText varKurzbez(0)+Chr$(11)
      
      wordObj.Selection.TypeText "Kunde: "
      wordObj.Selection.TypeText varKunde(0)+Chr$(11)
      
      wordObj.Selection.TypeText varKurzbeschreibung(0)+Chr(10)
      
      'nächstes Dokument
      Set oDocResult = ocolAllResults.GetNextDocument(oDocResult)
      wordObj.Selection.TypeText "___________________________________________________________________ "+Chr(10)+Chr(10)
   Wend
   
   
   'Text in das Word Dokument schreiben
   With wordObj.Selection
      .TypeText(gesamtText)
   End With 
   
   Exit Sub
   
err_handler:
   'catch the "document is already in collection error and resume next
   Msgbox Error$ & " (" & Err & ")"   & " in Zeile " & Str(Erl)    
   If Err=4469 Then Resume Next
   Exit Sub
End Sub
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 12:32:54
Frage.

Die von der Funktion benoetigte Konstante wdUserTemplatesPath ist aber in Deinem Code schon definiert?
Es handelt sich hierbei um eine VBA-Konstante, die es in der Form nicht in LN gibt.


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 12:54:24
Oh ok,
das wusste ich jetzt nicht.
Dachte das wäre Lotus Script Code, nen parameter von dem Object.

Hab keine Ahnung von VBA.

Gruß David
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 13:21:52
Oeffne mal WORD. Dann die Tastenkombination Alt + F11.
Hier bist Du nun im VBA-Editor.
Nun noch die Taste F2 und Du hast den Objektkatalog vor Dir.

Hier findest Du alle VBA-Objekte, deren Methoden und die Konstanten

wdUserTemplatesPath = 2
wdWorkgroupTemplatesPath = 3


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Axel am 25.01.10 - 13:26:58
... oder guckst du hier: http://atnotes.de/index.php/topic,34333.0.html (http://atnotes.de/index.php/topic,34333.0.html)

Axel
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ascabg am 25.01.10 - 13:28:28
@Axel,

Irgendwann muss ich mir diesen Link endlich mal kopieren.   ;)


Andreas
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 13:30:54
Ah ok, wieder was gelernt.

Allerdings ist mit jetzt noch nicht ganz klar was ich mit der Konstanten machen soll und wie ich die ins Script bekomme, sodass sie funktioniert  :(
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Axel am 25.01.10 - 13:34:26
Du definierst sie am einfachsten als Konstante am Beginn deines Scripts. Ich mache das in der Regel nach den DIM-Anweisungen.

Z.B. so:
...
Dim oRTItemBody As NotesRichTextItem
   
Const wdUserTemplatesPath = 2
Const wdWorkgroupTemplatesPath = 3

...
Set oDb = oSession.CurrentDatabase
...

Im Script selbst kannst du dann wdUserTemplatesPath und wdWorkgroupTemplatesPath verwenden.

Axel
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ata am 25.01.10 - 13:34:51
... entweder die Konstanten deklarieren oder die Werte direkt verwenden...

Toni

EDIT: Axel war schneller
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: Davidxx am 25.01.10 - 13:47:45
Ja Klasse,
danke euch ;)

Ging ja doch noch einfacher als erwartet :)

Auch wenn ich nich so 100% durchblicke wie genau das mit
   Const wdUserTemplatesPath = 2
   Const wdWorkgroupTemplatesPath = 3
funktioniert.

Sprich die logik dahinter, wie er erkennt das es sich um Word handelt usw.

Trotzdem Danke an alle ;)

Gruß
Titel: Re: Rich Text Feld als Word Object Quelldokument
Beitrag von: ata am 25.01.10 - 13:51:03
... er erkennt es nicht - er verwendet den Wert der Konstanten - und die können heißen wie sie wollen. In deinem Fall hast du sie aus dem Makro übernommen und deklarierst sie eben bei dir. Du könntest sie auch umbenennen...

Toni