Gelöst:Writer-Datei mit Namen aus Seriendruck-Feld speichern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Gelöst:Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von Rupp »

Guten Abend und frohe Ostern :-)
ich möchte ein Makro für Writer erstellen, das die aktuelle Datei (eine Rechnung) automatisch unter einem speziellen Dateinamen speichert.

Dieser Dateiname soll sich aus zwei Teilen zusammensetzen:
a) aus einer Nr., die zuvor manuell in einem EINGABEFELD eingetragen wurde (das ist die Rechnungsnummer) und
b)dem Nachnamen des Rechnungsempfängers , der aus dem entsprechenden SERIENDRUCKFELD, das mit einer Datenbank verbunden ist, entnommen werden soll.

Ich möchte geren "ThisComponent.storeAsURL( adresse, Array() )" verwenden, mit dem ich in Calc ähnliches erfolgreich realisieren konnte. Jetzt weiß ich aber nicht, wie ich die URL erzeugen kann. Wie ich also das Eingabefeld und das Sereindruckfeld richtig ansprechen und dann zu einer URL zusammensetzen kann. Alle meine bisherigen Versuche blieben erfolglos.

So bitte ich also um Hilfe. Da ich Programmiernafänger bin, bräuchte ich am besten ein Codebeispiel. Das Seriendruckfeld, dessen Inhalt ich nutzen möchte, heißt [Adressen.Adressliste_Klienten.Nachname]. Welchen Namen das Eingabefeld hat, kann ich nicht sagen (wenn ich die Feldnamen einblende, erscheint nur Eingabe-Feld).

Herzlichen Dank

Rupp
Zuletzt geändert von Rupp am Mo, 05.04.2010 14:14, insgesamt 1-mal geändert.
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von turtle47 »

Hallo Rupp,
Rupp hat geschrieben:Welchen Namen das Eingabefeld hat, kann ich nicht sagen (wenn ich die Feldnamen einblende, erscheint nur Eingabe-Feld).
Du hast dem Eingabefeld beim Erstellen doch bestimmt einen Hinweis mitgegeben. Oder?
Sonst mal einen Rechtsklick darauf machen und im Kontextmenue "Feldbefehl..." auswählen.
Dort den Hinweis eintragen. Dieser Name muss dann auch im Makro verwendet werden.

Versuche mal folgenden Code:

Code: Alles auswählen

sub Seriendruck_auslesen2
Dim sEingabe, sNachname, sURL, sField  as String
Dim oFeld, oDoc, oTxtFelder as Object
	oDoc = thiscomponent
	oTxtFelder = oDoc.getTextFields().createEnumeration()
	on Error goto weiter	
	do while oTxtFelder.hasmoreElements()	
	oFeld = oTxtFelder.nextElement
	if oFeld.SupportedServiceNames(0) = "com.sun.star.text.TextField.Input"_
	and oFeld.hint = "Rechnungsnummer" Then 'Beschreibung (Hinweis)des Eingabefeldes anpassen!
	sEingabe = oFeld.Content
	end if	
	loop
	Weiter:
	do while oTxtFelder.hasmoreElements()
	oFeld = oTxtFelder.nextElement
	sField = ofeld.getTextFieldMaster.DataColumnName
	if sField = "Nachname" then 'Namen des Serienfeldes anpassen
	sNachname = oFeld.Content
	end if
	loop
	'################    Jetzt den String für das Speichern generieren #############
	sURL = ConvertToURL("C:/USER/" & sEingabe & "_" & sNachname & ".odt"
	msgbox 	sURL
End Sub
Auf die Schnelle ist mir nichts anderes eingefallen.

Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von Rupp »

Hallo Jürgen,

das ging aber schnell - Dankeschön :-)

Ich habe Deinen Code eingegeben und angepasst. Bei dieser Zeile bleibt das Makro stehen:
sField = ofeld.getTextFieldMaster.DataColumnName
(also eine Zeile vor: if sField = "Adressen.Adressliste_Klienten.Nachname" then)

Die Fehlermeldung lautet:
Basis Laufzeitfehler: Eigenschaft oder Methode nicht gefunen. DataColumnName.
Hast Du ncoh eine Idee, was da schief läuft?

Gruß

Rupp
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von turtle47 »

Hi Rupp,
Rupp hat geschrieben:Bei dieser Zeile bleibt das Makro stehen:
sField = ofeld.getTextFieldMaster.DataColumnName
Es gibt jetzt zwei Möglichkeiten. Entweder Du untersuchst die Objekte selber mit den Tools "MRI" oder "xray" (einfach mal nach den Begriffen hier im Forum suchen), oder Du ladest hier ein Beispieldokument mit den beiden Feldbefehlen hoch.

Alles Andere ist raterei, weil die Feldbefehle zu vielfältig sind.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von Rupp »

Guten Morgen Jürgen,

dann lade ich mal meine Datei hoch. Ich habe sie auf das wesentliche reduziert.
Herzlichen Dank für Dein Angebot :-)

Binn gespannt, ob Du eine Möglichkeit findest.

Schöne Grüße

Rupp
Dateianhänge
rupp.odt
Beispieldatei mit den Seriendruckfeldern
(18.62 KiB) 134-mal heruntergeladen
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von Rupp »

Hallo Jürgen,

hier noch als Nachtrag die dazugehörige Datenbankdatei. Vielleicht geht so ja das Austesten leichter.

Danke :-)

Rupp
Dateianhänge
Adressen.odb
Hier noch die dazugehörige Datenbank
(6.49 KiB) 127-mal heruntergeladen
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von turtle47 »

Hallo Rupp,

neuer Versuch:

Code: Alles auswählen

sub Textfeldbearbeiten_V2
Dim sEingabe, sNachname, sURL as String
Dim oFeld, oDoc, oTxtFelder as Object
	oDoc = thiscomponent
	oTxtFelder = oDoc.getTextFields().createEnumeration()
	do while oTxtFelder.hasmoreElements()
	oFeld = oTxtFelder.nextElement
	if ofeld.supportsService("com.sun.star.text.textfield.Input")then
	if ofeld.Hint = ("Rechnungs-Nummer") then
	sEingabe = oFeld.Content
	end if
	end if
	if ofeld.supportsService("com.sun.star.text.TextField.Database")then
	if ofeld.Textfieldmaster.DataColumnName = "Nachname" then
	sNachname = oFeld.Content
	end if
	end if	
	loop
	weiter:
   '################    Jetzt den String für das Speichern generieren #############
	sURL = "file:///C:/Dein Pfad/" & sEingabe & "_" & sNachname & ".odt"
	msgbox    sURL
End Sub
Erneuten Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern

Beitrag von Rupp »

Hallo Jürgen,

so - jetzt hat es wunderbar geklappt. Ich habe für den Dateinamen noch 2 weitere Felder hinzugefügt und gleichzeitiges Speichern unter dem aus den Feldern generierten Namen sowohl als Writer- als auch als PDF-Datei. Hier ist nun der komplette Code. Vielleicht nützt er so ja auch noch jemand anderem:

Code: Alles auswählen

sub Speichern_odt_und_pdf

Dim sEingabe, sNachname, sURL as String
Dim oFeld, oDoc, oTxtFelder as Object

   oDoc = thiscomponent

   'Felder auslesen      
   oTxtFelder = oDoc.getTextFields().createEnumeration()
   do while oTxtFelder.hasmoreElements()
   oFeld = oTxtFelder.nextElement
   if ofeld.supportsService("com.sun.star.text.textfield.Input")then
   if ofeld.Hint = ("Rechnungs-Nummer") then
   sEingabe = oFeld.Content
   end if
   end if
   if ofeld.supportsService("com.sun.star.text.TextField.Database")then
   if ofeld.Textfieldmaster.DataColumnName = "Firma" then
   sFirma = oFeld.Content
   end if
   end if
   if ofeld.supportsService("com.sun.star.text.TextField.Database")then
   if ofeld.Textfieldmaster.DataColumnName = "Nachname" then
   sNachname = oFeld.Content
   end if
   end if 
   if ofeld.supportsService("com.sun.star.text.TextField.Database")then
   if ofeld.Textfieldmaster.DataColumnName = "Vorname" then
   sVorname = oFeld.Content
   end if
   end if  
   loop
   weiter:
   
   'URL-String für das Speichern der Writer-Datei generieren
   sURL = "file:///c:/temp/" & sEingabe & "_" & sFirma & "_" & sNachname & "_" & sVorname & ".odt"
       
   'Speicherbefehl Writer-Datei
   ThisComponent.storeAsURL( sURL, Array() )

   'Messagebox aufrufen
   msgbox    sURL
   
   'URL-String für das Speichern der PDF-Datei generieren
   sPDF = "file:///c:/temp/" & sEingabe & "_" & sFirma & "_" & sNachname & "_" & sVorname & ".pdf"

   'Speicherbefehl PDF-Datei
   Dim pdfProperties(1) as new com.sun.star.beans.PropertyValue 
   pdfProperties(0).Name = "FilterName" 
   pdfProperties(0).Value = "writer_pdf_Export" 
   ThisComponent.storeToURL( sPDF, pdfProperties() )

   'Messagebox aufrufen	
   msgbox    sPDF
	
End Sub
Auch füge ich die Datei mit dem Code als Beispiel an. Der Code funktioniert perfekt unter der Voraussetzung, dass in den Serien-Feldern auch eingefügter Inhalt aus einer Datenbank existiert.

Noch einem ganz herzlichem Dank und noch einen schönen weiteren Ostemontag

Rupp
Dateianhänge
rupp_mit_code.odt
Datei mit Code
(19.19 KiB) 246-mal heruntergeladen
Antworten