Seite 1 von 2

Werte aus Abfrage in Writer übergeben

Verfasst: Do, 06.01.2011 14:16
von masl
Hallo,

ich bin neu hier, habe bis vor ein paar Tagen so gut wie nie mit Base gearbeitet, aber bisher gut mit Learning by Doing und google vorran gekommen.
Nun stehe ich aber vor einem größeren Problem das ich bisher nicht lösen konnte oder bei google nicht so richtig wusste nach was ich suchen soll.

Mein Problem:

Ich habe 2 Tabellen aus einem mysql Server auf die Base zugreift:

kunden
transporte

Die ich in einer Abfrage zusammenführe um daraus im Writer mit der Seriendruckfunktion eine Rechnug erzeuge.
Daten werden über ein Formular erfasst/bearbeitet.
Soweit klappt das auch alles super und ohne probleme.

Was ich nun machen möchte und daran scheitere:

In meinem Formular möchte ich eine Schaltfläche die ein Script ausführt dass dem Writer sagt, er soll die Daten aus der Abfrage mit der entsprechenden ID in die im Writer-Dokument vorhandenen Felder schreiben.

Gibts hier schon eine Lösung, ein Workaround oder kann mir jemand sagen wie ich es am gescheitesten anstelle?

Liebe Grüße

Marcel

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Do, 06.01.2011 16:15
von gogo
Falsche Richtung ;)

in Base: Abfrage erstellen in der der/die für den Ausdruck gewünschten Datensätze drin sind

Dann: Writer Dokument öffnen, [F4] drücken und aus den angezeigten Datenquellen die gewünschten Daten als Feld in das Writerdokument einfügen (Drag&Drop der Zeilenüberschrift)

...

g

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Fr, 07.01.2011 11:00
von masl
ja soweit bin ich auch schon :P

ich wollts nur etwas komfortabler dass ich mit einem script mir das F4 drücken und datensätze auswählen sparen kann.
Also dass vom Formular über eine Schaltfläche die Variable "ID" an den Writer übergeben wird und dieser den Datensatz aus der Abfrage auswählt und in die Textfelder einsetzt.

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Fr, 07.01.2011 11:05
von masl
Sorry dein "Falsche Richtung" zu spät gelesen :shock:

hm... also ist es nicht möglich? doof. okay muss ich mich wohl mit abfinden.

Mit dem Report Builder kann man ja leider nicht so schön am Layout basteln wie im Writer

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Fr, 07.01.2011 14:29
von gogo
"falsche Richtung" heisst nicht, dass es nicht geht, sondern, dass nicht Base dem Writer sagt wo die Daten sind, sondern dass der Writer die Daten selbst holen kann, und zwar aus jeder im System registrierten Datenbank!

Damit nicht die ganze Abfrage in Deinem Serienbrief landet musst Du in der Abfrage die Daten weiter einschränken ... z.B. ein Ja/Nein Feld das für die zu druckenden Daten auf "true" steht, oder Du generierst immer nur für den Ausdruck eine temporäre Tabelle mit den entsprechenden Daten. Auf diese Tabelle/Abfrage/View... beziehen sich dann die Felder im Writerdokument, das Du dann mit

Code: Alles auswählen

sURL = convertToUrl("Pfad zum Writerdokument das Du öffnen willst")
Doc = starDeskTop.loadComponentFromUrl (sURL, "_blank", 0, Array())
aus Base heraus öffnen kannst...

g

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Di, 07.02.2012 07:42
von gogo
Wohin sollen denn welche Art von Daten aus Base=>Writer?

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Mi, 08.02.2012 22:05
von F3K Total
Hallo,
per Makro geht es, habe ich schon gemacht.
1.) aktuelles Formular ansprechen, z.B.

Code: Alles auswählen

oform=thiscomponent.drawpage.forms.MainForm
2.) Primarykey (ID) des aktuell selektierten Datensatzes auslesen, z.B mit

Code: Alles auswählen

nColumnID = oform.findcolumn("ID")
nid = oform.getint(nColumnID)'nid enthält jetzt die aktuelle ID 
3.) Mailemerge auf Sereinbrief durchführen, mit nur einem Datensatz:

Code: Alles auswählen

MailMerge = createunoservice("com.sun.star.text.MailMerge")
MailMerge.DataSourceName = "meineDatenbank"
MailMerge.DocumentURL = "URL zum Serienbriefdokument"
Mailmerge.SaveAsSingleFile = 0
MailMerge.CommandType = 0
MailMerge.Command = "meine Tabelle"
MailMerge.Filter = "ID ="+nid'Dies ist die wichtige Zeile, hier wird die ID aus dem Formular an Mailmerge übergeben!!!
MailMerge.SaveAsSingleFile = true
MailMerge.FileNameFromColumn = true
MailMerge.Filenameprefix = "Tabellenspalte"
MailMerge.OutputType = 2
MailMerge.OutputUrl = "URL zum Ausgabeordner"
Dim MyProps()
MailMerge.execute(MyProps())
Viel Erfolg
Gruß R

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Mi, 08.02.2012 23:00
von DPunch
Servus

Um mal eine Alternative aufzuzeigen, die sich bei meiner Arbeit absolut bewährt hat:

a) Writer-Vorlage erstellen
b) Einfügen -> Feldbefehl -> Andere -> Platzhalter
c) Den Platzhalter so nennen, wie die entsprechende Spalte in der Tabelle / in der Abfrage heisst, deren Inhalt der Platzhalter annehmen soll (für einfache Zwecke einfach nur "Text" als Typ wählen, mit den anderen Varianten, z.B. "Grafik" kann man dann fortgeschrittenere Sachen umsetzen)
d) In einem Makro Pfad zur Vorlage hinterlegen und vom Makro die Platzhalter befüllen lassen

Einfaches Beispiel ist angehängt (beide im gleichen Ordner speichern, über die Schaltfläche in Formular1 die Daten des aktuellen Datensatzes in die erstellte Vorlage schreiben).

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Mi, 16.05.2012 22:13
von MEcki
Hallo F3K Total,

ich habe das ganze an meiner Datenbank mal nach Deinem Code ausgetestet.
Wenn ich

Code: Alles auswählen

MailMerge.OutputType = 1
setze, gibt er mir alle im Seriendokument angesprochenen Datenbankfelder aus.

Bei

Code: Alles auswählen

MailMerge.OutputType = 2
kommt in der Zeile

Code: Alles auswählen

MailMerge.execute(MyProps())
Basic-Laufzeitfehler
Es ist eine Exception aufgetreten
Type com.sun.star.uno.exception
Message: Mail merge failed. Sorry, no further information available.


Insgesamt sieht das Modul bei mir also so aus:

Code: Alles auswählen

oform=thiscomponent.drawpage.forms.MainForm
    
    nColumnID = oform.findcolumn("ID_Mitglied")
    nid = oform.getint(nColumnID)'nid enthält jetzt die aktuelle ID 
    
    MailMerge = createunoservice("com.sun.star.text.MailMerge")
    MailMerge.DataSourceName = "FGGM_DB"
    MailMerge.DocumentURL = "file:///C:/Daten/FGGM/Förderverein/testbrief.odt"
    Mailmerge.SaveAsSingleFile = 0
    MailMerge.CommandType = 0
    MailMerge.Command = "Mitglieder"
    MailMerge.Filter = "ID_Mitglied ="+nid'Dies ist die wichtige Zeile, hier wird die ID aus dem Formular an Mailmerge übergeben!!!
    MailMerge.SaveAsSingleFile = true
    MailMerge.FileNameFromColumn = true
    MailMerge.Filenameprefix = "Tabellenspalte"
    MailMerge.OutputType = 2
    MailMerge.OutputUrl = "file:///C:/Temp/"
    Dim MyProps()
Hast Du (oder sonst jemand) eine Ahnung, woran's liegen könnte?


Danke

MEcki

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Mi, 16.05.2012 22:32
von F3K Total
Hallo Mecki,
so auf den ersten Blick kann ich keinen Fehler erkennen, kannst Du Beispieldokumente hochladen (verfremdet)
Gruß R

Edit: Welcher Version OOo hast Du?

Re: Werte aus Abfrage in Writer übergeben

Verfasst: So, 20.05.2012 17:31
von MEcki
Hallo FK3 Total,

OOO Version war 3.0.0. habe dann versucht auf ApacheOffice 3.4 zu aktualisieren, was mir aber mein Formular total zerschossen hat.
Daher habe ich jetzt (nur)auf OOO 3.3.0 aktualisiert (Hilfe > über ... ) zeigt 3.0.0 an, aber OOO330m20 (Build 9567).

Beispieldateien habe ich zusammengebaut (Nur eine einfache Mitgliedertabelle und ein Formular mit einer Schaltfläche, hinter der Dein Macro steckt.

Der Einfachheit halber beides in C:\Temp gespeichert.

MailMerge.OutputType = 1 -> Auf Drucker -> funktioniert.

MailMerge.OutputType = 2 -> Dokument -> Fehlermeldung


Danke
MEcki

Re: Werte aus Abfrage in Writer übergeben

Verfasst: So, 20.05.2012 21:18
von F3K Total
Hi,
ich habs gefunden, die Zeilen:

Code: Alles auswählen

    MailMerge.FileNameFromColumn = true
    MailMerge.Filenameprefix = "Tabellenspalte"
müssen zueinander passen, wenn Du einen Prefix im Dateinamen willst, dann brauchst du auch eine Tabellenspalte, die diesen definiert. In deinem Fall müsste es also, wenn du den Nachnamen als Prefix verwenden möchtest, so lauten:

Code: Alles auswählen

    MailMerge.FileNameFromColumn = true
    MailMerge.Filenameprefix = "Name"
Gruß und viel Erfolg,
R
Edit:
MEcki hat geschrieben:OOO Version war 3.0.0. habe dann versucht auf ApacheOffice 3.4 zu aktualisieren, was mir aber mein Formular total zerschossen hat.
Das ist darauf zurückzuführen, dass 3.4 Formulare im Print-Layout und nicht wie vorher im Web-Layout, öffnet, ein Bug. LO hat den BUG in Version 4.6 bereits wieder eleminiert, das er bei OOo jetzt auftritt ist echt Mist. Mit diesem Makro, eingebaut im Formularentwurfsmodus unter Extras/Anpassen/ "Ansicht wurde erzeugt" bekommst du deine gewohnte Ansicht zurück. Speichern (Formular und DB-Dokument) nicht vergessen!

Code: Alles auswählen

sub swap_to_Weblayout
 odoc = ThisComponent
 oCurrentController = odoc.CurrentController
 oViewSettings = oCurrentController.ViewSettings
 oViewSettings.ShowOnlineLayout = true
end sub

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Mo, 21.05.2012 09:39
von MEcki
Hallo F3K Total,

besten Dank für Deine Hilfe. Funktioniert bestens. Nachdem ich mit der Funktion etwas für unsere Schriftführerin einbauen wollte, kommen mir da völlig neue Ideen, um auch mir das Leben mal wieder etwas zu erleichtern. (Versendung von Rechnungen (PDF-Anhang) per email über ein Makro). Die wären dann aber wahrscheinlich einen eigenen Beitrag wert.
Die Fragestellung, ob ApacheOffice oder LibreOffice ist sicherlich auch eher woanders zu klären. Deinen Codepart zur Formularanzeige versuche ich dann bei Gelegenheit.

Was meinen Teil angeht, wäre somit die eigentliche Frage von masl umfassend beantwortet :-)

MEcki

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Fr, 04.04.2014 17:59
von F3K Total
Hi,
versuche mal diese .odb mit der obigen .odt z.B. vom Desktop aus
Die Datenbank muss unter Extras/Optionen/LibreOffice Base/Datenbanken angemeldet werden.
Die Pfade im Makro müssen angepasst werden
  • Code: Alles auswählen

    oMailMerge.DocumentURL = "file:///C:/Users/<USER>/Desktop/BriefAnDatensatz.odt"
  • Code: Alles auswählen

    oMailMerge.OutputUrl = "file:///C:/tmp/"
HTH R

Re: Werte aus Abfrage in Writer übergeben

Verfasst: Fr, 04.04.2014 18:48
von F3K Total
Der obere Pfad zeigt auf die .odt, der untere auf das Verzeichnis, wohin das Ergebnis geschrieben werden soll.
Desktop hatte ich nur als Beispiel genannt.
Gruß R