Buenos días,
estoy buscando la manera de crear un campo en el que pueda añadir un pdf para cada persona integrante de la bbdd o, al menos, cómo puedo añadir la ruta dónde está su documento escaneado. ¿Hay alguna manera de hacerlo con el asistente? Por más que lo busco en internet no me aparece nada.
gracias
crear un campo donde adjuntar un pdf o indicar ruta doc.
crear un campo donde adjuntar un pdf o indicar ruta doc.
libre office 5.4.03
Re: crear un campo donde adjuntar un pdf o indicar ruta doc.
Buenas!
Tengo una rutina que te sirve para esto, pero te la pongo tal cual la tengo desarrollada.
Hay que tener en cuenta que parto de un formulario con una serie de campos que van a determinar el nombre del documento y la ruta en la que se guarda. Estos campos tendrán que ser los de tu formulario (evidentemente)
También, que tengo una tabla con el nombre de varias carpetas, y que en función de la que tengo seleccionada, la ruta varía. Hice un ResultSet para sacar en un array los nombres de las carpetas, pero como tenía una sola seleccionada, no hacía falta tanta filigrana (sobran algunas líneas de código).
Pide el nombre con el que vas a guardar el documento, y tiene que ser de 5 ó más caracteres ( si no se pondrá pesada y no te dejará seguir)
En la base también tengo una tabla que llamo "DOCUMENTOS", en la que se graba la ruta de cada documento que guardo.
Es decir, que con un pdf en el escritorio (por ejemplo), podrás escogerlo, te pedirá que le des un nombre y te lo copiará en el destino que hayas configurado con los campos de referencia del formulario. Después podrás acceder a él si tienes un control de tabla (u otro cualquiera) que acceda a la ruta señalada.
También hay otra versión que en vez de copiarlo, directamente lo cambia de sitio, de tal modo que ya no estorba más en el escritorio.
Esta es la rutina (mira las explicaciones, seguro que te sirven de ayuda).
Un saludo!
(Añadido después)
Desde la línea " ' 3º Buscaremos el documento" hasta " Wend" te sobra si pones la ruta de la carpeta (por ejemplo CARPETA="C:\Users\yo\Desktop\EXPEDIENTES\EXPE")
El cálculo de número ampliado (marcado con un 2º) es una manera de presentar una numeración que me ofrece el formulario, de tal manera que queda con cinco dígitos siempre, y los registros son correlativos. Quizá esta parte tampoco la necesites.
Si en tu formulario para el acceso a los documentos tienes un control de tabla, como es mi caso, puedes poner en el evento de ratón soltado esta otra macro, que te abrirá el pdf deseado al picar en la fila en la que se encuentra la ruta de la tabla "Documentos" donde lo has guardado con la macro anterior:
En este caso dispongo de varios subformularios. Tú tendrás que ver la estructura que tienes.
Por último, la macro en la que el documento 'desaparece' de la localización en la que estaba, y lo pasa a la carpeta de archivos:
Tengo una rutina que te sirve para esto, pero te la pongo tal cual la tengo desarrollada.
Hay que tener en cuenta que parto de un formulario con una serie de campos que van a determinar el nombre del documento y la ruta en la que se guarda. Estos campos tendrán que ser los de tu formulario (evidentemente)
También, que tengo una tabla con el nombre de varias carpetas, y que en función de la que tengo seleccionada, la ruta varía. Hice un ResultSet para sacar en un array los nombres de las carpetas, pero como tenía una sola seleccionada, no hacía falta tanta filigrana (sobran algunas líneas de código).
Pide el nombre con el que vas a guardar el documento, y tiene que ser de 5 ó más caracteres ( si no se pondrá pesada y no te dejará seguir)
En la base también tengo una tabla que llamo "DOCUMENTOS", en la que se graba la ruta de cada documento que guardo.
Es decir, que con un pdf en el escritorio (por ejemplo), podrás escogerlo, te pedirá que le des un nombre y te lo copiará en el destino que hayas configurado con los campos de referencia del formulario. Después podrás acceder a él si tienes un control de tabla (u otro cualquiera) que acceda a la ruta señalada.
También hay otra versión que en vez de copiarlo, directamente lo cambia de sitio, de tal modo que ya no estorba más en el escritorio.
Esta es la rutina (mira las explicaciones, seguro que te sirven de ayuda).
Código: Seleccionar todo
Sub CopiarDoc(Evento As Object)
'------------------------------------------------------
' 0 Declaramos las variables
Dim oForm As Object, oSubForm As Object, IDEXPEDIENTE As Integer, ano As Integer, numeroampliado As Variant
Dim cif As String, oDialFP As Object, sURL As String, Documento As String, Nombre As String, NombreDocumento As Variant
Dim RutaDocumento As Variant, oCon As Variant, oStat As Variant, sSQL As Variant
'------------------------------------------------------
' 1º Elementos con los que vamos a trabajar
oForm = Evento.Source.Model.Parent ' El formulario activo
oSubForm = oForm.GetByName("CARPETA") ' Subformulario
IDEXPEDIENTE = oForm.GetByName("ID").BoundField.Int ' Número en el control ID
ano = oForm.GetByName("ANO").BoundField.Int ' Número en el control ANO
numero= oForm.GetByName("EXPTE Nº").BoundField.String ' Número del expediente
cif= oForm.GetByName("CIF_NIF").BoundField.String ' Texto en el campo CIF_NIF
'----------------------------------------------------------
' 2º Cálculo número ampliado
If LEN( numero ) = 1 Then ' Si solo tiene una cifra
numeroampliado = "0000" + ( numero ) ' Le añadimos cuatro ceros
End if ' Acabamos la condición
If LEN( numero ) = 2 Then ' si tiene dos cifras
numeroampliado = "000" + ( numero ) ' Le añadimos tres ceros
End if ' Acabamos la condición
If LEN( numero ) = 3 Then ' Si tiene tres cifras
numeroampliado = "00" + ( numero ) ' Le añadimos dos ceros
End if ' Acabamos la condición
If LEN( numero ) = 4 Then ' Si tiene cuatro cifras
numeroampliado = "0" + ( numero ) ' Le añadimos un cero
End if ' Acabamos la condición
If LEN( numero ) = 5 Then ' Si tiene cinco cifras
numeroampliado = numero ' No le añadimos ningún cero
End if ' Acabamos la condición
'---------------------------------------------------------
' 3º Buscaremos el documento
Conn = ThisDatabaseDocument.CurrentController.ActiveConnection ' Conectamos para recoger los datos de las tablas
oStat=Conn.createStatement() ' Creación de la conexión
oSQLQuery = "SELECT ""CARPETA"", ""Activo"" FROM ""CARPETAS"" WHERE ""Activo"" = TRUE" ' Consulta para encontrar el que va a firmar que está activo, según el formulario
oStat.setPropertyValue("ResultSetType",1005) ' Características de la consulta
oResultSet = oStat.executeQuery(oSQLQuery) ' Se ejecuta la consulta
oResultSet.last ' Va al último registro para contar los registros que tiene
oResultSet.first ' Mueve el cursor al primer registro
oResultSet.previous ' Mueve el cursor al anterior
'-----------------------------------------------------------------------
' 4º Establecemos un array que recoge todos los datos de la consulta
j = 0 ' Constante
While oResultSet.next ' Recorremos todos los datos del Resultset
Redim Preserve RowArray(j) ' Redimensionamos el array
RowArray(j) = oResultset.getString(1) ' Primer resultado del array
j = j+1 ' Pasa al siguiente resultado del array
'-------------------------------------------------------------------------
' 5º Copiamos los datos del array en los campos
CARPETA= oResultSet.getString(1) ' Valor que usamos para la variable 'CARPETA'
Wend ' Acabamos el ResultSet
'-----------------------------------------------------------------------
' 6º Iniciamos búsqueda de un documento
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
'-------------------------------------------------
' 10º Guardamos el documento
oCon = ThisDatabaseDocument.CurrentController.ActiveConnection ' Activamos la conexión
oStat = oCon.CreateStatement ' Creamos el Statement
sSQL ="INSERT INTO ""DOCUMENTOS"" (""ID EXPEDIENTE"",""DATA GENERACION"",""NOMBRE DOCUMENTO"",""RUTA DOCUMENTO"",""SEGUIMIENTO"",""GENERADO"")SELECT ""ID"", NOW() AS ""Data"", '"& NombreDocumento &"','"& RutaDocumento &"', '"& FALSE &"', '"& FALSE &"' FROM ""EXPEDIENTES"" WHERE ""ID""= "& IDEXPEDIENTE &""
oStat.ExecuteUpdate(sSQL) ' Ejecutamos el SQL
End if ' Acabamos con la condición del FilePicker
End if
End Sub
(Añadido después)
Desde la línea " ' 3º Buscaremos el documento" hasta " Wend" te sobra si pones la ruta de la carpeta (por ejemplo CARPETA="C:\Users\yo\Desktop\EXPEDIENTES\EXPE")
El cálculo de número ampliado (marcado con un 2º) es una manera de presentar una numeración que me ofrece el formulario, de tal manera que queda con cinco dígitos siempre, y los registros son correlativos. Quizá esta parte tampoco la necesites.
Si en tu formulario para el acceso a los documentos tienes un control de tabla, como es mi caso, puedes poner en el evento de ratón soltado esta otra macro, que te abrirá el pdf deseado al picar en la fila en la que se encuentra la ruta de la tabla "Documentos" donde lo has guardado con la macro anterior:
Código: Seleccionar todo
Sub sAbrirDoc(Evento As Object)
'----------------------------------------------------
' 0 Declaramos las variables
Dim oForm As Object, oSubForm1 As Object, sURL As String, mTmp() As Variant, sAbrir As Variant
Dim sRuta, oSubform2, oSubForm3, oSubForm4
'-------------------------------------------------------
' 1º Elementos con los que trabajar
On Error Goto Err_sAbreDoc ' Control de errores
oForm=ThisComponent.Drawpage.Forms.getByName("Formulario") ' El formulario activo
oSubForm1 = oForm.GetByName("DOCUMENTOS") ' Subformulario DOCUMENTOS
oSubForm2= oSubForm1.GetByName("TOTAL DOCUMENTOS") ' Subformulario TOTAL DOCUMENTOS
oSubForm3= oSubForm2.GetByName("TIPO DOCUMENTOS") ' Subformulario TIPO DOCUMENTOS
oSubForm4= oSubForm3.GetByName("DOCUMENTOS FINAL") ' Subformulaio Documentos Final
sURL = oSubForm4.Columns.GetByName("RUTA DOCUMENTO").GetString ' Recogemos la ruta del documento
'------------------------------------------------------
' 2º Control de errores
If Dir(sURL)="" Then ' Si la ruta no existe
MsgBox "Archivo no seleccionado" ' Aparece este mensaje
Exit Sub ' Y te echa de la macro
End If ' Acabamos la condición
'-----------------------------------------------------
' 3º Abrimos el documento en su ruta, en la carpeta en la que está guardado
mTmp = Split( sURL, "/" )
mTmp(UBound(mTmp)) = ""
sRuta = sURL ' Ruta del documento
sRuta = ConvertToURL(sRuta) ' Convertimos la ruta a URL
'sRuta="file///:" & sRuta
If FileExists(sRuta) Then ' Si el documento existe
sAbrir = CreateUnoService("com.sun.star.system.SystemShellExecute") ' Servicio para abrir el documento
sAbrir.execute( sRuta, "", 0) ' Abrimos el documento en su ruta
Else ' En caso de que no exista
MsgBox "No existe el archivo seleccionado" ' Mensaje que te crió
End If ' Acabamos la condición de si existe la ruta
Exit Sub ' Nos saca de la macro
Err_sAbreDoc:
MsgBox "Error al abrir el archivo: " & sURL
On Error Goto 0
End sub
Por último, la macro en la que el documento 'desaparece' de la localización en la que estaba, y lo pasa a la carpeta de archivos:
Código: Seleccionar todo
Sub sInsertarDoc(Evento As Object)
'------------------------------------------------------
' 0 Declaramos las variables
Dim oForm As Object, oSubForm As Object, IDEXPEDIENTE As Integer, ano As Integer, numeroampliado As Variant
Dim cif As String, oDialFP As Object, sURL As String, Documento As String, Nombre As String, NombreDocumento As Variant
Dim RutaDocumento As Variant, oCon As Variant, oStat As Variant, sSQL As Variant
'------------------------------------------------------
' 1º Elementos con los que vamos a trabajar
oForm = Evento.Source.Model.Parent ' El formulario activo
oSubForm = oForm.GetByName("CARPETA") ' Subformulario
IDEXPEDIENTE = oForm.GetByName("ID").BoundField.Int ' Número en el control ID
ano = oForm.GetByName("ANO").BoundField.Int ' Número en el control ANO
numero= oForm.GetByName("EXPTE Nº").BoundField.String ' Número del expediente
cif= oForm.GetByName("CIF_NIF").BoundField.String ' Texto en el campo CIF_NIF
If LEN( numero ) = 1 Then
numeroampliado = "0000" + ( numero )
End if
If LEN( numero ) = 2 Then
numeroampliado = "000" + ( numero )
End if
If LEN( numero ) = 3 Then
numeroampliado = "00" + ( numero )
End if
If LEN( numero ) = 4 Then
numeroampliado = "0" + ( numero )
End if
If LEN( numero ) = 5 Then
numeroampliado = numero
End if
'---------------------------------------------------------
' 2º Buscaremos el documento
Conn = ThisDatabaseDocument.CurrentController.ActiveConnection ' Conectamos para recoger los datos de las tablas
oStat=Conn.createStatement() ' Creación de la conexión
oSQLQuery = "SELECT ""CARPETA"", ""Activo"" FROM ""CARPETAS"" WHERE ""Activo"" = TRUE" 'ORDER BY ""CARPETA"" ASC" ' Consulta para encontrar el que va a firmar que está activo, según el formulario
oStat.setPropertyValue("ResultSetType",1005) ' Características de la consulta
oResultSet = oStat.executeQuery(oSQLQuery) ' Se ejecuta la consulta
oResultSet.last ' Va al último registro para contar los registros que tiene
oResultSet.first ' Mueve el cursor al primer registro
oResultSet.previous
'-----------------------------------------------------------------------
' 2º Establecemos un array que recoge todos los datos de la consulta
j = 0 ' Constante
While oResultSet.next ' Recorremos todos los datos del Resultset
Redim Preserve RowArray(j) ' Redimensionamos el array
RowArray(j) = oResultset.getString(1) ' Primer resultado del array
j = j+1 ' Pasa al siguiente resultado del array
'-------------------------------------------------------------------------
' 3º Copiamos los datos del array en los campos
CARPETA= oResultSet.getString(1) ' Dato a su control
Wend ' Acabamos el ResultSet
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
NombreDocumento= ano &"-" & numeroampliado & "-" & Nombre & ".pdf" ' 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
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
'------------------------------------------------------
' 3º 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
Name (Documento) As (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
Name (Documento) As (RutaDocumento) ' Renombramos el documento para guardarlo
'-------------------------------------------------
' 4º Guardamos el documento
oCon = ThisDatabaseDocument.CurrentController.ActiveConnection ' Activamos la conexión
oStat = oCon.CreateStatement ' Creamos el Statement
sSQL ="INSERT INTO ""DOCUMENTOS"" (""ID EXPEDIENTE"",""DATA GENERACION"",""NOMBRE DOCUMENTO"",""RUTA DOCUMENTO"",""SEGUIMIENTO"",""GENERADO"")SELECT ""ID"", NOW() AS ""Data"", '"& NombreDocumento &"','"& RutaDocumento &"', '"& FALSE &"', '"& FALSE &"' FROM ""EXPEDIENTES"" WHERE ""ID""= "& IDEXPEDIENTE &""
oStat.ExecuteUpdate(sSQL) ' Ejecutamos el SQL
End if ' Acabamos con la condición del FilePicker
End Sub
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: crear un campo donde adjuntar un pdf o indicar ruta doc.
Muchas gracias por tu respuesta y por la rapidez. Lo cierto es que es exhaustiva, el problema es que esperaba algo mucho más sencillo ya que no tengo idea del lenguaje. No obstante, ahora mismo me pongo a estudiarlo e intentaré ver si logro hacer algo mínimamente útil y te cuento cómo ha ido.
Gracias de nuevo.
Gracias de nuevo.
libre office 5.4.03