Imprimir página | Cerrar ventana

Valor predeterminado tabla vinculada

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84216
Fecha de impresión: 26/Mayo/2019 a las 09:06


Tema: Valor predeterminado tabla vinculada
Publicado por: Nomada
Asunto: Valor predeterminado tabla vinculada
Fecha de publicación: 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.





Respuestas:
Publicado por: pitxiku
Fecha de publicación: 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


Publicado por: Nomada
Fecha de publicación: 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







Publicado por: rokoko
Fecha de publicación: 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??


Publicado por: Nomada
Fecha de publicación: 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.


Publicado por: pitxiku
Fecha de publicación: 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


Publicado por: Nomada
Fecha de publicación: 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.



Publicado por: pitxiku
Fecha de publicación: 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.


Publicado por: rokoko
Fecha de publicación: 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.


Publicado por: Nomada
Fecha de publicación: 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


Publicado por: rokoko
Fecha de publicación: 15/Enero/2019 a las 18:06
Asi
ActualizarPropiedad "Tabla1", "PAIS", Me.vPAIS


Publicado por: rokoko
Fecha de publicación: 15/Enero/2019 a las 19:09
Y como seria si quieres modificarlo, pero de una base de datos externa, no tienes tablas vinculadas??


Publicado por: rokoko
Fecha de publicación: 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


Publicado por: xavi
Fecha de publicación: 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

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: rokoko
Fecha de publicación: 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



Publicado por: Nomada
Fecha de publicación: 16/Enero/2019 a las 08:42
Gracias a todos.
Por partes:
Rokoko la tercera línea de mi post creo que pone lo mismo que me has contestado en uno de tus post. En la función después de la declaración de variables, está la referencia a la ruta de la base de datos y la tabla.

Y ahora mi problema. De momento sigo con la base de datos de Prueba:
La ruta de la base de datos, dígase la tabla (Back-End) es D:\PRUEBA\PruebaDB_be.accdb. No tiene contraseña, y sólamente posee una tabla (Tabla1), que es la que está vinculada en la aplicación (Front-End), de nombre D:\PRUEBA\Prueba.accdb

Dos preguntas:
- Teniendo en cuenta el nombre de la tabla (Tabla1), el nombre del campo (PAIS) y Valor, que es el dato que deseo cambiar como Valor predeterminado dependiendo de lo escrito en el campo independiente Me.vPAIS. ¿La llamada a la función está bien escrita?:
Call ActualizarPropiedad("Tabla1", "PAIS", Me.vPAIS)

- Respecto de esta llamada, ¿es correcta esta línea?. El resto del código de la funcíon sería el mismo que está en mi anterior post:
Function ActualizarPropiedad(TablaVinculada As String, Campo As String, Valor)

Perdón, pero creo que el problema se está enredando y por eso quiero ir por partes.
Saludos y de nuevo gracias a todos.


Publicado por: Nomada
Fecha de publicación: 16/Enero/2019 a las 10:09
Hola de nuevo
Como no tengo paciencia, he investigado en Internet y con el siguiente código, parece que reconoce la tabla (Tabla1) y también la conexión a la ruta de la BD (que me la da como verdadera). Ahora el problema es como abrir la BD.
El código escrito es:
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("Tabla1").Connect = ";DATABASE=D:\PRUEBA\PruebaDB_be.accdb"
    strTablaOriginal = CurrentDb.TableDefs("Tabla1").SourceTableName
   
    TablaVinculada = strTablaOriginal
    Me.vRuta = strRutaBD  'para comprobar que reconoce la ruta
    Me.vTabla = strTablaOriginal 'para comprobar que reconoce la tabla  
   
    Campo = "PAIS"
    Valor = Me.vPAIS
   
    strRutaBD = Mid(strRutaBD, 11)
   
    'Al abrir la base de datos, me abre una ventana "Seleccionar origen de datos" y al cancelar me marca como error la siguiente línea. 
    Set dbs = OpenDatabase(strRutaBD)
   'Lo entiendo, pero ¿cómo le digo, en la línea anterior a la apertura, que el valor de la variable strRutaBD es D:\PRUEBA\PruebaDB_be.accdb?
    With dbs
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        .Close
    End With
   
    Set dbs = Nothing
  
End Function

Saludos.


Publicado por: rokoko
Fecha de publicación: 16/Enero/2019 a las 11:31
El codigo de pikitxu a mi me funcina bien!! Algo estaras haciendo mal. Mas arriba te puse como se le hacia la llamada, miralo a ver, es raro...
ActualizarPropiedad "NombreTablaVinculada", "NombreCampoTabla", Me.NombreCampoFormulario

Si lo pones directamente en codigo el nultimo parametro entrecomillado"Francia" o una variable sin entrecomillar


Publicado por: Nomada
Fecha de publicación: 16/Enero/2019 a las 11:50
Lo dicho, con mi impaciencia sigo investigando y claro está, dando directamente el valor a la variable strRutaBD, salto la línea que da el error.

Pero ahora, sigue ejecutando el código y me da el error
"3422 en tiempo de ejecución. No se puede modificar la estructura de la tabla. Otro usuario tiene la tabla abierta"

Mi pregunta es, si continúa con el código de pitxiku, ¿por qué da este error?
Saludos


Publicado por: pitxiku
Fecha de publicación: 16/Enero/2019 a las 17:02
La respuesta es sencilla: porque no continuas con el mismo código. La función trabaja perfectamente sin modificaciones (a no ser que la base de datos tenga contraseña). Al pasarle el nombre de la tabla vinculada, toma los 2 datos de las propiedades de esa tabla vinculada (ruta de la base de datos y nombre de la tabla original), y los usa para acceder a la tabla original.

Repito: no hay que modificar nada de la función. Sólo la llamada. Toma mi función, cópiala y pégala sobre tu modificación, y luego llámala tal que así:

Call ActualizarPropiedad("Tabla1", "PAIS", Me.vPAIS)

En la última modificación que has subido, tienes esta línea:

strRutaBD = CurrentDb.TableDefs("Tabla1").Connect = ";DATABASE=D:\PRUEBA\PruebaDB_be.accdb"

Al haber 2 iguales, estás diciendo:

Asigna a la variable strRutaBD el resultado de comparar el valor que hay en CurrentDb.TableDefs("Tabla1").Connect, con el literal de texto ";DATABASE=D:\PRUEBA\PruebaDB_be.accdb". Con lo que tendrá Verdadero o Falso, no la cadena de conexión.


Publicado por: pitxiku
Fecha de publicación: 16/Enero/2019 a las 17:47
Publicado originalmente por rokoko rokoko escribió:

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
 

El problema es que usaba la conexión en la primera parte del OpenDatabase. Y como ahí sólo espera un nombre y ruta de archivo, y tú tienes la contraseña... pues archivo no encontrado.

Pero si usamos la cadena de conexión de la tabla vinculada en el último argumento del OpenDatabase, no necesitamos recortar nada, y sirve para bases de datos con o sin contraseña:

'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strTablaOriginal As String
   
    'Recuperamso el nombre de la tabla original
    strTablaOriginal = CurrentDb.TableDefs(Tabla).SourceTableName
   
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)
   
    With dbs
        'Modificamos el valor por defecto
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
   
    Set dbs = Nothing
End Function


Publicado por: rokoko
Fecha de publicación: 16/Enero/2019 a las 18:30
Perfecto!!Thumbs UpClap Ya me gustaria tener este nivel, poco a poco voy aprendiendo...

Un ejemplo, con diferentes tipos de datos a modificar. Copiar la carpeta en C una vez descomprimida y no habra que volver a vincular la tabla.

https://www.dropbox.com/s/kqz1ekv03v0qx34/PruebaModificarValorPredeterminado.rar?dl=0

A ver si con este ejemplo lo consigues Nomada, probado con y sin contraseña en tablas. Los datos a modificar los guardo en variables en el ejemplo.


Saludos


Publicado por: Parche
Fecha de publicación: 17/Enero/2019 a las 10:49
Hola,

Interesante hilo.

No consigo abrir la BD de la tabla vinculada (uso A2007) dice que  "no se reconoce el formato de la base de datos error.3343"

Saludos.



Publicado por: Nomada
Fecha de publicación: 17/Enero/2019 a las 11:51
Buenas.
Como dices he puesto el código que me has pasado:
El de la llamada a la función:
Call ActualizarPropiedad("Tabla1", "PAIS", Me.vPAIS)

La función:

'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

Con este código me dice:
"Se ha producido el error '34222 en tiempo de ejecución: No se puede modificar la estructura de la tabla. Otro usuario tiene la tabla abierta."

y me marca en amarillo la línea:  .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor

Me vuelvo majara


Publicado por: Nomada
Fecha de publicación: 17/Enero/2019 a las 14:23
Perdón, perdón. El problema estaba en que desde el formulario donde hacía la llamada no era independiente, sino basado en la tabla que llamaba.

Ahora si le pongo una contraseña a la tabla vinculada (PruebaDB_be_accdb) me da el error:

Se ha producido el error '3055' en tiempo de ejecución:
No es un nombre de archivo válido

y me marca de amarillo la línea: Set dbs = OpenDatabase(strRutaBD)

Por qué da el error, si la dirección no ha cambiado?

Muchas gracias.


Publicado por: rokoko
Fecha de publicación: 17/Enero/2019 a las 15:37
4o5 post mas arriba pitxiku a puesto el codigo que funciona con y sin contraseña, estas utilizando ese?? Es el que he utilizado en en el ejemplo que he puesto.


Publicado por: rokoko
Fecha de publicación: 17/Enero/2019 a las 16:47
Publicado originalmente por Parche Parche escribió:

Hola,

Interesante hilo.

No consigo abrir la BD de la tabla vinculada (uso A2007) dice que  "no se reconoce el formato de la base de datos error.3343"

Saludos.


La acabo de descargar y la abro sin problemas, esta creada con access 2013, pero deberia de ir con 2007, es el misma extension. Que raro.

En el ejemplo mirar tambien que refrencias estan activadas......




Publicado por: Nomada
Fecha de publicación: 17/Enero/2019 a las 17:16
Por fin perfecto todo.
Muchas gracias a todos y mil perdones por mi error.
Por mi parte, este hilo se puede cerrar satisfactoriamente.

Saludos.


Publicado por: pitxiku
Fecha de publicación: 17/Enero/2019 a las 17:50
Publicado originalmente por rokoko rokoko escribió:

Y como seria si quieres modificarlo, pero de una base de datos externa, no tienes tablas vinculadas??

Si tienes el nombre de la base de datos y la contraseña, no necesitas vincular una tabla. Úsalos directamente con el OpenDatabase:

Set dbs = OpenDatabase(<Nombre y ruta de la base de datos>, False, False, ";PWD=" & <La contraseña>)

dbs.TableDefs(<Nombre de la tabla real>)...


Publicado por: rokoko
Fecha de publicación: 17/Enero/2019 a las 19:55
Publicado originalmente por pitxiku pitxiku escribió:

Publicado originalmente por rokoko rokoko escribió:

Y como seria si quieres modificarlo, pero de una base de datos externa, no tienes tablas vinculadas??

Si tienes el nombre de la base de datos y la contraseña, no necesitas vincular una tabla. Úsalos directamente con el OpenDatabase:

Set dbs = OpenDatabase(<Nombre y ruta de la base de datos>, False, False, ";PWD=" & <La contraseña>)

dbs.TableDefs(<Nombre de la tabla real>)...

Ok, probado y perfecto. Lo habia hecho vinculando la tabla y luego desvinculandola, pero asi mucho mas sencillo.Clap


'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    
    
    
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("Nombre y ruta de la base de datos", False, False, ";PWD=" & contraseña)
    
    With dbs
        'Modificamos el valor por defecto
        dbs.TableDefs(Tabla).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
    
    Set dbs = Nothing
    
    MsgBox "Valor predeterminada cambiado correctamente.", vbInformation
End Function


Publicado por: rokoko
Fecha de publicación: 17/Enero/2019 a las 22:10
Y por liarla un poco mas y por curiosidad, si las tablas son vinculadas pero de un servidor SQL, se les puede cambiar tambien el valor predeterminado??


Publicado por: pitxiku
Fecha de publicación: 18/Enero/2019 a las 18:15
En un principio, puedes modificar el valor predeterminado de los campos de cualquier gestor de datos siempre y cuando:

1. El gestor de datos permita el uso de valores predeterminados.
2. Se pueda acceder con DAO a la base de datos (o con ADO; aunque en este caso habrá que modificar el código).
3. Dispongas de los datos de conexión a la base de datos (o de una tabla vinculada para saber cómo acceder).

Dependiendo del gestor de datos, quizá es más sencillo ejecutar una instrucción SQL que modifique el valor predeterminado, en vez de abrir la base de datos. Por ejemplo, para SQL Server:

- https://docs.microsoft.com/es-es/sql/relational-databases/tables/specify-default-values-for-columns?view=sql-server-2017

Y para Access, también se puede hacer con una instrucción SQL. Pero en este caso no se puede usar DAO porque da error. Debemos usar ADO:

- Esto da error: CurrentDb.Execute "ALTER TABLE Clientes ALTER COLUMN Nombre TEXT(50) DEFAULT Pepe"

- Esto funciona: CurrentProject.Connection.Execute "ALTER TABLE Clientes ALTER COLUMN Nombre TEXT(50) DEFAULT Pepe"

Más info en: https://docs.microsoft.com/es-es/office/vba/access/concepts/structured-query-language/modify-a-table-s-design-using-access-sql


Publicado por: rokoko
Fecha de publicación: 18/Enero/2019 a las 18:46
Por lo que me dices con el codigo que hemos utilizado para tablas vinculadas con o sin contraseña deberia funcionar no??

Me suelta el error 3251 operacion no valida para este tipo de objeto, linea de error en rojo

Las tablas del servidor estan vinculadas y puedo acceder y editar en ellas sin problemas.
la varible  strTablaOriginal  pilla el nombre de la tabla con el prefijo dbo.  por lo que en principio parece que se conecta bien al servidor sql la funcion, o eso creo

'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strTablaOriginal As String
   
    'Recuperamso el nombre de la tabla original
    strTablaOriginal = CurrentDb.TableDefs(Tabla).SourceTableName
   
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)
   
    With dbs
        'Modificamos el valor por defecto
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
   
    Set dbs = Nothing
   
 End Function


Publicado por: Parche
Fecha de publicación: 18/Enero/2019 a las 19:34
Duplicada respuesta.


Publicado por: Parche
Fecha de publicación: 18/Enero/2019 a las 19:35
Publicado originalmente por rokoko rokoko escribió:

Publicado originalmente por Parche Parche escribió:

Hola,

Interesante hilo.

No consigo abrir la BD de la tabla vinculada (uso A2007) dice que  "no se reconoce el formato de la base de datos error.3343"

Saludos.


La acabo de descargar y la abro sin problemas, esta creada con access 2013, pero deberia de ir con 2007, es el misma extension. Que raro.

En el ejemplo mirar tambien que refrencias estan activadas......

Hola,

La Bd Formulario la abro bien, cuando intento abrir la tabla1 sale el error que he puesto.

Las referencias están bien, bueno, no me da error o falta de algo.

La bdTablas me salta el error que he puesto y no deja entrar.

Puesto en C:/ raiz y en la carpeta que viene con la descarga.

Saludos.



Publicado por: pitxiku
Fecha de publicación: 19/Enero/2019 a las 18:33
Prueba con esta:

- https://1drv.ms/u/s!AsYMk9OS3HACh1N85hZ4pMKFAiaK

Es lo mismo que ha subido Rokoko, pero con las 2 bases de datos convertidas a mdb. A ver si así no te da el fallo de formato.


Publicado por: pitxiku
Fecha de publicación: 19/Enero/2019 a las 18:52
Publicado originalmente por rokoko rokoko escribió:

Me suelta el error 3251 operacion no valida para este tipo de objeto, linea de error en rojo

        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor

No dispongo de SQL Server, así que no puedo hacer muchas pruebas. Posibles causas que se me ocurren:

