Mail Merge using a SQL database

From The Document Foundation Wiki
< Macros‎ | Writer
Jump to: navigation, search
This page is a translated version of the page Macros/Writer/010 and the translation is 90% complete.

Other languages:
English • ‎español

La combinación de correspondencia es una característica de LibreOffice que permite que una plantilla con campos predefinidos sean sustituídos por los campos correspondientes de una base de datos (por ejemplo, para nombre y dirección de un destinatario). Esto es muy útil cuando se requiere enviar el mismo documento a varias personas con solo las variaciones propias del nombre y la dirección de a quien se escribe.

Cómo usarlo

Después de descargar y abrir el archivo mailmerge_by-lanedoCOM.odt, puede usar la macro contenida en el documento. Edite la plantilla como le acomode y después ejecute la macro usando los menús de LibreOffice:

  1. Herramientas>Macros>Ejecutar macro…
  2. Dentro del diálogo Selector de macros:
    1. En el panel izquierdo hacer clic en el nombre del archivo, luego en Standard, luego en Mail
    2. En el panel derecho hacer clic en DoManualMerge
  3. Pulsar el botón Ejecutar

NOTA: En este ejemplo 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

   File:Mailmerge by-lanedoCOM.odt

Cómo trabaja

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

'http://wiki.services.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


Documentation/Macros//es