Base Macro - Übergabe an OO Writer über Abfrage

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

FingMark
*
Beiträge: 11
Registriert: Di, 11.02.2014 22:50

Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von FingMark »

Hallo OO-Base Fans,

nun arbeite ich seit einigen Tagen mit Base und komme leider auch nach einigen Recherchen nicht weiter mit meinen Bemühungen.
Deswegen möchte ich hier um Hilfe bitten, damit ich wieder ruhig schlafen kann. ;-)

Sollte es notwendig sein, baue ich gerne auch eine Beispieldatei und hänge sie an, ansonsten versuche ich erstmal so zu erklären, was ich möchte...

Ich habe eine Mastertabelle, in der hauptsächlich nur IDs stehen, die zu anderen Tabellen führen und dementsprechend Daten in einem Formular (Listenfeld) anzeigen.

Nun möchte ich auf Knopfdruck einer Schaltfläche ein Makro hinterlegen, das mir ermöglicht, die Daten zu Writer zu übergeben.
Mit dem folgenden Makro (hier im Forum gefunden) kann ich die Werte (IDs) der Mastertabelle an Writer übergeben, bekomme dann aber natürlich nur die ID und nicht den dazugehörigen Wert des Listenfeldes, der ja eigentlich angezeigt wird.

Code: Alles auswählen

Sub Main
	oDoc = thisComponent
	oForm = oDoc.Drawpage.Forms(0)
	oColumns = oForm.Columns
	REM Pfad zur Vorlage zusammensetzen
	Globalscope.BasicLibraries.loadLibrary("Tools")
	sURL = oDoc.Parent.URL
	sURL = DirectoryNameoutofPath(sURL,"/") & "/"
	sURL = sURL & "Text.odt"
	REM Vorlage öffnen
	Dim args(0) as new com.sun.star.beans.PropertyValue
	args(0).Name = "AsTemplate"
	args(0).Value = True
	newDoc = StarDesktop.loadComponentFromURL(sURL,"_blank",0,args)
	REM Textfelder holen
	enumTextfields = newDoc.Textfields.createEnumeration	
	Do While enumTextfields.hasMoreElements
		thisTextfield = enumTextfields.nextElement		
		If thisTextfield.supportsService("com.sun.star.text.TextField.JumpEdit") Then
			sColumnname = thisTextfield.PlaceHolder
			If oColumns.hasByName(sColumnname) Then
				nIndex = oForm.findColumn(sColumnname)
				thisTextfield.Anchor.String = oForm.getString(nIndex)
			End If
		End If
	Loop
End Sub
Nun habe ich eine zusätzliche Abfrage erstellt, in der, passend zur ID der Mastertabelle alle zugehörigen Informationen angezeigt werden, also auch der richtige entsprechende Eintrag des Listenfeldes.

Nun benötige ich aber ein Makro, das so in etwas folgendes macht:

-Schau welcher Mastertabellen-ID Datensatz gerade auf ist
-Gehe in die Abfrage (Abfrage_AlleDaten)
-Gehe zu dem Datensatz, der der Mastertabellen-ID entspricht
-Speichere alle Spaltennamen und zugehörigen Wert des Feldes
-Übergebe diese an Writer und ersetze die dort gesetzten Platzhalter, insofern ein Wert vorhanden ist.


Ich hoffe das ist so verständlich...
Klingt ja meist immer sehr abstrakt, wenn man es ließt.

Vielen Dank schonmal im voraus für die Unterstützung.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von F3K Total »

Schau mal hier
Gruß R
FingMark
*
Beiträge: 11
Registriert: Di, 11.02.2014 22:50

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von FingMark »

Ich habe mir das angeschaut und glaube das könnte gut passen, danke!

Nun weiß ich leider nicht, warum ich immer eine Fehlermeldung bekomme, wenn ich
die Abfrage "Abf_1" anlege und wie folgt entsprechend darauf zugreifen möchte.

Code: Alles auswählen

MailMerge.CommandType = 1
MailMerge.Command = "Abf_1"
Er sagt immer, es existiert keine Abfrage mit Namen "Abf_1".
(com.sun.star.sdbc.SQLException)

Gibt es da einen Tipp?

PS: In der odt habe ich die Felder bereits angelegt.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von F3K Total »

Ich habe dir nicht ohne Grund den Beitrag von DPunch verlinkt. Die Variante ist besser.
Gruß R
FingMark
*
Beiträge: 11
Registriert: Di, 11.02.2014 22:50

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von FingMark »

Hallo nochmals und danke für die Antwort.

Ich habe ja, wie im ersten Beitrag beschrieben, vorher die Variante von DPunch genutzt, konnte dort aber nur die Inhalte der Mastertabelle auslesen, weil es nur auf das Hauptformular zugreift.

Ich hatte es so verstanden, dass ich deswegen die andere Variante nutzen sollte, weil die mit dem Abgleich der ID des aktuellen Datensatzes in einer Tabelle/Abfrage dann den entsprechenden Datensatz weitergibt.

Soweit klappt das ja auch mit MailMerge, nur findet er die Abfrage nicht.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von F3K Total »

Ups,
FingMark hat geschrieben:Ich habe ja, wie im ersten Beitrag beschrieben, vorher die Variante von DPunch genutzt,
das hatte ich gar nicht mitbekommen, ja, die Variante greift "nur" auf die Spalten des Hauptformulares zu.
Es gibt nun -zig Möglichkeiten die "Platzhalter-Variante" mit Abfragedaten zu füllen.
Die einfachste wäre aus meiner Sicht, wenn Du ein zusätzliches Unterformular anlegst, dessen Datengrundlage die Abfrage ist, über die ID mit dem Haupformular verknüpftst, es "Subform" nennst (Formularnavigator), und die Spalten des Unterformulares übergibst, also etwa so:

Code: Alles auswählen

Sub Main
   oDoc = thisComponent
   oForm = oDoc.Drawpage.Forms(0)->Hauptformular
   oFormSub = oForm.Subform->Unterformular (verknüpft)
   oColumns = oFormSub.Columns
Besser helfen könnten wir, wenn du zwei Beispieldateien hochladen würdest (Quelle und Ziel)
Gruß R
FingMark
*
Beiträge: 11
Registriert: Di, 11.02.2014 22:50

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von FingMark »

Prima und danke für die Unterstützung.

Werde jetzt alles mal zusammenbauen. Freut mich, hier so ein kompetentes Anlaufziel gefunden zu haben.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base Macro - Übergabe an OO Writer über Abfrage

Beitrag von DPunch »

Servus

Sorry, Deine Nachricht kam aus irgendeinem Grund nur als EMail, nicht als PM hier.
Jedenfalls als Anhang ein rudimentäres Beispiel inklusive Subformularen und mit der Verwendung von (Bild-)Platzhaltern für Bilder
Für das Beispiel sucht das Makro im Ordner der odb-Datei nach der Bilddatei im Anhang - für eigene Bilder einfach die Zeilen

Code: Alles auswählen

Private sDbUrl as String

Code: Alles auswählen

sDbUrl = sURL

Code: Alles auswählen

sImgPath = ConvertToUrl(sDbUrl & "openoffice-logo.png")
löschen und im entsprechenden Datenbankfeld eine qualifizierte URL angeben.

Bei Bildern in Rahmen richtet sich das Bild nach dem Rahmen, ansonsten sind die Layout-Einstellungen in Zeile 122-132 für das Beispiel hardcoded, das kannst Du Dir aber bei Bedarf ja entsprechend anpassen / variablen machen.
Dateianhänge
openoffice-logo.png
openoffice-logo.png (7.23 KiB) 2898 mal betrachtet
VorlagePlaceholderDatenbank.odb
(15.52 KiB) 155-mal heruntergeladen
Vorlage123.ott
(9.23 KiB) 63-mal heruntergeladen
Antworten