Werte aus Abfrage in Writer übergeben

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

masl
Beiträge: 3
Registriert: Do, 06.01.2011 14:05

Werte aus Abfrage in Writer übergeben

Beitrag 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
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
masl
Beiträge: 3
Registriert: Do, 06.01.2011 14:05

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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.
masl
Beiträge: 3
Registriert: Do, 06.01.2011 14:05

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Werte aus Abfrage in Writer übergeben

Beitrag von gogo »

Wohin sollen denn welche Art von Daten aus Base=>Writer?
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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).
Dateianhänge
VorlagePlaceholderDatenbank.odb
(13.52 KiB) 961-mal heruntergeladen
Vorlage123.ott
(8.38 KiB) 386-mal heruntergeladen
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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?
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
Dateianhänge
BriefAnDatensatz.odt
Seriendokument
(8.65 KiB) 505-mal heruntergeladen
BriefAnDatensatz.odb
Datenbank
(13.43 KiB) 471-mal heruntergeladen
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
Dateianhänge
BriefAnDatensatz.odb
(13.27 KiB) 291-mal heruntergeladen
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag 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
Gesperrt