Conectar Base con Writer

Discute sobre las herramientas de la base de datos
Responder
JFRAN80
Mensajes: 22
Registrado: Mar Ago 06, 2019 8:09 am

Conectar Base con Writer

Mensaje por JFRAN80 »

Buenas a todos. Llevo mucho tiempo consultando este foro para pasar todas mis bases de datos de Access a Base, como muchos y la verdad es que ha sido de gran gran utilidad.
No obstante, desde hace varios días me he atascado en uno de los pasos que son fundamentales para mi trabajo y es pasar la información de Base a Writer. Lo he conseguido hacer desde Writer, conectando la plantilla a mi base de datos de una forma bastante sencilla, pero mi idea es que esta combinación se haga directamente desde Base como lo hacía desde Access.

Estoy cerca de hacerlo gracias al post de Longi (https://forum.openoffice.org/es/forum/v ... odt#p48049) ya que he conseguido que desde mi formulario de Base y a través de Mail Merge me enlace mi plantilla de Writer con mi tabla de Base. Pero el problema es que me enlaza todos los registros de mi base de datos, que son al menos 100, por lo que me genera un documento con 1.000 páginas y yo solo quiero que me enlace uno de mis registros, el que yo le diga o que la aplicación me pregunte que registro usar a través del campo número de factura, por ejemplo.

Por ello, necesito modificar dicha Macro para que me filtre por el campo que yo le diga, por ejemplo, el campo número de factura.

Esta es la macro de Longi

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


Editado: Por RMG, cambio de título a minúsculas, según indican las normas del foro.
Libreoffice 6.3.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Conectar Base con Writer

Mensaje por Longi »

Buenas!
Hay otras formas de hacerlo, como con informes o con combinaciones con plantillas (hay mas post en los que participo, pero el código original es de Mauricio, como no podía ser de otra manera!)
El asunto es que la técnica del Mail Merge está diseñada para hacer combinaciones masivas (eso, un montón de registros y todos a la vez), pero, si en vez de tirar de una tabla lo haces desde una consulta que comandes desde el botón del formulario, de tal manera que pase a ser una consulta de un solo registro, supongo que tendrás el asunto resuelto.

(El commandType=1 sería una consulta. si te fijas en el código está con 0, que es una tabla.)

Ya contarás.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
JFRAN80
Mensajes: 22
Registrado: Mar Ago 06, 2019 8:09 am

Re: Conectar Base con Writer

Mensaje por JFRAN80 »

Efectivamente como indicas lo suyo sería realizarlo mediante informes. Voy a probar a realizarlo de 3 modos, mediante la macro de Mauricio usando una consulta, a través de informes y directamente desde Writer, que me parece que al final será la opción más óptima. En cuanto termine os cuento. Gracias por la respuesta!! :D
Libreoffice 6.3.2.2 en Windows 10
Avatar de Usuario
MRF
Mensajes: 24
Registrado: Mar May 19, 2015 3:36 pm

Re: Conectar Base con Writer

Mensaje por MRF »

Hola JFRAN80,

Lo más seguro es que lo que voy a plantearte ya lo has pensado o no te sirve, pero una forma cómoda de seleccionar algunos de los datos de una tabla o consulta de nuestra base de datos y presentarlos con writer es la combinación de correspondencia, que ya tienes en el menú Herramientas. Yo lo utilizo en algunos casos y es super sencillo. Basta con seleccionar el origen de datos adecuado y establecer los filtros.

Espero te sirva de ayuda o que ya lo hayas resuelto. Un saludo.
Apache OpenOffice 4.1.6 en windows 10
LibreOffice 6.2.5.2 (x64) en windows 10
JFRAN80
Mensajes: 22
Registrado: Mar Ago 06, 2019 8:09 am

Re: Conectar Base con Writer

Mensaje por JFRAN80 »

Buenas de nuevo. Tras un tiempo probando, lo más sencillo es hacer lo que indica Longi, es decir, crear una consulta con los datos necesarios y usar Mail Merge. De otro modo se complica mucho la cosa.

Ahora, me surge otra duda y es que me veo obligado como todos (supongo) a cambiar a Firebird. La verdad que está siendo algo engorroso pero me he dado cuenta, que con este motor si se puede abrir la base de datos por varios usuarios que se encuentren en red, pero no te informa si estás en modo solo lectura o si por el contrario puedes escribir. ¿Sabéis si hay algún modo de que el programa te informe que estás en modo lectura o que está siendo utilizada por otra persona?

Saludos,
Libreoffice 6.3.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Conectar Base con Writer

Mensaje por Longi »

Buenas!

Primero decir que las posibilidades con informes son grandes, aunque costosas en tiempo de diseño, y Libreoffice ha dejado de lado el antiguo sistema (como la mayoría de usuarios que tiran de ORB, el cual suplanta al anterior y 'le tapa la boca')
De todos modos la combinación con Writer es muy adecuada para trabajar con textos de oficina y se puede hacer con los campos de un formulario o bien a partir de los campos de una consulta, que puede tener muchos más campos que el propio formulario.
Si cuelgas un pequeño ejemplo podemos mirar cómo quedaría.

En cuanto a lo segundo....Normas del foro: Un hilo por tema.
Abre un nuevo hilo y a ver si alguien quiere o sabe contestar(y pienso en Mriosv o en RMG, ya que son las únicas referencias que tengo como personas que se manejan en estas cosas, aunque seguro que hay muchas más).

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
JFRAN80
Mensajes: 22
Registrado: Mar Ago 06, 2019 8:09 am

Re: Conectar Base con Writer

Mensaje por JFRAN80 »

Gracias Longi, he probado realizando un informe, pero el problema que le veo es que los campos no se ajustan al texto, es decir tienen un tamaño fijo y si el texto es más largo no se ve completo. Sin embargo, del otro modo si que se ajusta a la perfección.
Libreoffice 6.3.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Conectar Base con Writer

Mensaje por Longi »

No sé si conoces lo que hay en este hilo:
https://forum.openoffice.org/es/forum/v ... 70&t=11605. Tiene ya su tiempo, pero tiene ejemplos de todo tipo, y uno de los apartados (textos) trabaja los campos autoextensibles, y sí, se puede, aunque utilicé otras técnicas también, como copar el texto de un campo, reducir el tamaño del campo hasta que no se ve, colocarme al lado de él y pegar en el cuerpo del texto lo que había copiado del campo.
Funciona fráncamente bien, hasta que quieres convertir el writer a pdf y entonces esos campos que en writer no se veían empiezan a darte quebraderos de cabeza.
Si miras lo que hay en el enlace no desesperes con las primeras macros. Al principio parecen inútiles, pero según va aumentando la complejidad se va viendo ya algo de utilidad
Acuérdate que una actuación compleja es la suma de muchas simples!

Ya contarás!

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
JFRAN80
Mensajes: 22
Registrado: Mar Ago 06, 2019 8:09 am

Re: Conectar Base con Writer

Mensaje por JFRAN80 »

Buenas de nuevo, tal y como dijo Longi se puede usar el código que puse al principio para consultas, de hecho lo he probado y funciona ok. Pero si a esta consulta le meto un filtro por número de factura, ya no combina correctamente. Sabeis si esto se puede corregir en el código o de otro modo?
Libreoffice 6.3.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Conectar Base con Writer

Mensaje por Longi »

En un primer momento yo tenía una pirueta hecha que en un principio era totalmente innecesaria:
Hacía una consulta sobre la tabla (en tu caso la de facturas), en la que me daba un único registro (el correspondiente al ID del registro del formulario en el caso mío). Con el resultado rellenaba una tabla (de un único registro) mediante código (primero hacía un delete, con lo que la vaciaba y luego un insert into, con lo que la dejaba con el resultado que quería).
Todo esto era antes de pensar que pudiera servir el código con una consulta, en vez de con una tabla.
Quizá en tu caso sirva, ya que haces la consulta con parámetros, y después lanzas el código para que la tabla que ya tienes preparada te la limpie y luego la rellene. A partir de esta tabla harías el Mail Merge....
Un tanto rocambolesco. Lo sé, pero quizá sirva en el caso de los parámetros, ya que, aunque te los pide, luego el Mail Merge lo haces sobre una tabla, no sobre la consulta que te pide criterios.

Ya dirás!

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder