ich entwickle gerade eine Schnittstelle zu einem kommerziellen Produkt (WinHaus - Hausverwaltung). In diesem Zuge sollen Serienbriefe erstellt werden. Alles schön - alles wird gut! - Ich habe einen Code erzeugt und zunächst aus einem bereitgestellten CSV-Flat-File eine odb erzeugt, die ich erfolgreich dem Wunschtext zuordne. Nach dem ich den Merge beauftragt habe, werden so viele Dokumente erzeugt, wie Datensätze vorhanden sind. Das ist schön! - hat aber den Nebeneffekt, dass die Felder in den neuen Dokumenten leer sind. Wenn ich das Basisdokument öffne und über den Serienbriefmanager personalisieren in Auftrag gebe, funktioniert das alles wunderbar, auch mit dem automatisch zugewiesenen Dokument. Hat irgendwer eine Idee, wo genau ich auf dem Schlauch stehe? - Ach, es wäre noch schön, wenn nur eine Datei mit den einzelnen Dokumnten erzeugt werden würde. Hier nun mein Code:
Code: Alles auswählen
Dim oServiceManager As Object
Dim oMailMerge As Object
Dim MMArgs(0 To 6)
Dim Names
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
'Creating a public object to use reflection for structured properties
Set objCoreReflection = objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
'Creating a mailmerge object
Set objmailmerge = objServiceManager.createInstance("com.sun.star.text.MailMerge")
Set objDesk = objServiceManager.createInstance("com.sun.star.frame.Desktop")
'connecteren met de DatabaseContext
Set DatabaseContext = objServiceManager.createInstance("com.sun.star.sdb.DatabaseContext")
'Before we can start the merge: creating and registering the datasource
'Creating a empty datasource
Set dbInstance = DatabaseContext.createInstance()
' First rename DatabaseBasic
'tagesdatum$ = Format$(Now, "yyyymmddhhss")
'oldOne$ = "c:\temp1\WinHaus.csv"
'NewOne$ = "c:\temp1\WinHaus" + tagesdatum$ + ".csv"
'FileCopy oldOne$, NewOne$
'Kill oldOne$
NewOne$ = "WinHaus"
'DatabaseDocument is een storable Object. The normale dbInstance isn't:
'dbInstance.storeAsURL doesn't work. dd.storeAsURL does
Set dd = dbInstance.DatabaseDocument
'Datasource parameters
Dim csvParams(0 To 3)
Set csvParams(0) = OOO_MakeProperty("Extension", "csv", objServiceManager)
Set csvParams(1) = OOO_MakeProperty("HeaderLine", True, objServiceManager)
Set csvParams(2) = OOO_MakeProperty("FieldDelimiter", ",", objServiceManager)
Set csvParams(3) = OOO_MakeProperty("Charset", "iso-8859-1", objServiceManager)
dbInstance.Info = csvParams
dbInstance.URL = "sdbc:flat:file:///C:/temp1/"
' Datasource has to be saved as an odb - file before it can be registered in OpenOffice
Dim array1()
dd.storeAsURL "file:///C:/temp1/WinHausData1.odb", array1
'Registering the datasource in OpenOffice
'dsName = Mid$(NewOne$, 1, Len(NewOne$) - 4)
dsName = NewOne$
'if there is already a Datasource with this name: remove it
If DatabaseContext.hasByName(dsName) Then
DatabaseContext.revokeObject (dsName)
End If
'Registering the datasource
DatabaseContext.registerObject dsName, dbInstance
dd.store
dd.Close (True)
Set dd = Nothing
'And now the real mailmerge
Dim args(0 To 6)
' Template
Set args(1) = OOoNamedValue("DocumentURL", "file:///C:/temp1/WinHausText.odt")
' Datasource. This datasource points to a dir
Set args(0) = OOoNamedValue("DataSourceName", "file:///C:/temp1/WinHausData1.odb")
' CommandType = 0 => The field 'Command' must contain a table-name of the datasource
' in this case: datasource is a dir: 'Command' must contain a csv-file from that dir. (without the csv-extension)
Set args(2) = OOoNamedValue("CommandType", 0)
Set args(3) = OOoNamedValue("Command", dsName)
' OutputType = 2 => output to file
Set args(4) = OOoNamedValue("OutputType", 2)
'Dir for the results
Set args(5) = OOoNamedValue("OutputURL", "file:///C:/temp1/")
'Prefix for the results
Set args(6) = OOoNamedValue("FileNamePrefix", "new")
'start the merge
objmailmerge.Execute args()
Set objmailmerge = Nothing
Set dbInstance = Nothing
Set DatabaseContext = Nothing
Set objDesk = Nothing
Set objCoreReflection = Nothing
Set objServiceManager = Nothing