Werte aus Abfrage in Writer übergeben

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Freischreiber

Re: Werte aus Abfrage in Writer übergeben

Beitrag von Freischreiber » Fr, 04.04.2014 09:50

Sorry, ich hatte die Datenbank nicht angemeldet in LO.

Nach Anmeldung kommt kein Fehler mehr, aber es öffnet sich auch kein Brief. Nach Drücken des Buttons kommt "id_Mitglied =0" für den ausgewählten Datensatz, und wenn ich das mit OK bestätige, kommt nichts mehr.

Das Makro sieht nach Korrektur bei mir so aus (bei Dateien in C:\Temp):

Code: Alles auswählen

Sub Main

    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 = "BriefAnDatensatz"
   		MailMerge.DocumentURL = "file:///C:/Temp/BriefAnDatensatz.odt"
    	Mailmerge.SaveAsSingleFile = 0
    	MailMerge.CommandType = 0
    	MailMerge.Command = "Mitglied"
    	MailMerge.Filter = "id_Mitglied ="+nid'Dies ist die wichtige Zeile, hier wird die ID aus dem Formular an Mailmerge übergeben!!!
    	msgbox mailmerge.filter
    	MailMerge.SaveAsSingleFile = true
    	MailMerge.FileNameFromColumn = true
    	MailMerge.Filenameprefix = "Name"
    	'MailMerge.OutputType = 1         Ausgabe auf den Standarddrucker erfolgreich!!!
    	MailMerge.OutputType = 2	'Fehlermeldung
    	MailMerge.OutputUrl = "file:///C:/Temp/"
    	Dim MyProps()
    	MailMerge.execute(MyProps())
End Sub

F3K Total
********
Beiträge: 3170
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag von F3K Total » Fr, 04.04.2014 17:59

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) 113-mal heruntergeladen

Freischreiber

Re: Werte aus Abfrage in Writer übergeben

Beitrag von Freischreiber » Fr, 04.04.2014 18:28

Hallo F3K Total,

ich versteh es jetzt nicht: vom Desktop aus heißt: beide Dateien auf den Desktop?

Die Verzeichnisse C/tmp und C/Users.. gibt es hier gar nicht, das ist ein ganz normales Windows XP.

F3K Total
********
Beiträge: 3170
Registriert: Mo, 28.02.2011 17:49

Re: Werte aus Abfrage in Writer übergeben

Beitrag von F3K Total » Fr, 04.04.2014 18:48

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

MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Werte aus Abfrage in Writer übergeben

Beitrag von MEcki » Sa, 05.04.2014 14:07

Hallo Freischreiber,
tut mir Leid, aber letztendlich habe ich das Thema nicht weiterverfolgt, weil der neue Vereinsvorstand sich entschlossen hat, eine fertige Software zu kaufen.

Gruß
MEcki

RobertG
*******
Beiträge: 1656
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Werte aus Abfrage in Writer übergeben

Beitrag von RobertG » Sa, 05.04.2014 16:49

Hallo Freischreiber,
Freischreiber hat geschrieben: Nach Anmeldung kommt kein Fehler mehr, aber es öffnet sich auch kein Brief. Nach Drücken des Buttons kommt "id_Mitglied =0" für den ausgewählten Datensatz, und wenn ich das mit OK bestätige, kommt nichts mehr.

Code: Alles auswählen

MailMerge.OutputUrl = "file:///C:/Temp/"
Der Inhalt des Serienbriefs liegt unter Windows in C:\Temp\ . Der Serienbrief wird nicht angezeigt. Schau dort einmal nach. Das Makro öffnet nicht ein Dokument. Wenn Du ein Dokument öffnen willst musst Du die Datei an dieser Stelle öffnen. Das ist leider nicht ganz so einfach per Makro zu lösen, da der Dateiname erst durch Mailmerge aufgrund eines Feldinhaltes zusammengesetzt wird.

Gruß

Robert

cbardak

Re: Werte aus Abfrage in Writer übergeben

Beitrag von cbardak » Mi, 01.04.2015 17:31

Hallo!

Ich habe das Script in meine Datenbank eingebaut und im Prinzip funktioniert es auch.

Jedoch habe ich folgendes Problem:

Das Formular besteht aus Hauptformular und Unterformnular. Im Hauptformular werden Vermietungen eingetragen, im Unterformular die zugehörigen Adressdaten, verknüpft über eine ID.
Bei der Übergabe an das Writer-Dokument werden nur die Daten aus dem Hauptformular übergeben, nicht die des Unterformulars. Wie kann ich das ändern?

Grüße

derdentrollhast

Re: Werte aus Abfrage in Writer übergeben

Beitrag von derdentrollhast » Mi, 01.04.2015 19:27

Hallo cbardak,
na da hast du dich ja richtig intensiv mit der Materie auseinandergesetzt.
Ich denke es, ist besonders wichtig einen gemeinsamen Primärschlüssel zu finden und an der richtigen Stelle ins Makro einzubauen. Wenn du dann noch die Beziehung zwischen Haupt- und Unterformular per Fremdschlüssel steuerst, kann eigentlich nichts mehr schiefgehen.
Wenn da nicht noch irgendwelche externen Variablen dazwischen funken. Aber das kommt eigentlich nie vor. Klar, mit Java gehts einfacher als mit Basic, Python wäre auch noch eine Möglichkeit, was kannst Du am Besten?
Nur zur Info: 14/10 :D
DDTH

RobertG
*******
Beiträge: 1656
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Werte aus Abfrage in Writer übergeben

Beitrag von RobertG » Mi, 01.04.2015 19:32

Hallo cbardak,

Du kannst nur die Daten einer Datenquelle (Tabelle, Abfrage) an den Writer für einen Serienbrief weiter geben. Wenn Du also Hauptformular und Unterformular hast, dann muss der Serienbrief auf einer Abfrage beruhen, die beide Daten zusammenfasst.

Schau Dir dazu auch die weiteren Erklärungen im Handbuch an, hier speziell im Kapitel "Makros" "Serienbriefdruck aus Base heraus".

Gruß

Robert

cbardak

Re: Werte aus Abfrage in Writer übergeben

Beitrag von cbardak » Do, 02.04.2015 12:01

Hallo derdentrollhasst, hallo Robert!

Vielen Dank erst mal für die Antworten.

Über einen Serienbrief funktioniert die Sache schon, allerdings ist der ein oder andere Mitarbeiter mit dem 'F4' und 'Daten in Felder' überfordert.
Daher kam mir die - per Zufall - gefundene Lösung mit der Übergabe der Daten über Platzhalter sehr gelegen. Dann kann ich im Formular einfach Schalter für die zu druckenden Dokumente anlegen.

Was meine Programmierkenntnisse angeht, so bin ich leider nicht so doll ausgestattet. Vor 25 Jahren konnte ich vielleicht noch mit Turbo Pascal und Basic punkten. Ergo, ich bin nicht ganz unbedarft was Programmierung angeht, aber von 'Können' kann keine Rede sein.

Ich versuche nun zwei verschiedenen Ansätzen nachzugehen:

1. Das Formular basiert auf einer Abfrage und kommt so ohne Unterformular aus.
Das funktioniert auch soweit mit der Übergabe an das Writer-Dokument, allerdings habe ich hier nochg so meine Probleme wie ich die Darstellung / Auswahl der Adresse im Formular vernünftig gestalten kann. Aber ich teste das erst mal weiter.

2. mit Formular (Vermietungen) und Unterformular (zugehörige Adresse).
Hier klappt die Übergabe nicht. Mein letzter Versuch war:

Code: Alles auswählen

Sub Vertrag_oeffnen
	oDoc = thisComponent
	oForm = oDoc.Drawpage.Forms.getByName("MainForm")
	oForm2 = oForm.getByName("SubForm")
	oColumns = oForm.Columns
	oColumns2 = oForm2.Columns

	REM Pfad zur Vorlage zusammensetzen
	Globalscope.BasicLibraries.loadLibrary("Tools")
	sURL = oDoc.Parent.URL
	sURL = DirectoryNameoutofPath(sURL,"/") & "/"
	sURL = sURL & "Mietvertrag.ott"

	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

	REM Form1	
	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

	REM Form2
	Do While enumTextfields.hasMoreElements
		thisTextfield = enumTextfields.nextElement		
		If thisTextfield.supportsService("com.sun.star.text.TextField.JumpEdit") Then
			sColumnname = thisTextfield.PlaceHolder
			If oColumns2.hasByName(sColumnname) Then
				nIndex = oForm2.findColumn(sColumnname)
				thisTextfield.Anchor.String = oForm2.getString(nIndex)
			End If
		End If
	Loop
End Sub
Der Code erzeugt zwar keinen Fehler, aber liefert auch nicht die Daten der Felder aus dem SbForm.

Am liebsten wäre mir im Ergebnis ein Formular, in dem ID und Name der Adresse angezeigt werden und die Auswahl der Adresse über ein zweites Formular erfolgt, das über einen Schalter aufgerufen wird und die Adress-ID zurückliefert. So könnte in diesem 2. Formular auch eine neue Adresse angelegt werden.

Über Vorschläge würde ich mich freuen.

Grüße Christian

RobertG
*******
Beiträge: 1656
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Werte aus Abfrage in Writer übergeben

Beitrag von RobertG » Do, 02.04.2015 12:19

Hallo Christian,

bei Makros muss ich zwischendurch auch immer wieder probieren, ob es denn nun klappt. Vielleicht liegt der Fehler darin, dass Du die gleiche Schleife doppelt hintereinander laufen lassen willst.
Do While enumTextfields.hasMoreElements
gehst Du bis zum Ende durch. Dann hat es keine Elemente mehr, die Du durchsuchen kannst. Trotdem startest Du wieder
Do While enumTextfields.hasMoreElements

Versuche einmal folgenden Code:

Code: Alles auswählen

...
REM Form1 
   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         
         If oColumns2.hasByName(sColumnname) Then
            nIndex = oForm2.findColumn(sColumnname)
            thisTextfield.Anchor.String = oForm2.getString(nIndex)
         End If
      End If
   Loop
... und lass den Schluss für Form2 weg.

