Seite 1 von 3

[gelöst ] Fragen zums Dispatcher ?

Verfasst: Do, 20.12.2012 14:48
von boser
Hallo,

ich habe folgendes Problem.
Gegeben eine Calc-Datei mit mehre Tabellen, aus dem nur jeweils ein Ausschnitt in eine PDF Datei exportiert werden soll, und das am besten dadurch , das ich noch mal eine Tabellenblatt anhänge und auf dem in einer Liste , die Tabellenblätter mit dem zu exportierenden Bereich steht.
Jetzt zu meiner Frage, ich würde gerne den Dispatcher verwenden, hab aber noch zu wenig Erfahrung.

1. Wo bekomme ich eine knappe Erklärung über das Teil her ?
2. Welche Parameter müssen wo , wie angegeben werden ? Gibt es dazu eine Liste ?
3. Gibt es irgendwo eine Beispielsammlung ?

Ich wäre für Tipps und Hinweise , sehr dankbar, da selbst Google meine Wissensdurst nicht befriedigt hat.

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 07:48
von boser
Hallo,

ich hab jetzt mal ein Makro geschrieben.
Es wäre nett, wenn es einige Leute bei sich ausprobieren können und mit ein Feedback geben können.
es ist erst mal nur der Erste Versuch.
Bitte die Hinweise aus dem Tabellenblatt "PDF" beachten.

Ich freue mich schon auf eure Hinweise und Tipps, so wie Anregungen.

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 14:29
von HHTiger
Hallo boser,
boser hat geschrieben:Bitte die Hinweise aus dem Tabellenblatt "PDF" beachten.
für das Problem slash oder backslash am Ende des Pfads habe ich Dir schnell mal eine kleine Funktion geschrieben, die das Problem löst:

Code: Alles auswählen

Function fncPathCorrected(sPath as String) as String 'Function to ensure slash or backslash at the end of string

	Dim iPos as Integer
	Dim sLastCharacter as String
	
	sLastCharacter = Right(sPath,1)
	iPos = InStr(sPath, "/")
	
	If iPos = 0 Then 'it's a Windows path
		If sLastCharacter <> "\" Then 'backslash is missing
			sPath = sPath & "\"
		End If
	Else 'it's a Linux path
		If sLastCharacter <> "/" Then 'slash is missing
			sPath = sPath & "/"
		End If
	End If
	
	fncPathCorrected = sPath	

End Function
Aufgerufen wird sie z.B. so:

Code: Alles auswählen

    sDirectory = fncPathCorrected(objBlatt.getCellRangeByName("N3").String)
Allerdings hast Du noch beim "speichern" im Code das Problem, dass es nur für Linux funzt. Du kannst allerdings meine Funktion ensprechend erweitern, oder eine weitere Funktion nach meinem Beispiel schreiben, die auch das löst.

Sowohl das Speichern, als auch das Zusammensetzen des Dateinamens liegen komplett in der FOR NEXT Schleife. Das macht nicht wirklich Sinn. Ausserdem würde ich Dir empfehlen, alle Befehle innerhalb der Schleife einzurücken, damit Du nicht den Überblick verlierst.

Gruß Klaus

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 15:35
von juetho
Die Frage slash/backslash bzw. Linux/Windows ist nebensächlich; darauf haben die Entwickler von OO schon geachtet. Zum Öffnen und Schließen von Dateien stehen Funktionen wie convertToUrl und loadComponentFromUrl zur Verfügung, mit denen das gesteuert wird (und die schon benutzt werden). Mehr Beispiele gibt es bei Andrew Pitonyak und Dannenhöfer (siehe die Links in den Hinweisen zur StarBasic-Programmierung).

Zu allem anderen kann ich nichts sagen; so tief bin ich in Calc nicht eingestiegen. Jürgen

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 16:01
von boser
@Klaus,

danke für deine function, ich hab sie erst mal übernommen und werde sie noch mal testen.
Zu deiner Anmerkung, warum ich das in einer For-Next-Schleife drin habe, ist zu sagen, das die Anforderung so war, das ich pro Tabellblatt ein PDF erzeugen sollte, deshalb auch der verzweifelte Versuch mit dem Zusammensetzten des PDF_Dateinamen aus einen Allg. Teil, den der Benutzer eintragen kann und einen Teil aus dem Tabellenblattname , damit man schon anhand des PDF-Dateiname sehen kann , um welches Tabellblatt es sich handelt.
Zum Speicherproblem kann ich mom. nichts sagen, da ich nur openSUSE 11.4 und 12.2 am Start habe.

@Jürgen,
danke für den Hinweis.
Das was ich da geschrieben haben sind meine ersten Gehversuche im OO-Basic , bzw. LO-Basic. Ich werde mir diese zwei Funktionen noch genauer anschauen.

Über Kritik , wie Verbesserungsvorschläge freue ich mich.

[Edit]
@Klaus,
Könntest du mal als Pfad folgendes eingeben : C\:\\........ , damit einam die Doppelpunkte und der eine Backslash maskiert ist.

[/EDIT]

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 16:20
von balu
Hallo bose,

ich weiß nicht ob dispatcher so gut ist. Besser ist es wenn Du dich mit richtiger Programmierug befasst, da kannst Du unter umständen einiges an Code-Zeilen einsparen. Und nein, ich kenne momentan keine Lektüre für den dispatcher.

Zu dem Slash. Das ganze geht auch bedeutend kürzer.

Code: Alles auswählen

Sub Slash_Backslash
REM 1 = Windows _ 3 = MacOS _ 4 = Unix
	OS = GetGUIType()
	if OS = 1 then sStrich = "\" REM Windows
	if OS = 4 then sStrich = "/" REM Unix / MacOS 
	print sStrich 
end sub

Gruß
balu

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 16:29
von boser
Hallo balu,

danke für den Programmschnipsel, werde ich mir anschauen.
Aber, was meinst du mit "richtiger" Programmierung ? Wie kann man sonst Teile eines Tabellenblattes in einem PDF konvertieren und die einzelene Blätter , einzeln Speichern ohne Dispatcher.
Hast du Beispiele oder eine Anleitung dazu ? ( richtigen Programmieren )

Ich hab früher mal mit VB und anderen Basic-Dialekt programmiert.

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 16:49
von turtle47
Hall Balu,
Das ganze geht auch bedeutend kürzer.
[Besserwissmodus on]

Code: Alles auswählen

Sub Main
print getpathseparator 'Pfadtrenner des aktiven Betriebssystems
End Sub
[Besserwissmodus off] :wink:

Gruß
Jürgen

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 16:53
von boser
An Alle,
eine Dispatcher- Anleitung ist hier zu finden.
http://de.scribd.com/doc/86875934/144/F ... h-commands
danach hab ich mehre Tage gesucht. :evil:

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 17:58
von lorbass
boser hat geschrieben:eine Dispatcher- Anleitung ist hier zu finden.
http://de.scribd.com/doc/86875934/144/F ... h-commands
Andrew Pitonyak stellt fertige Teile der Version 3 seines von dir verlinkten Werkes OpenOffice.org Macros Explained zum Download zur Verfügung. Eine deutsche Übersetzung von Teilen daraus ist bei Volker Lenhardt erhältlich.

Gruß
lorbass

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 18:34
von HHTiger
Hi boser,
boser hat geschrieben:deshalb auch der verzweifelte Versuch mit dem Zusammensetzten des PDF_Dateinamen aus einen Allg. Teil, den der Benutzer eintragen kann und einen Teil aus dem
das ist ja auch ok, aber den allgemeinen Teil des Benutzers brauchst Du nur einmal vor der Schleife holen!
boser hat geschrieben:Zum Speicherproblem kann ich mom. nichts sagen, da ich nur openSUSE 11.4 und 12.2 am Start habe.
Könntest du mal als Pfad folgendes eingeben : C\:\\........ , damit einam die Doppelpunkte und der eine Backslash maskiert ist.
Ob maskiert oder unmaskiert .... es kommt die selbe Fehlermeldung. Leider kenne ich mich zu wenig mit openSUSE und OO aus, um Dir mit dem Problem weiterhelfen zu können. Vielleicht kann hierzu ja noch einmal einer der richtigen Spezies etwas sagen.

Gruss Klaus

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 19:00
von HHTiger
@balu:
balu hat geschrieben: Zu dem Slash. Das ganze geht auch bedeutend kürzer.

Code: Alles auswählen

Sub Slash_Backslash
REM 1 = Windows _ 3 = MacOS _ 4 = Unix
	OS = GetGUIType()
	if OS = 1 then sStrich = "\" REM Windows
	if OS = 4 then sStrich = "/" REM Unix / MacOS 
	print sStrich 
end sub
Eleganter ist das auf jeden Fall, aber selbst dabei brauchst Du noch ein paar Zeilen Code mehr, um den vom Benutzer vorgegebenen Pfad zu korrigieren! :wink:
Es ging ja nicht darum, auf welchem System das Makro läuft, sondern darum den vom Benutzer eingegebenen Pfad zu korrigieren. Aber wenn man beide Codes zusammenbringt, dann kann man natürlich auch noch einen Fehler abfangen, falls ein Windows-Pfad auf einem Linux-System (oder umgekehrt) verwendet wird.


Gruss Klaus

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 19:16
von turtle47
Hallo,
Ob maskiert oder unmaskiert .... es kommt die selbe Fehlermeldung.
kontrolliere doch mal die Pfadangabe mit einer Printanweisung:
Path.jpg
Path.jpg (15.42 KiB) 7227 mal betrachtet
Gruß
Jürgen

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 19:33
von HHTiger
@Jürgen:
turtle47 hat geschrieben:kontrolliere doch mal die Pfadangabe mit einer Printanweisung:
wen sprichst Du damit gerade an? Falls Du mich meinst, dann würde ich fragen, wie dieser Paramater denn für den Dispatcher unter Windows aussehen müßte (wie er jetzt aussieht weiß ich).

Gruß Klaus

Re: Fragen zums Dispatcher ?

Verfasst: Fr, 21.12.2012 20:08
von F3K Total
Hallo Boser,
da ich die Dispatcher Befehle nicht leiden kann, habe ich dein Makro mal umgeschrieben.
Dieses arbeitet ohne Export mit dem Setzen von Druckbereichen. Funktioniert unter Windows und Linux.

Code: Alles auswählen

REM  *****  BASIC  *****
option explicit

REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
REM XX       Macro : Zum erzeugen von PDF-Dateien      XX
REM XX        erstellt am : 21.12.2012                 XX
REM XX          Autoren : boser, F3K Total             XX
REM XX                                                 XX
REM XX   Hinweise auf dem Tabellblatt "PDF" beachten   XX
REM XX                                                 XX
REM XX          Version : 0.1? ( Testversion )         XX
REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Sub PDF_Dateien_erzeugen
	Dim objDatei as Object
	Dim objBlaetter as Object
	Dim objBlatt as Object
	Dim objZelle as Object
	dim objCursor as Object
	Dim objExportBlatt as Object
	Dim sRangename as String
	dim oRange as Object
    dim oRanges(0) as Object
	Dim sDirectory as String
	Dim sZellwertN4 as String
	Dim i as Integer
	Dim j as integer     rem Tabellblattnummer
	Dim intZeilen as Integer
	Dim strTab as String
	Dim von as String
	Dim bis as String
	Dim sURL as String
	Dim myProps(0) as New com.sun.star.beans.PropertyValue

	
	objDatei = ThisComponent
	objBlaetter = objDatei.Sheets
	objBlatt = objBlaetter.getByName("PDF")

	objZelle = objBlatt.getCellRangebyName("A1")	
	objCursor = objBlatt.createCursorByRange(objZelle)
	objCursor.collapseToCurrentRegion()
	intZeilen = objCursor.Rows.Count

	For i = 2 to intZeilen-1
		objZelle = objBlatt.getCellByPosition(0, i)
		strTab = objZelle.String
		objZelle = objBlatt.getCellByPosition(1, i)
		von = objZelle.String
		objZelle = objBlatt.getCellByPosition(3, i)
		von = von & objZelle.VALUE
		objZelle = objBlatt.getCellByPosition(2, i)
		bis = objZelle.String
		objZelle = objBlatt.getCellByPosition(4, i)
		bis = bis & objZelle.VALUE

		sRangename = von & ":" & bis
        objExportBlatt = objBlaetter.getbyname(strTab)
        oRange = objExportBlatt.getCellRangeByName(sRangename)

        'Druckbereich setzen
        oRanges(0) = oRange.RangeAddress
        objExportBlatt.setprintAreas(oRanges())
        sDirectory = objBlatt.getCellRangeByName("N3").String
        sZellwertN4 = objBlatt.getCellRangeByName("N4").String
        sURL = converttourl(sDirectory & sZellwertN4 & "_" & strTab & ".pdf")'passt den Pfad dem Betriebssystem an
        'PDF exportieren
        myProps(0).Name="FilterName"
        myProps(0).Value = "calc_pdf_Export"
        objDatei.storetoUrl(sURL,myProps())
        objExportBlatt.setprintAreas(array())'Druckbereich löschen
   next i

	msgbox "Ende"
End Sub
Viel Spaß
Gruß R