|
Responder ![]() |
Página 123 4> |
Autor | ||
Nomada ![]() Colaborador ![]() Unido: 03/Julio/2011 Localización: España Estado: Sin conexión Puntos: 1638 |
![]() 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. |
||
![]() |
||
pitxiku ![]() Colaborador ![]() ![]() Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1276 |
![]() |
|
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
|
||
![]() |
||
Nomada ![]() Colaborador ![]() Unido: 03/Julio/2011 Localización: España Estado: Sin conexión Puntos: 1638 |
![]() |
|
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 |
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
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?? |
||
![]() |
||
Nomada ![]() Colaborador ![]() Unido: 03/Julio/2011 Localización: España Estado: Sin conexión Puntos: 1638 |
![]() |
|
Como dije arriba "El valor predeterminado". Las dos últimas preguntas no las entiendo, perdona podrías aclararlas un poco? Saludos.
|
||
![]() |
||
pitxiku ![]() Colaborador ![]() ![]() Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1276 |
![]() |
|
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:
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í:
|
||
![]() |
||
Nomada ![]() Colaborador ![]() Unido: 03/Julio/2011 Localización: España Estado: Sin conexión Puntos: 1638 |
![]() |
|
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. |
||
![]() |
||
pitxiku ![]() Colaborador ![]() ![]() Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1276 |
![]() |
|
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. |
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
Muy interesante, lo he probado y va perfecto. ![]() ![]() 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 |
||
![]() |
||
Nomada ![]() Colaborador ![]() Unido: 03/Julio/2011 Localización: España Estado: Sin conexión Puntos: 1638 |
![]() |
|
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
|
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
Asi ActualizarPropiedad "Tabla1", "PAIS", Me.vPAIS
|
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
Y como seria si quieres modificarlo, pero de una base de datos externa, no tienes tablas vinculadas??
|
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
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
|
||
![]() |
||
xavi ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador ![]() ![]() Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 13832 |
![]() |
|
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: |
||
![]() |
||
rokoko ![]() Colaborador ![]() ![]() Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 2840 |
![]() |
|
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 |
||
![]() |
Responder ![]() |
Página 123 4> |
Tweet
|
Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |