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....
[RESUELTO] MailMerge desde una tabla de base
[RESUELTO] MailMerge desde una tabla de base
Última edición por Longi el Lun Jul 13, 2015 2:36 pm, editado 1 vez en total.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: MailMerge desde una tabla de base
Envía la base de datos con algunos datos ficticios... lo que interesa es la estructura...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Re: MailMerge desde una tabla de base
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!
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!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: MailMerge desde una tabla de base
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.
Hasta la siguiente!
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
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: [RESUELTO]MailMerge desde una tabla de base
¡Bien! y ¡bien! (por solucionarlo y por compartir la solución)
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Re: [RESUELTO] MailMerge desde una tabla de base
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas