Página 1 de 1

[RESUELTO] MailMerge desde una tabla de base

Publicado: Mié Jul 01, 2015 4:47 pm
por Longi
Buenas!
Aunque hace algún tiempo amenacé con preguntar cosas, me he ido arreglando gracias a las ayudas del foro y otras cosas publicadas, sin embargo ahora estoy atascado al intentar hacer algo totalmente distinto a lo que tenía hecho hasta ahora.
Después de muchas piruetas, pondremos como elemento de inicio que tengo una tabla con un solo registro y con campos de texto entre los que se encuentran dos campos memo.
He hecho un documento en writer con los campos para que se 'mezclen' con texto, y conseguir una especie de carta personalizada con los datos de la tabla con el único registro. (En vez de usar un texto estándar en el cuerpo de la carta, uso los campos memo para ello.)
He conseguido registrar la base de datos y relacionarla con el texto generado (que tampoco es que tenga mucho mérito el asunto). El caso es que he puesto un botón que hace que se abra el documento que tengo relacionado con la tabla, pero no soy capaz de hacer una macro para que el documento con campos se combine ( un solo documento) y me termine dando un documento sin campos ( digamos 'limpio'), en el que poder hacer alguna cosilla de edición, y después guardarlo en el directorio que toque.
Tengo desarrolladas macros en las que todo esto es posible en informes, pero el pequeño detalle es que en este caso es una base de datos de Access (runtime) a la que he conectado una de base para trabajar desde Libreoffice (cosas del trabajo). En este caso, los campos memo son cortados sin llegar a aparecer el total del texto, así que esta vía está descartada.

Resumiendo: necesito una macro que haga que un documento con campos hecho para mail merge me lo termine dejando en un documento de writer con el texto de los campos inicialmente seleccionados.

Supongo que me enrollo mucho y explico poco.....Soy así!

Gracias por anticipado!
Ah!, la base de datos tiene datos 'delicados', por lo que no la puedo enviar. Ya sé que trabajar a ciegas es más difícil....

Re: MailMerge desde una tabla de base

Publicado: Mié Jul 01, 2015 6:10 pm
por mauricio
Envía la base de datos con algunos datos ficticios... lo que interesa es la estructura...

Re: MailMerge desde una tabla de base

Publicado: Jue Jul 02, 2015 9:42 pm
por Longi
Bueno!
Lo que mando no es una base de datos de ejemplo, sino una explicación gráfica. Espero que sea suficientemente clarificador.
Lo que intento es automatizar todo el proceso, ya que no voy a usarla yo solo, y alguna gente se lía con tanto pasito.

Un saludo y gracias por al menos leerlo. (mejor si hay alguna ayuda, ya que en cuanto a mailMerge no he encontrado gran cosa en la red)

Dejo aquí el enlace porque al final se hace un poco grande para el foro:

https://drive.google.com/file/d/0B9p04i ... sp=sharing

Hasta pronto!

Re: MailMerge desde una tabla de base

Publicado: Lun Jul 13, 2015 2:36 pm
por Longi
Buenas!

Después de trastear ampliamente he modificado bastante una macro de Xabin y he conseguido lo que quería: el documento final de una combinación de correspondencia (MailMerge) con el registro único de una tabla de base ( seguramente valdría con la consulta ).
Dejo el código explicado más abajo por si a alguien le interesa.

Cuidado con el bug que hay en Libreoffice con la búsqueda y sustitución de expresiones regulares, que sí que funciona en openoffice, pero que me tuvo loco unos días. Se termina arreglando con la grabación de macro con el grabador de macros de Writer y la incluimos en el interior de la macro final.

Código: Seleccionar todo

Sub MailMerge ()
       ' Adaptado de Xabin
       '---------------------------------------------------------------
       ' 1º Declaramos las variables
       
       Dim noOpt() As Object, oText As Variant, oCurs As Object, RDescrip  As Variant
       Dim sRuta As String, oRuta As String, dRuta As String, LineSpace As Variant
       Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
       Dim oDoc As Object, objMailMerge As Object
       Dim document   as object, dispatcher as object
       '-------------------------------------------------------------------
       ' 2º Determinamos las rutas que nos interesan
       
       oRuta= convertToURL("Ruta del documento que tiene la combinación de campos")
       dRuta= ConvertToURL("Ruta de la carpeta en la que se encuentra el documento que guardamos ya combinado")
       '---------------------------------------------------------------------------------
       ' 3º Nos aseguramos de no tener más de un documento
       
       If FileExists(dRuta + "/temp0.odt") Then                                 ' Si existe el documento
       kill dRuta + "/temp0.odt"                                                ' Lo eliminamos
       End If                                                                   ' Acabamos la condición
       '-------------------------------------------------------------------------------------
       ' 4º Establecemos el origen de datos y creamos el servicio       
    
       objMailMerge = createUnoService("com.sun.star.text.MailMerge")           ' Creamos el servicio
       objMailMerge.DataSourceName = "Mi base de datos"                         ' El nombre de la base de datos
       objMailMerge.DocumentURL = oRuta                                         ' Ruta del documento que tiene la combinación de campos
       objMailMerge.CommandType = 0                                             ' 0= Tabla, 1=Consulta
       objMailMerge.Command = "Mi tabla"                                        ' Nombre de la tabla que coincide con el nombre de la base de datos
       objMailMerge.OutputType = 2                                              ' 2= FILE, 1 = PRINTER, 3 = EMAIL
       objMailMerge.OutputURL = dRuta                                           ' Ruta de la carpeta en la que se encuentra el documento que guardamos
       objMailMerge.FileNameFromColumn = False
       objMailMerge.SaveAsSingleFile = True
       objMailMerge.FileNamePrefix = "temp"                                     ' Prefijo que utilizamos para el nombre del archivo temporal
       '------------------------------------------------------------------------
       ' 5º Se ejcuta la combinación de correspondencia
       
       objMailMerge.execute(noOpt)                                              ' Se combinan los nuevos datos
       oDoc = StarDesktop.loadComponentFromURL( dRuta &"/temp0.odt", "_blank", 0, mOpciones() )' Se abre el documento ya combinado
       '-------------------------------------------------------------------------
       ' 6º Editamos el texto
       
       oText = oDoc.GetText()                                                   ' Texto del documento de Writer
       oCurs = oText.createTextCursor()                                         ' Creamos un cursor de texto
       oCurs.gotoEND(True)                                                      ' Cursor va al final del texto
       LineSpace = oCurs.paralinespacing
       LineSpace.height = 150                                                   ' Establecemos un interlineado de 1,5
       oCurs.paralinespacing = LineSpace
       oCurs.ParaAdjust = com.sun.star.style.ParagraphAdjust.BLOCK              ' Establece justificación en todo el documento como un bloque
       '------------------------------------------------------------------------
       ' 7º Este apartado solo funciona en OpenOffice, en LibreOffice es un bug y lo solucionamos en el siguiente paso:
       
       RDescrip = oDoc.createReplaceDescriptor                                  ' Elemento que usaremos para sustituir partes del texto
       RDescrip.searchRegularExpression = True                                  ' Sustituiremos expresiones regulares
       RDescrip.searchString = "\n"                                             ' Buscamos los intros
       RDescrip.replaceString ="\n"                                             ' Los sustituimos por un quiebre de párrafo
       oDoc.replaceAll(RDescrip)                                                ' Ejecutamos el reemplazo   
       '--------------------------------------------------------------------------
       ' 8º Este paso vale tanto para libre como para Openoffice, grabado con la grabadora de macros de Writer:

       rem get access to the document
       document   = oDoc.CurrentController.Frame
       dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

       rem ----------------------------------------------------------------------
       dim args1(18) as new com.sun.star.beans.PropertyValue
       args1(0).Name = "SearchItem.StyleFamily"
	   args1(0).Value = 2
       args1(1).Name = "SearchItem.CellType"
       args1(1).Value = 0
       args1(2).Name = "SearchItem.RowDirection"
       args1(2).Value = true
       args1(3).Name = "SearchItem.AllTables"
       args1(3).Value = false
       args1(4).Name = "SearchItem.Backward"
       args1(4).Value = false
       args1(5).Name = "SearchItem.Pattern"
       args1(5).Value = false
       args1(6).Name = "SearchItem.Content"
       args1(6).Value = false
       args1(7).Name = "SearchItem.AsianOptions"
       args1(7).Value = false
       args1(8).Name = "SearchItem.AlgorithmType"
       args1(8).Value = 1
       args1(9).Name = "SearchItem.SearchFlags"
       args1(9).Value = 65536
       args1(10).Name = "SearchItem.SearchString"
       args1(10).Value = "\n"
       args1(11).Name = "SearchItem.ReplaceString"
       args1(11).Value = "\n"
       args1(12).Name = "SearchItem.Locale"
       args1(12).Value = 255
       args1(13).Name = "SearchItem.ChangedChars"
       args1(13).Value = 2
       args1(14).Name = "SearchItem.DeletedChars"
       args1(14).Value = 2
       args1(15).Name = "SearchItem.InsertedChars"
       args1(15).Value = 2
       args1(16).Name = "SearchItem.TransliterateFlags"
       args1(16).Value = 1280
       args1(17).Name = "SearchItem.Command"
       args1(17).Value = 3
       args1(18).Name = "Quiet"
       args1(18).Value = true

       dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
                                                                              

End Sub
Hasta la siguiente!

Re: [RESUELTO]MailMerge desde una tabla de base

Publicado: Lun Jul 13, 2015 6:36 pm
por xiseme
:super: ¡Bien! y ¡bien! (por solucionarlo y por compartir la solución)

Re: [RESUELTO] MailMerge desde una tabla de base

Publicado: Mar Jul 14, 2015 4:01 pm
por SLV-es
:super: :bravo: