[RESUELTO] Guardar documento Writer desde Base

Discute sobre las herramientas de la base de datos
Responder
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

[RESUELTO] Guardar documento Writer desde Base

Mensaje por jopicach »

Hola,

He creado esta macro con el grabador. Desde Base tengo un botón que me abre un writer y esta macro debería guardar el documento, pero al ejecutarlo desde base lo que me guarda es el formulario y no el nuevo documento creado. Creo que el error está en esta línea, pero no solucionarlo por más que busco.

Gracias.

rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Users/MiPC/Desktop/OOoBasic%20Combinar%20texto/11111.odt"
args1(1).Name = "FilterName"
args1(1).Value = "writer8"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
Última edición por jopicach el Sab Dic 23, 2017 12:56 pm, editado 1 vez en total.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Guardar documento Writer desde Base

Mensaje por Longi »

Buenas!
Efectivamente, estas apuntando hacia el documento activo, que es la base de datos.
Yo lo resolví de una manera no muy estética, y es poniendo un botón en el writer para hacer esta función (concretamente, en mi caso, lo guarda en un pdf). Algunos de los usuarios querían hacer revisión de fallos de tipo ortográfico o de estilo antes de guardarlo, así que obligó a parar el proceso a mitad de recorrido.
Otra opción es hacer un loop entre los documentos hasta que halla el que tiene el título que le hayas puesto al documento:

Código: Seleccionar todo

    oDocumentos = StarDesktop.getComponents()                                                ' Documentos que hay en el escritorio
    oEnumeraDocumentos = oDocumentos.createEnumeration()                                     ' Enumeramos los documentos
    Do While oEnumeraDocumentos.hasMoreElements()                                            ' Mientras haya más elementos
    oDocumento = oEnumeraDocumentos.nextElement()                                            ' Vamos al siguiente
    If HasUnoInterfaces(oDocumento, "com.sun.star.frame.XModel") Then                        ' Si tiene modelo
    If oDocumento.getTitle()="TuDocumento" Then
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Users/MiPC/Desktop/OOoBasic%20Combinar%20texto/11111.odt"
args1(1).Name = "FilterName"
args1(1).Value = "writer8"

dispatcher.executeDispatch(oDocumento, ".uno:SaveAs", "", 0, args1())
    End if
    End if
    Loop
Prueba a ver si te va, si no, vamos mirando otras cosas....El afamado sistema de ensayo y error.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Guardar documento Writer desde Base

Mensaje por jopicach »

Hola,

Gracias por responder. He estado haciendo pruebas, pero no he conseguido que funcione. Adjunto archivo de prueba para que se vea mejor. He limpiado el código para dejar solo lo que interesa.

He intentado también aplicar este sencillo de abajo sin fortuna. ¿Por defecto no debería mandar el primer foco al documento que se abre? Estoy perdido en este asunto en el que llevo semanas dando palos de ciego, pensaba que sería más sencillo.

oVentana = Documento.getCurrentController.getFrame.getComponentWindow()
'Le enviamos el foco para activarla
oVentana.setFocus()

Lo que quiero conseguir es:
1.- Al pulsar el botón se abre la plantilla seleccionada (conseguido)
2.- Al abrir la plantilla se cambia la ruta de guardado a la que se asigne y se cambia el nombre del título por el que se asigne sin cuadro de diálogo (para que el usuario no tenga que estar recorriendo carpetas)
3.- Al pulsar a guardar se guarda el archivo en la carpeta previamente asignada con el nombre también asignado.

Gracias.
Adjuntos
OOoBasic Combinar texto.7z
(46.99 KiB) Descargado 172 veces
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Guardar documento Writer desde Base

Mensaje por Longi »

Veamos!

Lo que parece que se pretende es que se pueda guardar el documento cada vez que se genere, con un título nuevo y con los cambios que le provoca la propia base de datos.
Esto es la base del código de Mauricio, ya que abre el documento como una plantilla, y si haces cambios, el original no cambia, y te obliga a guardarlo de la forma 'guardar como'. Por lo tanto, no tienes que quitarle la posibilidad de abrirlo como plantilla.
Por otra parte, si lo que se pretende es guardar el documento con los cambios, primero tienes que dejar que se hagan los cambios, por ello, el código será mejor ponerlo en una función que se ejecuta al final, o en la última función que se ejecuta.
Yo lo he puesto en función aparte, y tiene dos fases: la primera guarda el documento con un título con código de hora y minuto, para evitar que los nombres se repitan (pero eso lo variarás con otra numeración o como veas). Lo guarda como documento Writer, por lo que no necesita el filtro.
La segunda parte, después de un poco de tiempo, cierra el documento ( se puede eliminar cuando se quiera esta, digamos, sección), ya que si no, quedan documentos abiertos sin control ninguno
No te deja hacer nada, simplemente ves que se abre, se modifica y se cierra, y si tienes la precaución de abrirlo en modo oculto, entonces trabajaría todo en segundo plano.
En mi caso uso un botón no imprimible puesto en el documento original (el que sirve de plantilla), para poder mantener el writer abierto y hacer los cambios que se estimen oportunos, y después cerrar y guardar en el sitio correspondiente y con el título que toca.
El código de la función sería la siguiente:

Código: Seleccionar todo

Function Guardar(doc)
   
    msgbox "Hemos puesto un sistema de titulación que incluye el segundo en el que se generó, para que no se repitan los documentos almacenados" & CHR(13) & "No necesita ser guardado como Writer, ya que ya lo es"
    sTime = Format(Time,"MM:SS.000") 
    Tiempo= left(sTime,2) &"-" & Right(left(sTime,5),2)
    doc.Title= "Mi plantilla ejemplarizante-" & day(Now()) &"-"& Month(Now())&"-"& year(Now())&"-"& Tiempo
    Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
    sRuta =  ConvertToURL("C:\Users\djorquera\Desktop\OOoBasic Combinar texto\"& Doc.Title & ".odt")
    doc.storeAsURL( sRuta, mOpciones() )
    Wait 200
    
    msgbox "Hemos añadido un sistema de cierre, que en cualquier momento se puede modificar/eliminar, pero que evita que queden documentos abiertos sin control"
    
    oDocumentos = StarDesktop.getComponents()                                                ' Documentos que hay en el escritorio
    oEnumeraDocumentos = oDocumentos.createEnumeration()                                     ' Enumeramos los documentos
    Do While oEnumeraDocumentos.hasMoreElements()                                            ' Mientras haya más elementos
    oDocumento = oEnumeraDocumentos.nextElement()                                            ' Vamos al siguiente
    If HasUnoInterfaces(oDocumento, "com.sun.star.frame.XModel") Then                        ' Si tiene modelo
    If left(oDocumento.getTitle(),28)="Mi plantilla ejemplarizante-" Then 
    oDocumento.close(True)
    End if
    End if
    Loop
También señalar que las observaciones que hago son de autodidacta. Vamos! que pueden ser totalmente erróneas, así que si se me ha escapado alguna burrada, solicito que se me corrija.
Bueno! Felices fiestas a todos los que las quieran celebrar!

Esperemos que funcione! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Guardar documento Writer desde Base

Mensaje por jopicach »

Hola,

Perdón por no haber contestado antes. Pude ver el mensaje pero no tenía equipo para probarlo.

¡¡¡Tu solución funciona perfectamente!!!. Ahora voy a trabajar para adaptar los detalles a mi trabajo, pero lo más importante y que no veía forma de conseguir lo has logrado. Puedo seguir con mi proyecto.

Muchas gracias de nuevo y...
Felices fiestas a todos los que las quieran celebrar! ;)
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Responder