Macros/Writer/010/es

    From The Document Foundation Wiki
    < Macros‎ | Writer
    This page is a translated version of the page Macros/Writer/010 and the translation is 100% complete.
    Other languages:

    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:

    • Herramientos ▸ Macros ▸ Ejecutar Macros
    • 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
    
    '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


    Macros