[RESUELTO] Abrir y guardar con cuadro de diálogo y ruta

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] Abrir y guardar con cuadro de diálogo y ruta

Mensaje por jopicach »

Hola,

He estado mirando en el libro de Mauricio porque quiero que al abrir un cuadro de diálogo para abrir o guardar un documento se abra ya en una ruta preestablecida, por ejemplo "D:\Documentos\varios", pero no he encontrado nada al respecto. La macro sería la que pongo abajo pero con alguna modificación que le asigne la ruta.

En este enlace preguntaron lo mismo y la solución final es la que ahora estoy utilizando, pero no se le dio la solución a la pregunta inicial que es la que he expuesto.
https://forum.openoffice.org/es/forum/v ... ker#p48787


Sub AbrirArchivo1()
Dim oDlgAbrirArchivo as Object
Dim mArchivo() As String
Dim mOpciones()
Dim sRuta As String
Dim oDoc As Object

'Creamos el servicio necesario
oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
'Establecemos el titulo del cuadro de dialogo
oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgAbrirArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgAbrirArchivo.getFiles()
'El primer elemento de la matriz es el archivo seleccionado
sRuta = mArchivo(0)
'Y lo abrimos
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If

End Sub


Un saludo.
Última edición por jopicach el Lun Ene 22, 2018 8:19 pm, editado 2 veces 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: Apertura de cuadro de diálogo con ruta preestablecida

Mensaje por Longi »

Hola!

En una de mis búsquedas encontré en un post en inglés (empezad a temblar, voy a interpretar una 'traducción' - también podeis substituir interpretar por intentar-) que el "com.sun.star.ui.dialogs.FilePicker" debió tener una regresión, y la utilidad que quieres no es posible, por ahora.
Sin embargo, si usas en su lugar "com.sun.star.ui.dialogs.OfficeFilePicker" si que te funcionará. Como verás, estéticamente es 'ligeramente' diferente, y quizá no te guste, pero funciona perfectamente:

Código: Seleccionar todo

Sub AbrirArchivo1()
Dim oDlgAbrirArchivo as Object
Dim mArchivo() As String
Dim mOpciones()
Dim sRuta As String
Dim oDoc As Object

'Creamos el servicio necesario
oDlgAbrirArchivo=CreateUnoService ("com.sun.star.ui.dialogs.OfficeFilePicker") ' Servicio propuesto
'oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")       ' Servicio anterior (el que no funciona)
'Establecemos el titulo del cuadro de dialogo
oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
oDlgAbrirArchivo.setDisplayDirectory(ConvertToURL("C:\Users\........\......"))   ' Tu ruta
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgAbrirArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgAbrirArchivo.getFiles()
'El primer elemento de la matriz es el archivo seleccionado
sRuta = mArchivo(0)
'Y lo abrimos
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If

End Sub
Prueba a ver si te funciona.
Otro saludo! :o
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: Apertura de cuadro de diálogo con ruta preestablecida

Mensaje por jopicach »

Hola,

Muchas gracias y perdón por no poder haber contestado antes. He probado tu solución y funciona perfectamente y además me gusta como queda. Solo me queda una duda, ¿se puede adaptar también para guardar un documento?. Lo he intentado pero llego hasta donde pongo.

Sub GuardarArchivo1(event As Object)

Dim oDlgGuardarArchivo as Object
Dim mDlgOpciones()
Dim mArchivo() As String
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
Dim sRuta As String
Dim oDoc As Object

Dim form As Object

Dim sRutaDili As String
Dim mArg()
Dim oDocumento As Object
Dim ruta As String

oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaCarpetasOmega"" FROM tblRutaCarpetasOmega"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next

RutaOmega = oRes.getString(1)

'Referencia al formulario
form = event.Source.Model.Parent

sDili = form.Columns.getByName("Dili").getString 'Recupera el valor del campo
sYearDili = form.Columns.getByName("YearDili").getString 'Recupera el valor del campo
sRutaDili = RutaOmega 'Ruta fija

ruta = sRutaDili & "\" & "20" & sYearDili & "\" & sDili & "-" & sYearDili

'Creamos el servicio necesario
oDlgGuardarArchivo=CreateUnoService ("com.sun.star.ui.dialogs.OfficeFilePicker") ' Servicio propuesto
'oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker") ' Servicio anterior (el que no funciona)
'Establecemos el titulo del cuadro de dialogo

mDlgOpciones() = Array(2)
With oDlgGuardarArchivo
'Iniciamos el cuadro de dialogo con las opciones seleccionadas
.Initialize ( mDlgOpciones() )
'Agregamos filtros de archivos
' .AppendFilter( "All files (*.*)", "*.*" )
.AppendFilter( "Documento de Texto ODF (.odt)", "*.odt" )
' .AppendFilter( "Hoja de calculo ODF (.ods)", "*.ods" )
End With

oDlgGuardarArchivo.setTitle("Guardar archivo")
oDlgGuardarArchivo.setDisplayDirectory(ConvertToURL(ruta)) ' Tu ruta

'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgGuardarArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgGuardarArchivo.getFiles()
sRuta = mArchivo(0)

'De aquí no paso para guardarlo
oDoc.storeAsURL( ruta, "_blank", 0, mDlgOpciones() )

MsgBox ConvertFromUrl( mArchivo(0) )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If

End Sub



Un saludo.
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: Apertura de cuadro de diálogo con ruta preestablecida

Mensaje por Longi »

Dos opciones:

Aquí te pongo el código desde la línea tuya que empieza con "oDLgGuardarArchivo.Execute". La última línea renombra al documento, con la nueva ruta, por lo que desaparece de donde estaba (por ejemplo el escritorio), y se guarda en la ruta que se propone en el código.

Código: Seleccionar todo

If oDlgGuardarArchivo.Execute Then                                                                     ' Si se ejecuta el FilePicker
	Nombre = InputBox("¿Con qué nombre guardamos el documento?")                                ' Pregunta por el nombre con el que queremos guardar el documento
	NombreDocumento= NombreDelDocumentoSinExtensión &".pdf"                        ' Nombre completo que tendrá el documento
	RutaDocumento = ConvertToURL(RutaDelDocumento & NombreDocumento)        ' Ruta completa del documento
	Documento=ConvertFromURL(oDialFP.Files(0))                                                  ' Convertimos la ruta a URL
    Dim args(1) as new com.sun.star.beans.PropertyValue                                         ' Array de valores
    Dim FilterArg(0) as new com.sun.star.beans.PropertyValue                                    ' Array de filtro
     Name (Documento) As (RutaDocumento)                                                             ' Se guarda el archivo con la nueva ruta (desaparece de dónde estaba antes)
Aquí te dejo parte del código que uso yo cuando lo que quiero es mantener el archivo y guardar una copia del mismo (usa la función FileCopy). Las rutas y los nombres, así como la opción de poner nombre, etc son cosas que uso yo. Tú debes ponerlo a tu gusto, incluso cambiando el filepicker por el indicado en la respuesta anterior.

Código: Seleccionar todo

	oDialFP=CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")                             ' Creamos el servicio FilePicker
	oDialFP.Title="Elija un documento"                                                          ' Título del cuadro de diálogo
	If oDialFP.Execute Then                                                                     ' Si se ejecuta el FilePicker
    Nombre = InputBox("¿Con qué nombre guardamos el documento?")                                ' Pregunta por el nombre con el que queremos guardar el documento
    '------------------------------------------------------------------
    ' 7º Precisamos una longitud superior a cuatro caracteres para grabar el documento con un nombre
    
	if len(Nombre)<5 Then                                                                       ' En caso de que tenga menos de 5 caracteres
    do                                                                                          ' Inicia un bucle
	msgbox "El nombre debe tener más de cuatro caracteres, No se guardará nada"                 ' Nos avisa de que no lo guardará
    RespuestaLongitud=1                                                                         ' Variable arbitraria
	Nombre = InputBox("¿Con qué nombre guardamos el documento?")                                ' Pregunta por el nombre con el que queremos guardar el documento
    if len(Nombre)<5 Then                                                                       ' Si la longitid del nuevo nombre sigue siendo menor de 5 caracteres
    RespuestaLongitud=1                                                                         ' La variable sigue siendo 1
    Else                                                                                        ' En caso de que tenga más caracteres
    RespuestaLongitud=2                                                                         ' Cambiamos el valor de la variable a 2
    End if                                                                                      ' Acabamos la condición de que tenga menos de cinco caracteres
    Loop While RespuestaLongitud = 1                                                            ' Hace el bucle mientras la variable no cambie de valor
	End if                                                                                      ' Acabamos la primera condición de que tenga menos de cinco caracteres
	'------------------------------------------------------------------
	' 8º Si conseguimos que el nombre tenga más de 4 caracteres (5 ó más)
	
    if len(Nombre)>4 then                                                                       ' Si tiene más de 4 caracteres
    RespuestaLongitud=2                                                                         ' La variable tiene valor=2
	NombreDocumento= ano &"-" & numeroampliado & "-" & Nombre & "." &  Right (oDialFP.Files(0),3)' Nombre completo que tendrá el documento
	RutaDocumento = ConvertToURL(CARPETA &"\" & ano & "\" & ano &"-" & numeroampliado & "\DOCUMENTOS APORTADOS\" & NombreDocumento)' Ruta del documento
	Documento=ConvertFromURL(oDialFP.Files(0))                                                  ' Convertimos la ruta a URL
    '------------------------------------------------------
    ' 9º Control de existencia del documento

    If FileExists(RutaDocumento) Then                                                           ' Si el documento existe
    Respuesta=msgbox ("El documento ya existe" & Chr(13) & "¿quiere sobreescribirlo?",36,"¡AVISO IMPORTANTE!")' Aviso en pantalla
    if Respuesta=7 Then                                                                         ' Si se contesta que no
    Exit Sub                                                                                    ' Salimos de la macro
    End if                                                                                      ' Acabamos la condición
    If Respuesta=6 Then                                                                         ' Si se contesta que si
    Kill (RutaDocumento)                                                                        ' Eliminamos el documento
    FilecopY(Documento,RutaDocumento)                                                           ' Recogemos el documento y lo renombramos, dejándolo bien guardadito
    Exit Sub                                                                                    ' Salimos de la macro
    End if                                                                                      ' Acabamos la condición de respuesta positiva
    End if                                                                                      ' Acabamos la condición de si el documento existe
    FilecopY(Documento,RutaDocumento)                                                           ' Renombramos el documento para guardarlo
Espero que no tengas problemas para adaptarlo.
De todos modos recordar que esto es un tema que debiera ir en un hilo diferente, porque aunque tenga que ver con el anterior, al final es diferente, y es más fácil de encontrar si cada cosa va etiquetada con el nombre que le corresponde.

Otro saludo! :super:
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: Apertura de cuadro de diálogo con ruta preestablecida

Mensaje por jopicach »

Hola de nuevo,

Con las dos opciones que propones puedo adaptarlo a mi proyecto. Creo que voy a modificar el asunto a apertura y guardado por si alguien realiza una búsqueda pueda encontrarlo.

Un saludo y muchas gracias. :super:
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Responder