- El usuario con el que accedes al servidor no tiene permisos para cambiar esa propiedad.
- SQL Server no permite cambiar el valor predeterminado mediante esa propiedad del objeto TableDef.
- Si después de conectar, intentas usar el objeto TableDef con otras propiedades, aunque sólo sea para leer su valor, ¿puedes hacerlo?
- Y más causas posibles...

Para SQL Server (y otros gestores), existe otra posibilidad: ejecutar un procedimiento almacenado o una consulta de paso a través para modificar esa propiedad:

- https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-default-values-for-columns?view=sql-server-2017
- https://www.w3schools.com/sql/sql_default.asp
- https://support.microsoft.com/es-es/help/303968/how-to-create-an-sql-pass-through-query-in-access
- http://www.mvp-access.com/foro/consulta-paso-a-travs-desde-vba_topic73545.html
- https://revistadigital.inesem.es/informatica-y-tics/procedimientos-almacenados-de-sql-server-desde-microsoft-access/


Publicado por: Parche
Fecha de publicación: 20/Enero/2019 a las 11:02
Hola,

Ahora si que puedo abrirla.

Otra cosa, he intentado abrirla con la contraseña puesta, y sí que puedo así y también modificar:

* En la funcion ActualizarPropiedad:

Dim Ruta As String
Ruta = "C:\Valor\bdtablas.mdb"
Dim Contra As String
Contra= "hola"

Set dbs = OpenDatabase(Ruta , False, False, ";pwd=" & Contra)

... Pero con la rutina que está en la bbdd....

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)- modificada a:

'Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect,";pwd=hola") -- no me funciona. He cambiado la posición de las "," en el dbs y sigue igual.

¿Qué estoy haciendo mal?

Gracias por el interés.

-----------------------------------------------


Publicado originalmente por pitxiku pitxiku escribió:

Prueba con esta:

- https://1drv.ms/u/s!AsYMk9OS3HACh1N85hZ4pMKFAiaK

Es lo mismo que ha subido Rokoko, pero con las 2 bases de datos convertidas a mdb. A ver si así no te da el fallo de formato.


Publicado por: rokoko
Fecha de publicación: 20/Enero/2019 a las 11:51
No te hace falta modificar nada, esa funcion funciona con y sin contraseña, ademas te pilla los datos de ruta y contraseña de la propia base de datos, no tienes que indicarle ni la ruta ni la contraseña.

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)


Publicado por: rokoko
Fecha de publicación: 20/Enero/2019 a las 11:54
Publicado originalmente por rokoko rokoko escribió:

No te hace falta modificar nada, esa funcion funciona con y sin contraseña, ademas te pilla los datos de ruta y contraseña de la propia base de datos, no tienes que indicarle ni la ruta ni la contraseña. Tienes una tabla vinculada y es de esos datos que guarda access de esa vinculacion de donde pilla los datos.

Si muestras los objetos del sistema veras hay un tabla llamada MSysObjets  donde veras dos campos llamados Database y Connect, aqui se almacenan los datos de conexion.....y la funcion los pilla

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)


Publicado por: Parche
Fecha de publicación: 21/Enero/2019 a las 20:31
Hola,

Si pongo contraseña en bbdd bdtablas y pongo:

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)

me da error:

"No es una contraseña válida. Error 3031" ... por eso lo decía.

Saludos.

--------------------

Publicado originalmente por rokoko rokoko escribió:

No te hace falta modificar nada, esa funcion funciona con y sin contraseña, ademas te pilla los datos de ruta y contraseña de la propia base de datos, no tienes que indicarle ni la ruta ni la contraseña.

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)


Publicado por: rokoko
Fecha de publicación: 21/Enero/2019 a las 20:55
Pues lo acabo de probar y me funciona perfectamente, algo haras mal....  Mira las referencias a ver, pero no creo que sea eso....

'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strTablaOriginal As String
   
    'Recuperamso el nombre de la tabla original
    strTablaOriginal = CurrentDb.TableDefs(Tabla).SourceTableName
   
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)
   
    With dbs
        'Modificamos el valor por defecto
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
   
    Set dbs = Nothing
End Function


Para llamarla.
ActualizarPropiedad "NombreTabla","NombreCampo","NuevoValorPredeterminado"


Publicado por: Parche
Fecha de publicación: 21/Enero/2019 a las 21:07
Hola,

La llamada con sus variables no las toco. Están tal cual.

Sólo he hecho el cambio en la funcion. Y el error continúa.

   
    'Funciona sin contraseña en bdtablas
    'Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)
Al poner contraseña da error.
    '-------------------
    'Funciona con contraseña (con la ruta y pass declaradas)----------
    Set dbs = OpenDatabase(constDirectorio, False, False, ";pwd=" & constPass)
    '------------------



Será por el formato? Aunque es A2007 tuve que abrirlo en mdb pq me daba error el accdb.

Saludos.


Publicado originalmente por rokoko rokoko escribió:

Pues lo acabo de probar y me funciona perfectamente, algo haras mal....  Mira las referencias a ver, pero no creo que sea eso....

'Actualizamos el valor predeterminado de un campo de una tabla vinculada:
'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    Dim strTablaOriginal As String
   
    'Recuperamso el nombre de la tabla original
    strTablaOriginal = CurrentDb.TableDefs(Tabla).SourceTableName
   
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect)
   
    With dbs
        'Modificamos el valor por defecto
        .TableDefs(strTablaOriginal).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
   
    Set dbs = Nothing
End Function


Para llamarla.
ActualizarPropiedad "NombreTabla","NombreCampo","NuevoValorPredeterminado"


Publicado por: rokoko
Fecha de publicación: 21/Enero/2019 a las 22:05
A ver, tienes la tabla vinculadas o estas intentando modificar al valor predeterminado de una base de datos externa???

Si es vinculada te tiene que funcionar si o si, no tienes que modificar nada del codigo, tanto en extension mdb como accdb, otra cosa es si es de una base de datos externa. Para esta debes utilizar este codigo.


'- Tabla: 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(Tabla As String, Campo As String, Valor)
    Dim dbs As DAO.Database
    
    'Abrimos la base de datos donde se encuentra realmente la tabla
    Set dbs = OpenDatabase("Nombre y ruta de la base de datos", False, False, ";PWD=" & "La contraseña")
    
    With dbs
        'Modificamos el valor por defecto
        dbs.TableDefs(Tabla).Fields(Campo).DefaultValue = Valor
        'Y cerramos la base de datos
        .Close
    End With
    
    Set dbs = Nothing
End Function





Publicado por: pitxiku
Fecha de publicación: 22/Enero/2019 a las 01:25
Otra cosa: la función toma los datos de la tabla vinculada. Pero si has vinculado la tabla cuando la base de datos no tenía contraseña, y luego le has puesto contraseña, es normal que falle.

Tienes que actualizar el vínculo para guardar la contraseña. O modificar la cadena de conexión:

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect & ";pwd=la contraseña")


Publicado por: Parche
Fecha de publicación: 22/Enero/2019 a las 20:52
Hola,

Gracias a pitxiku y rokoko por vuestra paciencia.

Era lo que comenta pitxiku.

Saludos y gracias.

--------------------------


Publicado originalmente por pitxiku pitxiku escribió:

Otra cosa: la función toma los datos de la tabla vinculada. Pero si has vinculado la tabla cuando la base de datos no tenía contraseña, y luego le has puesto contraseña, es normal que falle.
Tienes que actualizar el vínculo para guardar la contraseña. O modificar la cadena de conexión:

Set dbs = OpenDatabase("", False, False, CurrentDb.TableDefs(Tabla).Connect & ";pwd=la contraseña")


Publicado por: rokoko
Fecha de publicación: 22/Enero/2019 a las 21:54
A veces la solucion esta en lo mas simple y no nos damos cuenta, a mi me pasa amenudoBig smile
Creo que Nomada dijo que se podia cerrar, que lo confirme, de momento yo dejo lo de modificar la tabla SQL.


Saludos



Publicado por: Nomada
Fecha de publicación: 29/Enero/2019 a las 11:08
Gracias y perfecto.
Si, este hilo se puede cerrar por mi parte satisfactoriamente.
Saludos a todos.



Imprimir página | Cerrar ventana