** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Valor predeterminado tabla vinculada
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoValor predeterminado tabla vinculada

 Responder Responder Página  123 4>
Autor
Mensaje
Nomada Ver desplegable
Colaborador
Colaborador


Unido: 03/Julio/2011
Localización: España
Estado: Sin conexión
Puntos: 1198
Enlace directo a este mensaje Tema: Valor predeterminado tabla vinculada
    Enviado: 10/Enero/2019 a las 16:54
Buenas.
Tengo una tabla vinculada de nombre T_Actuaciones con un campo NumActuaciones. Tengo un valor, en la propiedad "Valor predeterminado" de este campo. Cada año este valor cambia, con lo cual quisiera desde la aplicación poder realizar el cambio. Para ello tengo el siguiente código, pero me dice que no funciona con tablas vinculadas:

CurrentDb.TableDefs("T_Actuaciones").Fields("NumActuaciones").DefaultValue = Me.vNumActuaciones

el campo vNumActuaciones es un campo independiente donde escribo el nuevo valor.

Cómo puedo corregirlo?
Gracias.


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 996
Enlace directo a este mensaje Enviado: 10/Enero/2019 a las 18:31
Tienes que hacerlo en la base de datos donde está realmente la tabla. En la tabla vinculada tienes 2 propiedades, Connect y SourceTableName, que te dirán cómo conectar a la base de datos y el nombre real de la tabla. A partir de ahí, lo que estás haciendo pero con la base de datos externa:

- https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/tabledef-connect-property-dao

- https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/tabledef-sourcetablename-property-dao
Arriba
Nomada Ver desplegable
Colaborador
Colaborador


Unido: 03/Julio/2011
Localización: España
Estado: Sin conexión
Puntos: 1198
Enlace directo a este mensaje Enviado: 14/Enero/2019 a las 14:02
Gracias.
Lo primero decir que uso Access 2010.
Ahora bien, he adaptado el código a mis necesidades para hacer una prueba. En mi caso, que conozco la dirección, tabla y base de datos, el código, que ejecuto a través de un botón de comando, sería el siguiente:

Private Sub Comando1_Click()
ConnectX
End Sub

Sub ConnectX()
  Dim dbsTemp As Database

 Set dbsTemp = OpenDatabase("PruebaDB_be.accdb")
 ConnectOutput dbsTemp, _
 "Tabla1",  _
 "DATABASE=D:\PRUEBA\PruebaDB_be.accdb", "Tabla1"
 dbsTemp.Close
End Sub

En este  procedimiento me da el error, señalando en amarillo la declaración de la variable dbsTemp: 
"Error de compilación: Se esperaba un tipo definido por el usuario, no un proyecto"

A continuación, como dice en la web, "para que este procedimiento se ejecute se necesita el procedimiento ConnectOutput". Este procedimiento de momento lo he escrito sin modificar nada, pues me vale con que me enseñe los 3 primeros registros de la tabla vinculada.

Por qué da ese error? Alguna sugerencia?

Pda. El método ConnectOutput aparece con 4 parámetros y con la siguiente sintaxis:
dbsTemp As Database, strTable As String, strConnect As String, strSourceTable As String)

A qué se refiere exactamente el segundo y cuarto parámetro (strTable, strSourceTable)?

Gracias y saludos





Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 14/Enero/2019 a las 16:55
Quieres cambiar el valor del dato predeterminado o modificar un valor del campo de la tabla??

Si es lo primero ni idea como se hace, pero seguro que se podra.

Y como metes los datos en la tabla?? Mediante formulario??
Arriba
Nomada Ver desplegable
Colaborador
Colaborador


Unido: 03/Julio/2011
Localización: España
Estado: Sin conexión
Puntos: 1198
Enlace directo a este mensaje Enviado: 14/Enero/2019 a las 17:40
Como dije arriba "El valor predeterminado".
Las dos últimas preguntas no las entiendo, perdona podrías aclararlas un poco?

Saludos.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 996
Enlace directo a este mensaje Enviado: 14/Enero/2019 a las 18:24
Para el error de compilación: Por ahí tienes algo declarado como Database, y VBA se hace un lío (por ejemplo, puede ser que tu versión de Access esté en inglés, y tu base de datos de prueba se llame Database). Para evitar el error, especifica que el objeto Database está en la librería DAO:

Dim dbsTemp As DAO.Database

Para el código de ejemplo de la Web: es sólo eso, un ejemplo. Y lo que hace esa función ConnectOutput es crear una tabla vinculada, después listar los registros mediante el acceso a la tabla vinculada, y por último, eliminar el vínculo. Es solamente para que veas cómo funcionan las 2 propiedades de la tabla que necesitas.

Prueba con algo así:

'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- TablaVinculada: Nombre que le hemos dado a la tabla vinculada en la base de datos activa
'- Campo: Nombre del campo que queremos modificar
'- Valor: Nuevo valor predeterminado
Function ActualizarPropiedad(TablaVinculada As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strRutaBD As String
    Dim strTablaOriginal As String
   
    'Recuperamos las propiedades de la tabla vinculada:
    ' - Cadena de conexión a la base de datos
    strRutaBD = CurrentDb.TableDefs(TablaVinculada).Connect
    ' - Nombre real de la tabla vinculada
    strTablaOriginal = CurrentDb.TableDefs(TablaVinculada).SourceTableName
   
    'A la cadena de conexión, le quitamos la primera parte:
    ';DATABASE=
    'OJO: Estoy suponiendo que la base de datos es MS Access. Para otros tipos, hay que
    'mantener la cadena de conexión.
    strRutaBD = Mid(strRutaBD, 11)
   
    'Abrimos la base de datos
    Set dbs = OpenDatabase(strRutaBD)
   
    With dbs
        'Modificamos el valor por defecto
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
   
    'Limpiamos memoria
    Set dbs = Nothing
End Function
Arriba
Nomada Ver desplegable
Colaborador
Colaborador


Unido: 03/Julio/2011
Localización: España
Estado: Sin conexión
Puntos: 1198
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 10:41
Gracias por la paciencia.
El código que me has pasado lo he modificado de la siguiente forma:
El valor por defecto del campo PAIS es "ESPAÑA", y lo quiero cambiar a "FRANCIA"

Function ActualizarPropiedad(strTablaOriginal As String, PAIS As String, Valor)
    Dim dbs As DAO.Database
    Dim strRutaBD As String
    Dim strTablaOriginal As String
   
    strRutaBD = CurrentDb.TableDefs(";DATABASE=D:\PRUEBA\PruebaDB_be.accdb").Connect
    strTablaOriginal = CurrentDb.TableDefs(Tabla1).SourceTableName
   
    strRutaBD = Mid(strRutaBD, 11)
    Set dbs = OpenDatabase(strRutaBD)
   
    With dbs
         .TableDefs(strTablaOriginal).Fields(PAIS).DefaultValue = "FRANCIA"
         .Close
    End With
   
    Set dbs = Nothing
End Function

Ahora al hacer clic desde un botón de comando para llamar a la función. Código:
Private Sub Comando1_Click()
Call ActualizarPropiedad(strTablaOriginal, PAIS, Valor)
End Sub

Me marca el primer parámetro de la llamada "strTablaOriginal", apareciendo el error:
"Error de compilación: El tipo de argumento de ByRef no coincide"

Estoy muy verde en cuanto al funcionamiento de los argumentos.
Cual es el fallo?
Saludos.

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 996
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 15:51
Cuando se crea una función con argumentos, a cada argumento hay que pasarle el valor que se desea que use; o una variable que contenga los datos/valores que se desea que use la función para que haga lo que queremos.

Por ejemplo, el método DoCmd.OpenReport tiene una serie de argumentos: nosotros le pasamos el nombre del informe para que lo abra; no tenemos que "crear" una función distinta para poder abrir cada informe que tengamos en la base de datos.

Con las funciones que creamos pasa lo mismo: podemos hacer que usen los valores que les pasamos en cada llamada, para no tener que crear una función similar para cada momento. La función que te pasé necesita 3 argumentos:

- El nombre que le hemos dado a la tabla vinculada que queremos modificar.
- El nombre del campo de la tabla, al que queremos modificar el valor predeterminado.
- El nuevo valor para la propiedad valor predeterminado.

Al modificar la función y darle valores fijos, sólo te servirá para dar el valor predeterminado "FRANCIA". Si dentro de 2 años quieres cambiarlo a "ALEMANIA", tendrás que modificar la función.

En cambio, con la mía, ahora la puedes llamar así:

Call ActualizarPropiedad("Tabla1", "PAIS", "Francia")

Y dentro de 2 años:

Call ActualizarPropiedad("Tabla1", "PAIS", "Alemania")

Y no necesitarás revisar cómo funcionaba internamente la función para ajustarla a tus necesidades.

O si usamos los datos de tu primer mensaje:

Call ActualizarPropiedad("T_Actuaciones", "NumActuaciones", Me.vNumActuaciones)

Más sencillo que tener que modificar la función para que tome los datos nuevos.

P.D.: Fíjate que "T_Actuaciones" y "NumActuaciones" son valores entrecomillados: le estamos dando directamente los nombres de la tabla y el campo. Para el valor, le estamos diciendo que tome lo que esté escrito en el control vNumActuaciones del formulario donde está la llamada a la función.
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 16:19
Muy interesante, lo he probado y va perfecto.ClapClap
Lo voy a aplicar, hasta ahora en una base de datos que tengo pillaba los datos desde una tabla para poder cambiarlos cuando quisiera, pero eso implica una llamada a tabla cada vez que se crea un registro, de esta forma te ahorras la llamada a tabla y lo cambias cuando quieres.


Editado por rokoko - 15/Enero/2019 a las 16:19
Arriba
Nomada Ver desplegable
Colaborador
Colaborador


Unido: 03/Julio/2011
Localización: España
Estado: Sin conexión
Puntos: 1198
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 16:56
El fichero vinculado de la tabla está ubicado en "D:\PRUEBA", se llama "PruebaDB_be.accdb" y el nombre de la tabla es "Tabla1".

Desde el campo independiente (vPAIS) del formulario introduzco el valor predeterminado que deseo, en mi caso "FRANCIA".

El código de llamada a la función sería?: Call ActualizarPropiedad("Tabla1", "PAIS", Me.vPAIS)

Y el código de la función sería:
Function ActualizarPropiedad(TablaVinculada As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strRutaBD As String
    Dim strTablaOriginal As String
   
    strRutaBD = CurrentDb.TableDefs(";DATABASE=D:\PRUEBA\PruebaDB_be.accdb",  "Tabla1").Connect
    strTablaOriginal = CurrentDb.TableDefs("Tabla1").SourceTableName
    TablaVinculada = strTablaOriginal
    Campo = "PAIS"
    Valor = Me.vPAIS
   
    strRutaBD = Mid(strRutaBD, 11)
   
    Set dbs = OpenDatabase(strRutaBD)
   
    With dbs
        .TableDefs(strTablaOriginal).Fields(PAIS).DefaultValue = Valor
        .Close
    End With
  
    Set dbs = Nothing
End Function

Creo que hasta aquí, tanto el código de llamada a la función como el de la propia función están bien.
Pero en la quinta línea de la función (strRutaBD = CurrentDb.TableDefs…) me da el error:

"Error de compilación: El número de argumentos es incorrecto o la asignación de propiedad no es válida"
señalando los caracteres .TableDefs
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 18:06
Asi
ActualizarPropiedad "Tabla1", "PAIS", Me.vPAIS
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 19:09
Y como seria si quieres modificarlo, pero de una base de datos externa, no tienes tablas vinculadas??
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 22:51
Estoy probando a modificar el valor predeterminado de una tabla externa.

Vinculo la tabla, esta base datos tiene contraseña. La vinculo sin problemas. Despues de cambiar el valor predeterminado la borro sin problemas tambien.

El codigo de pitxiku funciona perfectamete si la base de datos no tiene contraseña, pero si tiene da error.
El error lo da aqui
Set dbs = OpenDatabase(strRutaBD)
No se porque la verdad, la tabla ya esta vinculada....

Saludos
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 11858
Enlace directo a este mensaje Enviado: 15/Enero/2019 a las 23:17
Que la tabla esté vinculada no tiene nada que ver con que se quiera abrir una base de datos con contraseña...

Para lo que pretendes creo que necesitas investigar el resto de parámetros de OpenDatabase:

Set dbs = OpenDatabase(strRutaBD,,,";pwd=hola")
Xavi, un minyó de Terrassa

Mi web
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1981
Enlace directo a este mensaje Enviado: 16/Enero/2019 a las 00:12
Hola Xavi, ya lo habia probado tal como dices, el error que me suelta es  "No es un nombre de archivo valido" error 3055.
Saludos

Arriba
 Responder Responder Página  123 4>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable