Gelöst:Writer-Datei mit Namen aus Seriendruck-Feld speichern
Moderator: Moderatoren
Gelöst:Writer-Datei mit Namen aus Seriendruck-Feld speichern
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
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.
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
Hallo Rupp,
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:
Auf die Schnelle ist mir nichts anderes eingefallen.
Viel Erfolg.
Jürgen
Du hast dem Eingabefeld beim Erstellen doch bestimmt einen Hinweis mitgegeben. Oder?Rupp hat geschrieben:Welchen Namen das Eingabefeld hat, kann ich nicht sagen (wenn ich die Feldnamen einblende, erscheint nur Eingabe-Feld).
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
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
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
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
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
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
Hi Rupp,
Alles Andere ist raterei, weil die Feldbefehle zu vielfältig sind.
Jürgen
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.Rupp hat geschrieben:Bei dieser Zeile bleibt das Makro stehen:
sField = ofeld.getTextFieldMaster.DataColumnName
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
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
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
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
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
Hallo Jürgen,
hier noch als Nachtrag die dazugehörige Datenbankdatei. Vielleicht geht so ja das Austesten leichter.
Danke
Rupp
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
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
Hallo Rupp,
neuer Versuch:
Erneuten Erfolg.
Jürgen
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
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
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Writer-Datei mit Namen aus Seriendruck-Feld speichern
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:
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
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
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