Macros/Writer/010/es
TDF LibreOffice en español Document Liberation Project Blogs comunitarios Weblate Nextcloud Redmine Preguntas y respuestas Donar
La combinación de correspondencia es una característica de LibreOffice que permite escribir una plantilla con campos predefinidos y sustituirlos por los campos correspondientes de una base de datos. Esto es muy útil cuando se requiere enviar la misma carta a varias personas con solo pequeñas variaciones como el nombre y la dirección de a quien se escribe.
Cómo usarlo
Después de descargar el fichero mailmerge_by-lanedoCOM.odt
y abrirlo, puede usar las macros contenidas en el documento. Edite la plantilla como le acomode y después ejecute la macro usando los menús:
- ▸ ▸
- mailmerge_by-lanedoCOM.odt → Standard → Mail → DoManualMailMerge
NOTA: Las macros conectan con una base de datos y no harán nada si no está disponible. Por lo mismo, no espere ningún resultado al trabajar solo con el archivo descargado.
Descargas
Media:mailmerge_by-lanedoCOM.odt
Cómo funciona
La macro conecta con una base de datos SQL y rellena los campos de la plantilla, un registro por documento. Cada vez que se actualiza la plantilla con un registro de la base de datos, se genera una salida de la macro. Todas estos documentos resultantes se almacenan en un solo archivo PDF para facilitar la impresión en papel.
La plantilla y la configuración de la base de datos son específicas para el negocio de Lanedo, pero ambas pueden ser fácilmente personalizables.
REM ***** BASIC *****
Sub DoManualMerge
Dim args(1) As New com.sun.star.beans.PropertyValue
doc = ThisComponent
fm = doc.getTextFieldMasters()
'names = fm.getElementNames ()
'For idx = 0 To UBound(names())
' print names(idx)
'Next idx
'https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Text_Fields
res = GetResultSetFromMDB ()
Do While res.next ()
meta = res.getMetaData()
cur_row = res.getRow ()
field = fm.getByName(TFName("Title"))
field.Content = res.getString (9)
field = fm.getByName(TFName("FirstName"))
firstname = res.getString (2)
field.Content = firstname
field = fm.getByName(TFName("Surname"))
surname = res.getString (3)
field.Content = surname
field = fm.getByName(TFName("Street"))
field.Content = res.getString (4)
field = fm.getByName(TFName("Housenumber"))
field.Content = res.getString (5)
field = fm.getByName(TFName("ZIP"))
field.Content = res.getString (6)
field = fm.getByName(TFName("City"))
field.Content = res.getString (7)
field = fm.getByName(TFName("Country"))
field.Content = res.getString (8)
doc.TextFields.refresh()
args(0).Name = "FilterName"
args(0).Value = "writer_pdf_Export"
url = "file:///Users/gicmo/Coding/Lanedo/MM_" & firstname & "_" & surname & ".pdf"
doc.storeToURL(url, args())
Loop
End Sub
Function TFName (str As String) As String
TFName = "com.sun.star.text.fieldmaster.User.Recp" & str
End Function
Sub MailMergeService
Dim MM as Object
MM = CreateUnoService("com.sun.star.text.MailMerge")
MM.DocumentURL = "file:///Users/gicmo/Coding/Lanedo/MailMerge.odt" 'sourceDocName
MM.OutputType = com.sun.star.text.MailMergeType.FILE
MM.OutputUrl = "file:///Users/gicmo/Coding/Lanedo/"
MM.FileNamePrefix = "MM_"
MM.SaveAsSingleFile=True
MM.DataSourceName = "testdb_marvin"
MM.CommandType = 1 '1 = predefined query, 2 SQL
MM.Command = "all_data"
MM.execute(Array())
MM.dispose()
End Sub
Function db_escape (str As String, connection) As String
Dim delim As String
meta = connection.getMetaData ()
delim = meta.getIdentifierQuoteString ()
db_escape = delim & str & delim
End Function
Sub GetResultSetFromMDB as Object
Dim dm
Dim driver
Dim params(1) As New com.sun.star.beans.PropertyValue
REM Get Current Spreadsheet
REM http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/module-ix.html
REM http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SpreadsheetDocument.html (getSheets -> XSpreadsheets)
REM http://api.openoffice.org/docs/common/ref/com/sun/star/table/module-ix.html
doc = ThisComponent
url = "jdbc:mysql://marvin.local/testdb?user=gicmo&password=XXXXX"
' Database Setup
dm = CreateUnoService ("com.sun.star.sdbc.DriverManager")
params(0).Name = "JavaDriverClass"
params(0).Value = "com.mysql.jdbc.Driver"
con = dm.getConnectionWithInfo (url, params())
if IsNull (con) Then
MsgBox "Could not connect to DB"
Exit Sub
End if
stmt = con.CreateStatement()
sqltxt = "SELECT * FROM " & db_escape("addressbook", con)
GetResultSetFromMDB = stmt.executeQuery (sqltxt)
End Sub