BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Mailmerge bekommt keine Werte in aProps() übergeben

Alles zur Programmierung im LibreOffice.
Antworten
Benutzeravatar
bassimin
Beiträge: 16
Registriert: Mi 20. Dez 2017, 11:59
Wohnort: Freiburg
Kontaktdaten:

Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von bassimin » Sa 10. Feb 2018, 15:37

Hallo
Versuche seit zwei Tagen, mit modifiziertem Makro aus dem einschlägigen Base-Handbuch aus einem Base-Formular heraus Abfragewerte an ein Writerdokument mit den zugehörigen Feldern zu übergeben. Im Formular wird lediglich die ID des Datensatzes ermittelt und per Button/Makro weitergegeben.
Makrocode siehe unten. Durch einige msgbox's lasse ich mir die Schritte anzeigen, scheint alles zu gehen wie gewünscht. (Habe die Ausgaben als comment eingefügt)
Bei
oMailMerge.execute(aProps())
entsteht dann aber nur eine neue Datei, die nix aus der Abfrage erhalten hat -keine Feldinhalte, kein Dateinamenpräfix. Die DB ist angemeldet, und manuell über das Datenquellenfenster lassen sich die Felder befüllen, die entsprechende Abfrage ist schon offen. Soweit ich in verschiedenen Posts gesehen habe, stimmt die Codefolge für diese Aufgabe so, obwohl mir nicht einleuchtet, wie die Abfrageergebnisse ins Array aProps() kommen sollen, und tatsächlich erscheint für msgbox aProps(),1,"aProps" eine leere Ausgabe.
Durch diese msgbox stoppt dann auch das Makro mit "BASIC-Laufzeitfehler. Objektvariable nicht belegt", ohne arbeitet es weiter und gibt eine leere Datei aus.

Derselbe Fehler kommt später nochmal, wenn es darum geht, den Namen der erstellten Datei nachzubauen (um sie zu öffnen)
Aber das wäre schon ein neues topic.

Was mache ich falsch , dass es nicht zum Befüllen des arrays aProps() kommt?
Milan

PS Bsp-DB incl Verzeichnis mit Vorlagendatei und erstellten leeren Dateien anbei - Hier ist wichtig das Formular form_DOKUMENTATION, und in diesem wird das Makro über den orangen Knopf rechts oben "AUSGABE WRITER (makrofehler)" gestartet.

Code: Alles auswählen

REM  *****  BASIC  *****

SUB agh_proKopf_anwriter(oEvent AS OBJECT)
oFeld = oEvent.Source.Model
oForm = oFeld.Parent
DIM oMailMerge AS OBJECT
DIM aProps()
oMailMerge = createunoservice("com.sun.star.text.MailMerge")
oMailMerge.DataSourceName = "AP-DB"
'Die Pfadbeschreibung mit der Serienbriefdatei erfolgt in der Art der jeweiligen Betriebssystemumgebung, hier ab dem Wurzelpfad eines Linux-Systems.
oMailMerge.DocumentURL = ConvertToUrl("/home/milan/DBTEST/forum/SERIE_überZeit_ALLE.ott")
oMailmerge.SaveAsSingleFile = 0
'Der Typ des Kommandos wird festgelegt. '0' steht für eine Tabelle, '1' für eine Abfrage und '2' für ein direktes SQL-Kommando.
oMailMerge.CommandType = 1
'Hier wurde eine Abfrage gewählt, die den Namen "abfS..." trägt.
oMailMerge.Command = "abfSERIE_ALLE_BerichtüberZeit"
'Über den Filter wird festgelegt, für welche Datensätze aus der Serienbriefabfrage ein Druck erfolgen soll. Dieser Filter könnte z.B. über ein Formularfeld aus Base heraus an das Makro weitergegeben werden. Mit dem Primärschlüssel eines Datensatzes könnte so der Ausdruck eines einzelnen Dokumentes erfolgen.
     'oForm = ThisComponent.drawpage.forms.getByName("frm_ListeM")
     nColumnID = oform.findcolumn("ID-mensch")
     nid = oform.getint(nColumnID)
     msgbox nid,1, "nid"                               'SCHREIBT: 11 (zB)
     'nid enthält jetzt die aktuelle ID  
     oMailMerge.Filter = "'ID-mensch' =" + nid 
     msgbox oMailMerge.Filter,1, "filter"              'SCHREIBT:'ID-mensch' =11         'Dies ist die wichtige Zeile, hier wird die ID aus dem Formular an Mailmerge übergeben!!!
'Es gibt die Ausgabetypen Drucker (1), Datei (2) und Mail (3). Hier wurde zu Testzwecken die Ausgabe in eine Datei gewählt. Diese Datei wird in dem angegebenen Pfad abgespeichert. Für jeden Serienbriefdatensatz wird ein Druck erzeugt. Damit dieser Druck unterscheidbar ist, wird das Feld Nachname in den Dateinamen aufgenommen.
oMailMerge.OutputType = 2
oMailMerge.OutputUrl = ConvertToUrl("/home/milan/DBTEST/forum/")
msgbox oMailMerge.OutputUrl,1,"oMM output URL"         'SCHREIBT: file:///home/milan/BUERO/BERUF/AUSBILDUNG/AE/Anerkennungsjahr/Arbeitsprojekt/NEUE%20DB%20TEST/DB/
oMailMerge.FileNameFromColumn = True
oMailMerge.Filenameprefix = "Name"
msgbox oMailMerge.Filenameprefix,1, "oMMFilenamepref"  'SCHREIBT: Name.
msgbox aProps(),1,"aProps"                                ' bleibt anscheinend leer
oMailMerge.execute(aProps())                           'ERSTELLT: _0.odt  - OHNE FELDBELEGUNG und ohne Prefix []

'Datei öffnen:
stSql = "SELECT ""Name"" FROM ""abfSERIE_AgH_BerichtüberZeit"" WHERE ""ID-mensch"" = '" + nid + "' "
msgbox stSql,1,"Dateinamenabfrage"                             'SCHREIBT: SELECT "Name" FROM "abfSERIE_AgH_BerichtüberZeit" WHERE "ID-mensch" = '11' 
                                                               'Die Anweisung im SQL-Direkt-Fenster von LO gibt den korrekten Namen zurück mit Komma zB: Tschaft,
oName = oSQL_Statement.executeQuery(stSql)                     'GIBT ZURÜCK: BASIC-Laufzeitfehler. Objektvariable nicht belegt
msgbox oName,1,"Dateinamenabfrage-Ergebnis"                    'bis hierher kommts nicht

stFeld = oMailMerge.OutputUrl + oName + ".odt"
msgbox stFeld,1, "Dateipfad"
'Jetzt wird das Programm aufgesucht, das in dem eigenen Betriebssystem mit der entsprechenden
'Dateiendung verbunden ist. Bei dem Stichwort 'mailto:' ist dies das Mailprogramm, bei
''http://' der Webbrowser und bei allen anderen ist die Entscheidung des Systems mit den
'Endungen der Datei verbunden.
oShell = createUnoService("com.sun.star.system.SystemShellExecute")
oShell.execute(stFeld,,0)
END SUB
mailmerge_bsp_db.zip
odt, ott und leere ods'
(202.46 KiB) 181-mal heruntergeladen
Zuletzt geändert von bassimin am So 11. Feb 2018, 14:18, insgesamt 2-mal geändert.

Benutzeravatar
bassimin
Beiträge: 16
Registriert: Mi 20. Dez 2017, 11:59
Wohnort: Freiburg
Kontaktdaten:

Re: Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von bassimin » So 11. Feb 2018, 14:15

*** UPDATE ***
Beim Erstellen der BspDB habe ich die Abfrage im Makro gewechselt (Abfrage gültig für alle Personen), und dabei übersehen, die ID-Mensch als Filtergrundlage auch in die Abfrage zu integrieren.
Das hat keinen Einfluss auf das Problem -
Auch wenn der Filter komplett herausgenommen wird und mailmerge aus der Abfrage ein Seriendokument erstellen würde, wird nichts übergeben.
Nach all den verschiedenen Posts, die ich gelesen habe, sollten irgendwie die Daten ins array aProps() [oder myProps()] kommen.
Abgesehen davon, dass ich das noch nicht verstehe, weil nirgends eine Zeile da ist, die das veranlasst (mein Unwissen)
- tun sie's nicht.
Hab auch in der Abfragebezeichnung das ü durch ue ersetzt und die Seriendruckfelder in der Writervorlage entsprechend angepasst...

Anbei entsprechend des Posts korrigierte db mit Abfrage und id
Test-DB_mit_ottDokument.zip
odt und ott
(134.53 KiB) 181-mal heruntergeladen

Benutzeravatar
bassimin
Beiträge: 16
Registriert: Mi 20. Dez 2017, 11:59
Wohnort: Freiburg
Kontaktdaten:

Re: Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von bassimin » So 11. Feb 2018, 16:11

... durch Nutzen des Alias "ID" für "ID-mensch" konnte ich die single-quotes entfernen, sodass jetzt der Name für die Datei übernommen wird.

Code: Alles auswählen

oMailMerge.Filenameprefix = "Name"
wird jetzt wirksam.
Die so benannte Datei hingegen ist immer noch die Vorlage mit leeren Feldern.

Milan

Benutzeravatar
bassimin
Beiträge: 16
Registriert: Mi 20. Dez 2017, 11:59
Wohnort: Freiburg
Kontaktdaten:

Re: Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von bassimin » So 11. Feb 2018, 17:59

OK
Asche über mein Haupt -
Irgendwie hat immer ein Bezug Dateiname / Pfad / angemeldete DB
nicht gestimmt, außerdem die ID-mensch in Hochkomma
Jetzt funktioniert es.

Aber: würde mich trotzdem jemand über die Funktionsweise des arProps() unterrichten - wie kommen da die Daten hinein bzw zur Mailmerge-Funktion?
Ich erreiche nach wie vor über msgbox arProps() nur eine leere Ausgabe...

Das wär nett

Milan

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von gogo » So 11. Feb 2018, 19:29

es gibt keine ;)
... um genau zu sein:
Das Array das mit der .execute() Funktion von MailMerge (siehe MailMerge-Funktion bzw. .execute-Interface) übergeben wird kann com::sun::'star::beans::NamedValue Werte beinhalten, man müsste so ein Array mit:

Code: Alles auswählen

dim args(1) as new com.sun.star.beans.PropertyValue
args(0).Name = "Count"
args(0).Value = 1
args(1).Name = "Select"
args(1).Value = false
definieren und befüllen (Beispiel aus einer Dispatcher-Funktion).
.execute() ist ein com::sun::'star::task::XJob der bei MailMerge KEINE Argunente benötigt. Daher wird ein leeres Array übergeben. Am einfachsten ist es nicht irgend ein Array zu übergeben, das man vorher umständlich definiert ..., sondern die array()-Funktion zu verwenden, dann wird .execute() ein Objekt in Form eines leeres Variant-Arrays übergeben.
Dein Funktionsaufruf kann also einfach so aussehen:

Code: Alles auswählen

oMailMerge.execute(array())
Die im Mailmerge verwendeten Daten kommen NICHT über die Props in die Funktion, sondern werden über oMailMerge.Command und oMailMerge.Filter geholt.
Die Fehlermeldung die Du bekommst ist irreführend und kommt aus der MsgBox-Funktion, da ein "Objekt" bemängelt wird - allerdings ist das Problemobjekt nicht das array, sondern die MsgBox-Funktion die mit einem leeren Array nichts anfangen kann. Probier' mal folgendes Makro, es verdeutlicht wann der Fehler auftritt:

Code: Alles auswählen

sub Test
	msgbox(msgbox(a(),,"MsgBox1"),,"MsgBox2")
	dim b()
	msgbox(msgbox(b(),,"MsgBox3"),,"MsgBox4") ' << Fehler bei "MsgBox4"
end sub
Ich würde sagen, dass der Fehler beim Auswerten einer msgbox-Funktion entsteht, in diesem Fall also während die 3. MsgBox ausgewertet wird, denn in der Funktion oben ist a() ein "Leerer Datenwert (empty)", b() jedoch eine "Leere Tabelle". Zur Anzeige der MsgBox4 kommt es gar nicht!
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Benutzeravatar
bassimin
Beiträge: 16
Registriert: Mi 20. Dez 2017, 11:59
Wohnort: Freiburg
Kontaktdaten:

Re: Mailmerge bekommt keine Werte in aProps() übergeben

Beitrag von bassimin » Mo 12. Feb 2018, 09:10

Hallo gogo
Vielen Dank!
Ganz schön profund
UNGEFÄHR hab ich's auf jeden Fall verstanden!
Grüße
Milan

PS würde gerne den Thread als gelöst markieren, finde aber nicht heraus, wie...

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten