crear un campo donde adjuntar un pdf o indicar ruta doc.

Discute sobre las herramientas de la base de datos
Responder
bingo
Mensajes: 2
Registrado: Jue Feb 28, 2019 9:41 am

crear un campo donde adjuntar un pdf o indicar ruta doc.

Mensaje por bingo »

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
libre office 5.4.03
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: crear un campo donde adjuntar un pdf o indicar ruta doc.

Mensaje por Longi »

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).

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
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:

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	
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:

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
bingo
Mensajes: 2
Registrado: Jue Feb 28, 2019 9:41 am

Re: crear un campo donde adjuntar un pdf o indicar ruta doc.

Mensaje por bingo »

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.
libre office 5.4.03
Responder