Druckerauswahl bei Mailmerge

Ich habe einen Libreoffice-Basic Macro geschrieben um mit Adressdaten
aus einer Datenbank Serienbriefe zu drucken. Das funktioniert auch
wunderbar. Allerdings möchte ich gerne wählen können auf welchem Drucker
die Serienbriefe tatsächlich gedruckt werden, also soetwas wie den
gewohnten Druckerdialog. Wie wird das gemacht? Ich habe trotz langem
Suchen leider keine Lösung finden können.

Hallo Reinhard
Hast du schon hier Geschaut?:
http://www.starbasicfaq.de/WiekannmandenDruckerwechseln..html

Gruß
frieder

Das kann leider nicht funktionieren, weil es vor dem Aufruf von
/mailmerge.execute/ ja noch gar kein Dokument gibt, dem man
Eigenschaften zuweisen könnte.

Reinhard

Das kann leider nicht funktionieren, weil es vor dem Aufruf von
/mailmerge.execute/ ja noch gar kein Dokument gibt, dem man
Eigenschaften zuweisen könnte.

Reinhard

Hallo
bevor du die Dokumente Drucken kannst, mußt du sie aber erst erstellen. Dabei kannst du ihnen auch einen Drucker zuweisen.
es besteht die Möglichkeit, sie erst in eine Datei zu drucken, und dann die Dateien per Makro zu Drucken.
wenn du nicht offenlegst , wie dein Makro funktioniert, dann kann dir hier keiner helfen.
Gruß
Frieder

Mein Macro ist kein großes Geheimnis: zuerst wird das zu druckende
Dokument ausgewählt, danach mailmerge initialisiert. In dem
prindlg-Dialog wird ein Drucker aus der Liste der existierende Drucker
ausgewählt und danach mailmerge.execute zum Drucken aufgerufen.

Sub Serienbrief_erstellen
    Dim MailMerge As Object
    Dim Eigenschaften() As Object
    Dim oTextDocument as Object
    Dim URL As String
    Dim outputpath as String
    Dim filename as String
    Dim Dummy()
    Dim oPrintServer ' The print server service.
    Dim oCore ' Get classes and other objects by name.
    Dim oClass ' XPrinterServer class object.
    Dim oMethod ' getPrinterNames method from the XPrinterServer class.
    Dim aNames ' List of printer names.
    dim props
    Dim myPrinter(0) as new com.sun.star.beans.PropertyValue
    Dim mydoc as object
   
    MyDialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
    MyDialog.execute
    filename=MyDialog.Files(0)
    if filename="" then exit sub
    MailMerge=createUnoService("com.sun.star.text.MailMerge")

    With MailMerge
        .DataSourceName="Myelomodbc"
        .DocumentURL=ConvertToURL(filename)
        .CommandType=2
        .Command="select * from myelomdata"
        .Filter=FilterText
        .OutputType=1
        .SinglePrintJobs = False
    End With
DialogLibraries.LoadLibrary( "Standard" )
dlgBeschreibung=DialogLibraries.Standard.Printdialog
printdlg=CreateUnoDialog(dlgBeschreibung)
Formular = ThisComponent.DrawPage.Forms.getByIndex(0)

  oPrintServer = CreateUnoService("com.sun.star.awt.PrinterServer")
  oCore = CreateUnoService("com.sun.star.reflection.CoreReflection")

  oClass = oCore.forName("com.sun.star.awt.XPrinterServer")

  oMethod = oClass.getMethod("getPrinterNames")

  aNames = oMethod.invoke(oPrintServer, Array())

  printdlg.getControl("Printerliste").Model.StringItemList = aNames()
  props=thisComponent.getPrinter()
  printdlg.getControl("Printerliste").selectItem(props(0).value,true)

printdlg.Execute()
if printername<>"" and Filtertext<>"" then
    myDoc=thiscomponent
    dim arg(0) as New com.sun.star.beans.PropertyValue
    arg(0).name="Name"
    arg(0).value=printername

    mydoc.setPrinter(arg())
   
    MailMerge.execute(Eigenschaften())
end if

if Filtertext="" then msgbox("Unzuläßige Auswahl '"+Filtertext+"'")

Reinhard

Hallo Reinhard

ich sehe jetzt, was dein Problem ist.

     myDoc=thiscomponent
     dim arg(0) as New com.sun.star.beans.PropertyValue
     arg(0).name="Name"
     arg(0).value=printername

     mydoc.setPrinter(arg())

Damit setzt du den Drucker nur für das Dokument, in dem der Makrocode gespeichert ist
(wenn der Code in Meine Makros ist passiert gar nichts.)Mir fallen auf die schnelle 2 mögliche Lösungen ein,
wobei ich nicht sicher bin, ob die erste funktioniert. die zweite sollte jedoch sicher funktionieren.
1.
...

     MyDialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
     MyDialog.execute
     filename=MyDialog.Files(0)
     if filename="" then exit sub

  Dim myProp(1) as new com.sun.star.beans.PropertyValue
  myProp(0).name="MacroExecutionMode"
  myProp(0).value = 0
  myProp(1).name="Hidden"
       myProp(1).value=True
  oMergDocument = StarDesktop.loadComponentFromURL(filename,"_blank",0,myProp())
DialogLibraries.LoadLibrary( "Standard" )
dlgBeschreibung=DialogLibraries.Standard.Printdialog

...'Drucker auswählen Dialog
...
printdlg.Execute()
if printername<>"" and Filtertext<>"" then

     dim arg(0) as New com.sun.star.beans.PropertyValue
     arg(0).name="Name"
     arg(0).value=printername

     oMergDocument.setPrinter(arg()) 'hier setze ich in der original Datei, den Drucker

end if

oMergDocument.Store() 'Doc mit neuem Drucker als standard Speichern.
'(ich weis nicht, ob diese eigenschaft gespeichert wird.
oMergDocument.Close(False) 'Doc schließen

  MailMerge=createUnoService("com.sun.star.text.MailMerge")
...

...

MailMerge.execute(Eigenschaften())

End sub

'2.Die Zweite Möglichkeit ist die, dass du den Serienbrief erst in eine Datei Druckst, und dann diese Datei aufrufst,
  den Drucker festlegst, Druckst und die Datei wieder Löscht. Das ist meiner Ansicht nach eine Sichere Methode.:

Sub xxx
Dim myPrinter(0) as new com.sun.star.beans.PropertyValue
     MyDialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
     MyDialog.execute
     filename=MyDialog.Files(0)
     if filename="" then exit sub

oMailMerge = CreateUnoService("com.sun.star.text.MailMerge")
oMailMerge.DocumentURL = ConvertToURL(filename)
oMailMerge.DataSourceName = "Myelomodbc"
oMailMerge.CommandType = 1
oMailMerge.Command = "select * from myelomdata"
oMailMerge.OutputType = com.sun.star.text.MailMergeType.FILE
oMailMerge.OutputUrl =ConvertToURL(c:\Temp.odf) 'muss man anpassen und gegebenenfalls schauen, ob FileNamePrefix gesetzt werde muß.
'oMailMerge.FileNamePrefix = "TempFile"
oMailMerge.SaveAsSingleFile=True
oMailMerge.execute(Array())
oMailMerge.dispose()

  Dim myProp(1) as new com.sun.star.beans.PropertyValue
  myProp(0).name="MacroExecutionMode"
  myProp(0).value = 0
  myProp(1).name="Hidden"
       myProp(1).value=True
  oMergDocument = StarDesktop.loadComponentFromURL("c:\Temp.odf","_blank",0,myProp())

DialogLibraries.LoadLibrary( "Standard" )
dlgBeschreibung=DialogLibraries.Standard.Printdialog
printdlg=CreateUnoDialog(dlgBeschreibung)
Formular = ThisComponent.DrawPage.Forms.getByIndex(0)

   oPrintServer = CreateUnoService("com.sun.star.awt.PrinterServer")
   oCore = CreateUnoService("com.sun.star.reflection.CoreReflection")
   oClass = oCore.forName("com.sun.star.awt.XPrinterServer")
   oMethod = oClass.getMethod("getPrinterNames")
   aNames = oMethod.invoke(oPrintServer, Array())
   printdlg.getControl("Printerliste").Model.StringItemList = aNames()
   props=thisComponent.getPrinter()
   printdlg.getControl("Printerliste").selectItem(props(0).value,true)

printdlg.Execute()
if printername<>"" and Filtertext<>"" then

     dim arg(0) as New com.sun.star.beans.PropertyValue
     arg(0).name="Name"
     arg(0).value=printername

     oMergDocument.setPrinter(arg())

end if

//
/ Dim printProp(4) as New com.sun.star.beans.PropertyValue/

//

oMergDocument/.Print(printProp()) 'Wenn du bestimmte Einstellungen willst
/'Oder

'oMergDocument/.Print(Array())/

oMergDocument.Kill 'Das erzeugte Dokument wieder Löschen.

End Sub

Gruß
Frieder