Drucken mit Report Builder auf NICHT-Standard Drucker

ThisDatabaseDocument.ReportDocuments.getByName(“Drucke_AUFTRG”,).open
funktioniert ja wunderbar ! er macht ein neues Textdokument auf aber der Benutzer muss jetzt einen
Drucker via “Printer” auswählen soferm er der einen NICHT-Standard-Drucker will.
Die LO-Funktion lässt einen beliebigen Drucker festlegen aber der bleibt dann für alles
Wunschvorstellung:
ThisDatabaseDocument.ReportDocuments.getByName(“Drucke_AUFTRG”, printer=Mysecond-Printer).open
Ich kann nirgendwo methods, properties oder parmeter zu finden.
Wer hat entspr. LInks / Infos

Du wirst keine besonderen Informationen für ReportDocuments benötigen. Du übergibst das ReportDocument als Objekt und dann geht es weiter wie im Handbuch beschrieben:

Sub BerichtDruckenUndSchliessen(oReport AS OBJECT)
DIM Props
DIM stDrucker AS STRING
Props = oReport.getPrinter()
stDrucker = Props(0).value
DIM arg(1) AS NEW com.sun.star.beans.PropertyValue
arg(0).name = "Name"
arg(0).value = "<" & stDrucker & ">"
arg(1).name = "Wait"
arg(1).value = True
oReport.print(arg())
oReport.close(true)
End Sub

Schau Dir im Base-Handbuch einfach einmal das Kapitel “Makros” > “Datenbankaufgaben mit Makros erweitert” > “Drucken aus Base heraus” an. Da ist die obige Prozedur Teil eines Druckvorgangs, der komplett im Hintergrund läuft. Daher schließt die Prozedur auch mit dem close-Befehl.

Der Hinweis mit der Übergabe als Object ist echt gut
das klappt.
aber was immer ich mit arg(0).value auch treibe
er nimmt immer den Standard-Drucker
stDrucker = “mysecondPrinter”
oReport.setPrinter(arg)
Print “arg”, arg(0).value zeigt den gewollten
Drucker an, aber er nimmt den Standarddrucker
LO 6.0.7…

Ich kann das hier nicht testen, da ich eben nur einen Drucker habe. Kannst Du über xray einmal auslesen, was für Drucker in oReport.getPrinter() überhaupt vorkommen?

Code hier eingeben
Sub PrintAllPrinterNamesWorkaround()
Dim oPrintServer ’ Der Service PrinterServer.
Dim oCore
’ Zugriff auf Klassen und andere Objekte über ihre Namen.
Dim oClass
’ Die Objektklasse XPrinterServer.
Dim oMethod
’ Methode getPrinterNames von der Klasse XPrinterServer.
Dim aNames
’ Liste der Druckernamen.
’ Erzeugt das Objekt, das erst mit OOo 3.5 direkt verfügbar sein wird.
oPrintServer = CreateUnoService(“com.sun.star.awt.PrinterServer”)
oCore = CreateUnoService(“com.sun.star.reflection.CoreReflection”)
’ Die Objektklasse für das Interface XPrinterServer.
oClass = oCore.forName(“com.sun.star.awt.XPrinterServer”)
’ Die Methode getPrinterNames für die Klasse XPrinterServer.
oMethod = oClass.getMethod(“getPrinterNames”)
’ Aufruf der Methode getPrinterNames für das Objekt PrinterServer.
aNames = oMethod.invoke(oPrintServer, Array())
MsgBox Join(aNames, Chr$(10))
End Sub
Diese Routine aus dem Buch von Thomas Krumbein
zeigt 3 Drucker: dtmx, M2070, M2070-Series was stimmt !

Wie bekomme ich hier die Source
ordentlich formatiert ?

Für den Code musst Du den Text jeweils 4 Leerzeichen vorne einrücken.
Ich hätte direkt aus dem benutzten Makro die Drucker ausgelesen - also eben über so etwas wie xray. Aber jetzt weißt Du ja auch so den Namen. Den müsstest Du dann als stDrucker in den Code eingeben.

Übrigens: wenn man aus der Routine unten

die Props nicht abfragt und in die args nicht einsetzt
druckt er trotzdem → auf dem Standarddrucker
Vermutung: es passt ihm was an der Schreibweise < " etc. nicht
und statt einer Fehlermeldung nimmt er den Standarddrucker.

Habe weltweit gesucht:
Aprendiendo LibreOffice Basic
Imparare LibreOffice Basic

auf Seite 297 ff gibts weitere Beispiele
die rein mit " auskommen … klappt aber auch nicht

DIM myprinter AS STRING
myprinter = "M2070"
DIM arg(1) AS NEW com.sun.star.beans.PropertyValue
arg(0).name = “Name”
'arg(0).value = “<” & “M2070” & “>”
'arg(0).value = “M2070”
arg(0).value = myprinter
'arg(0).value = “<” & myprinter & “>”
arg(1).name = “Wait”
arg(1).value = True
oReport.setPrinter(arg)
Print “arg”, arg(0).value , arg(0).name , arg(1).name, arg(1).value
oReport.print(arg())
oReport.close(true)
End Sub

so frisst er es Besten Dank

Ein ungueltiger Druckername bringt keine Fehlermeldung
sondern er nimmt den Standarddrucker - ist doch nett - oder ?
Vielen Dank für Die Hilfe

Deswegen meinte ich: Direkt die Drucker auslesen - wie kommen sie aus

oReport.getPrinter()

raus. In der Prozedur frage ich ja nur den ersten Drucker ab - und das wird der Standard sein. Könnte also auch sein, dass bei 2 Druckern die Wahl des anderen Druckers automatisch mit

stDrucker = Props(1).value

geht. Nur wird das einen Fehler rausschmeißen, sobald gar keine 2 Drucker existieren …

Aber wenn 's jetzt klappt ist ja gut.