[Gelöst] Writer: Formularfelder per Makro füllen

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

Moderator: Moderatoren

HenningS
Beiträge: 2
Registriert: Di, 05.09.2017 16:57

[Gelöst] Writer: Formularfelder per Makro füllen

Beitrag von HenningS »

Hallo,

ich habe ein Formular ("Einsatzbericht") im Writer erstellt, dass einige Daten aus einer BASE-Datenbank bekommt. Die BASE-Datenbank wiederum greift auf eine CSV-Datei zu, die aus SAP ausgegeben wird. Beim Öffnen des Dokuments wird es als PDF exportiert und schließt sich wieder. Das Makro, das dahinterliegt, habe ich mir aus verschiedenen Foren zusammengeschustert, da ich selbst vorher nie mit Makros zu tun hatte. (Steht auch unten)

Nun zu meinem Problem:
In diesem Formular gibt es mehrere Datumsfelder ("Datum_Einsatz", Datum_Unterschrift1", "Datum_Unterschrift2"). In diesen Datumsfeldern soll das aktuelle Datum zur Zeit des Exports (per Makro) eingefügt werden. Ein Feldbefehl anstelle eines Datumsfeldes ist nicht sinnvoll, da das Dokument i.d.R. nicht an einem Tag ausgefüllt wird und das Datum daher noch zu ändern sein muss.

Daher meine Frage: Wie befülle ich ein Formularfeld durch ein Makro?
Ob es sich um ein Datumsfeld oder Textfeld handelt ist in dem Fall egal, da aus einem Datumsfeld beim Export scheinbar ein normales Textfeld gemacht wird.

Eine mögliche Alternative wäre, das Datum in der CSV-Datei mitzugeben, allerdings könnte ich das Befüllen per Makro auch an anderer Stelle gebrauchen.

Grüße
Henning

Falls es hilft:
Betriebssystem: Windows 10
Libre Office Version: 5.3.1.2
Makro:

Code: Alles auswählen

Sub PDF_Export_Close_Document
rem ----------------------------------------------------------------------
rem Variablen definieren
dim document as object
dim dispatcher as object
dim number as string
dim datum as string
dim args1(1) as new com.sun.star.beans.PropertyValue

rem ----------------------------------------------------------------------
rem Zugriff auf das Dokument
rem Daten setzen
datum = date
	--- hier sollen die Felder gefüllt werden ---
rem Einsatznummer auslesen
number = ThisComponent.drawpage.forms.getByName("Einsatzbericht").getByName("Einsatznummer").text
number = Trim(number)

rem PDF-Export
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args1(0).Name = "URL"
args1(0).Value = "file:///H:/SAP_Service/ERE/Dokumente/" & number & "/" & number &"_Einsatzbericht.pdf"
args1(1).Name = "FilterName"
args1(1).Value = "writer_pdf_Export"
dispatcher.executeDispatch(document, ".uno:ExportDirectToPDF", "", 0, args1())

rem ----------------------------------------------------------------------
rem Dokument schließen
ThisComponent.close(true)
End sub
Zuletzt geändert von HenningS am Do, 07.09.2017 12:03, insgesamt 1-mal geändert.
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Writer: Formularfelder per Makro füllen

Beitrag von Toxitom »

Hey Henning,

hmm, ein paar zu wenig Daten;)

Also: Ein Formular ist verbunden mit einer Datenbank (bei Dir CSV-Datei). Die Felder werden also automatisch mit den Daten gefüllt. So, wie Du die Felder ausliest, kannst Du sie auch theoretisch beschreiben - also (Zitat aus Deinem Code):

Code: Alles auswählen

number = ThisComponent.drawpage.forms.getByName("Einsatzbericht").getByName("Einsatznummer").text
Das war das Auslesen - das Schreiben ginge eben anders herum:

Code: Alles auswählen

ThisComponent.drawpage.forms.getByName("Einsatzbericht").getByName("Einsatznummer").text = "mein neuer Text"
Aber:
1. wird dadurch lediglich die aktuelle Darstellung des Feldes geändert - nicht aber irgendwelche Daten darunter.
2. werden diese Daten gnadenlos überschrieben, wenn ein neuer Datensatz geladen wird - also auch beim scrollen oder so.

Da Du das Ding aber eh als PDF-Dokument "druckst" reicht Dir das vielleicht.

Und da Du von einem Datumsfeld geschrieben hast ... da haben wir dann zusätzlich noch die Schwierigkeit, dass intern Datumsfelder völlig andere Daten benötigen als die auf dem Bildschirm angezeigten. Also noch eine Herausforderung.

Willst Du lediglich das aktuelle Datum in ein Formularfeld reinschreiben (dann am besten ein noch nicht mit der Datenbank verbundenes Textfeld) so reicht z.B. die Zeile:

Code: Alles auswählen

ThisComponent.drawpage.forms.getByName("Einsatzbericht").getByName("NameDesTextfeldes").text = format(now(), "dd.mm.yyyy") 
now() liefert das aktuelle System-Datum inkl. der Zeit, in der internen Zahlenschreibweise, die kannst Du formatiert als Text ausgeben.

Aber das kennst Du sicher;)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
HenningS
Beiträge: 2
Registriert: Di, 05.09.2017 16:57

Re: Writer: Formularfelder per Makro füllen

Beitrag von HenningS »

Hallo Tom,

das ist genau das, was ich gesucht habe.
Aber:
1. wird dadurch lediglich die aktuelle Darstellung des Feldes geändert - nicht aber irgendwelche Daten darunter.
2. werden diese Daten gnadenlos überschrieben, wenn ein neuer Datensatz geladen wird - also auch beim scrollen oder so.
Das spielt keine Rolle. Die CSV-Datei enthält nur diesen einen Datensatz, der das Formular mit Auftragsdaten füllt. Sie wird aus SAP ausgegeben und wird nach dem PDF-Export nicht mehr gebraucht.

Vielen Dank und Grüße
Henning
Antworten