Gruß

Robert

cbardak

Re: Werte aus Abfrage in Writer übergeben

Beitrag von cbardak » Do, 02.04.2015 15:42

Hallo Robert,

der Weg war der richtige, reichte aber noch nicht. Wurde eine Variable im ersten If-Teil gefüllt, gab es einen Fehler in der zweiten Abfrage.
Also daraus eins gemacht und die Zweite Abfrage in den Else-Teil der ersten gepackt:

Code: Alles auswählen

Sub Vertrag_oeffnen_SubForm
	oDoc = thisComponent
	oForm = oDoc.Drawpage.Forms.getByName("MainForm")
	oForm2 = oForm.getByName("SubForm")
	oColumns = oForm.Columns
	oColumns2 = oForm2.Columns

	REM Pfad zur Vorlage zusammensetzen
	Globalscope.BasicLibraries.loadLibrary("Tools")
	sURL = oDoc.Parent.URL
	sURL = DirectoryNameoutofPath(sURL,"/") & "/"
	sURL = sURL & "Mietvertrag.ott"

	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

REM Form1
   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)
         Else         
	 	If oColumns2.hasByName(sColumnname) Then
	            nIndex = oForm2.findColumn(sColumnname)
	            thisTextfield.Anchor.String = oForm2.getString(nIndex)
	         End If
	     End If
      End If
   Loop
End Sub
Bei der ersten Versuchen klappte es.

Vielen Dank für die Hilfe!

Christian

Massumeh

Re: Werte aus Abfrage in Writer übergeben

Beitrag von Massumeh » So, 22.01.2017 21:30

Hallo

und sorry, wenn ich diesen älteren Thread wieder aufwärme, aber er beschreibt meine Verzweiflung recht schön, doch leider sind die Anlagen nicht mehr erreichbar.

Ich habe vor drei Tagen als absolut beginner mit hunderten an Videos und vielem gegoogle es geschafft, mit librebase eine Datenbank zur Akten/Mandanten-Verwaltung aufzubauen. Ich weiß nicht, ob es richtig gelöst ist, aber es funktioniert zumindest. Eine Aktentabelle beinhaltet das Aktenzeichen (x/yy), eine kurze Beschreibung sowie den Anlagezeitpunkt. Der key ist mit einer weiteren Tabelle Beteiligte verbunden, welche wiederum Verbindungen zu der Adressentabelle sowie einer weiteren zur Rolle enthält.

Über ein Haupt- und Unterformular kann ich zumindest schön Akten anlegen, diesen diverse Beteiligte mit jeweils eigenem Betreff zuordnen.

Ab dort komme ich jedoch nicht mehr weiter: Mein Wunsch wäre es, in diesem Formular einen Beteiligten auszuwählen und mittels einer Schaltfläche eine writer-Vorlage auszuwählen, in welcher dann Adresse, eigenes und fremdes Aktenzeichen des Beteiligten etc automatisch ausgefüllt sind, also die entsprechenden Datensätze an die entsprechenden Felder in der Briefvorlage übergeben werden.

Über die Serienbrieferstellung gelingt es, den Datenbankdaten zum writer hinüberzuhelfen, doch habe ich nach den vielen Stunden des Videoschauens und Lesens das Gefühl, dass es hier ohne ein macro wohl nicht weitergeht.

Die Beispielsdateien sind hier leider kaum mehr erhältlich, ich war also auch versucht, diese nachzuvollziehen. Aber meine Programmierkenntnisse sind positiv ausgedrückt sehr übersichtlich. Die Makrovorlage zum Geschäftsbrief ist schon sehr sportlich - ich habe es leider nichtmal geschafft, sie auf libreoffice umzubauen.

Ich freue mich, wenn sich ein Profi hier kurz Zeit nehmen könnte und mir weiterhelfen könnte. Aus den Beiträgen hier fühle ich auch, dass eine funktionierende Lösung wohl auch in diesem threat nicht gefunden worden ist.

Ich bin auf jedenfall schonmal unendlich dankbar für jeden, der sich die Zeit für das Lesen meines Problems genommen hat :)

freedom
********
Beiträge: 2158
Registriert: Do, 16.08.2007 15:12

Re: Werte aus Abfrage in Writer übergeben

Beitrag von freedom » So, 22.01.2017 21:47

Hallo,
Ich bin auf jedenfall schonmal unendlich dankbar für jeden,
der sich die Zeit für das Lesen meines Problems genommen hat :)
Bitte schreibe einen neuen Beitrag mit deinem Betreff
und Standardangaben. Als Hilfestellung gibt es diese Bekanntmachung:
viewtopic.php?f=3&t=54568&sid=335599406 ... 6a294e66fd

RobertG
*******
Beiträge: 1656
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Werte aus Abfrage in Writer übergeben

Beitrag von RobertG » Mo, 23.01.2017 20:24

... und hier nur der kleine Hinweis: Material und wie das auch funktioniert liegt dem Base-Handbuch bei, besonders den zusätzlichen Beispielen. Da wird mit Platzhaltern gearbeitet, die über ein Makro von Base aus beschickt werden.

Gruß

Robert

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste