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