|
Responder ![]() |
Autor | |
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() Enviado: 12/Octubre/2017 a las 07:37 |
Buenos dias
Tengo una base de datos en access, que trabaja con unas tablas importadas por odbc de mysql. No me interesa, por motivos de seguridad, que sean vinculadas, por lo tanto importo una copia de las tablas. Es posible crear algún método automatizado, para que cada vez que abra el access me vuelva a importar las tablas actualizadas? Gracias |
|
![]() |
|
lbauluz ![]() Administrador ![]() ![]() Unido: 29/Marzo/2005 Localización: ROC, NY Estado: Sin conexión Puntos: 3256 |
![]() |
Mira a ver esto
https://support.office.com/es-es/article/Crear-una-macro-que-se-ejecute-al-abrir-una-base-de-datos-98ba1508-dcc6-4e0f-9698-a4755e548124 Un saludo. Luis
|
|
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
|
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Hola Luis
El tema no es la macro al abrir, sinó automatizar una importacion por odbc. Gracias
|
|
![]() |
|
lbauluz ![]() Administrador ![]() ![]() Unido: 29/Marzo/2005 Localización: ROC, NY Estado: Sin conexión Puntos: 3256 |
![]() |
Pues lo mismo que tengas hecho, pero puesto al inicio... ¿o es que lo haces manualmente?
Un saludo
|
|
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
|
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Buenas
Lo que me falta es el codigo para importar tablas por odbc, ya se que cuando lo tenga lo pongo en el autoexec. Ahora lo estoy haciendo manualmente Gracias
Editado por bugy - 12/Octubre/2017 a las 19:33 |
|
![]() |
|
javier.mil ![]() 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
Colaborador ![]() ![]() Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4271 |
![]() |
Hola
Prueba asi DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=PonAquiDSN;UID=PonAquiUsuario;PWD=PonAquiPassword;LANGUAGE=us_english;" & "DATABASE=PonNombreBaseOrigen", acTable, "PonTablaOrigen", "PonTablaDestino" Editado por javier.mil - 12/Octubre/2017 a las 19:59 |
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Hola Javier
He puesto el código en una función pública, pero al ejecutarlo desde una macro me dice que no encuentra esa función. La verdad es que no habia hecho nunca de llamar una función desde una macro. La funcion se llama odbc() Y en la macro he seleccionado ejecutar codigo, y en el nombre de funcion he puesto odbc() Pero al ejecutar dice que no encuentra esa funcion. Alguna idea? Gracias
|
|
![]() |
|
javier.mil ![]() 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
Colaborador ![]() ![]() Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4271 |
![]() |
Hola
Pon el siguiente codigo en un MODULO estandar Public Sub XecImportarTablasODBC() DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=PonAquiDSN;UID=PonAquiUsuario;PWD=PonAquiPassword;LANGUAGE=us_english;" & "DATABASE=PonNombreBaseOrigen", acTable, "PonTablaOrigen", "PonTablaDestino" End Sub Luego tienes 2 opciones: Opcion 1- (Con codigo VBA) Puedes hacer una llamda desde cualquier parte del tu programa Call XecImportarTablasODBC Opcion 2 - (Con Macros) Usar una Macro que ejecute el procedimiento XecImportarTablasODBC Editado por javier.mil - 13/Octubre/2017 a las 17:44 |
|
![]() |
|
teogf ![]() Asiduo ![]() Unido: 09/Febrero/2007 Localización: España Estado: Sin conexión Puntos: 443 |
![]() |
Puede que te sirva este post http://www.mvp-access.com/foro/vincular-tablas-mysql-sin-dsn_topic82550.html
|
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Hola Javier
El código va muy bien, lo que me crea una copia de la tabla. Supongo que lo que tendré que hacer es eliminar primero la tabla y luego hacer la importación. Lo que me falla es la macro. He utilizado "ejecutar codigo", y en el nombre de la funcion pongo XecImportarTablasODBC pero nada, he probado poniendo al final () pero tampoco. Me dice que no lo encuentra. Gracias
|
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Hola Gracias por el código, lo que pasa que no las quiero vincular. |
|
![]() |
|
javier.mil ![]() 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
Colaborador ![]() ![]() Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4271 |
![]() |
Buenas
Si claro si importas las tablas y la tablas ya existen automáticamente Access añade 1,2,3,4 sucesivamente. Para que No te suceda este comportamiento si No es lo deseado, deberás comprobar si las tablas existen en LOCAL y en tal caso borrarlas y luego hacer la importación. Recuerda que si repites este proceso sucesivamente el tamaño de base ira creciendo , para restaurar el tamaño de la base deberías compactar. Respecto al tema de la MACRO la verdad es que No entiendo cual es el problema que comentas, pero dependiendo de la version de Access deberías encontrar algo así como "Run Code" y a continuación poner XecImportarTablasODBC Editado por javier.mil - 13/Octubre/2017 a las 22:38 |
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
|
|
![]() |
|
Bebe ![]() Nuevo ![]() ![]() Unido: 06/Marzo/2006 Localización: EE.UU Estado: Sin conexión Puntos: 5 |
![]() |
Amigo esta funcion es original del Buho, yo la adecue para unas pruebas, pero con seguridad te sirve para lo que quieres con algunas modificaciones, cambia la vinculacion por eliminacion
Option Compare Database Option Explicit '**************************************************************************** 'PROPOSITO DE ESTE MÓDULO: 'Sirve para comprobar desde un formulario de INICIO si la 'vinculación de Tablas está bien o se ha roto. 'Si se ha roto, nos salta un aviso y se puede desencadenar 'el proceso automático o el manual. 'Además en este modulo está la función que revincula las tablas 'bien de forma manual o bien de forma automática. 'Se trata de la funcion: VinculaTablas 'Francisco Javier García Aguado [Buho] paco@nemo.es 'Valladolid, Diciembre de 2002 'Si utilizas estas funciones, te rogaría preservaras la autoría de las mismas. '***************************************************************************** Function VinculaTablas(cad_conexion As String) As Boolean On Error GoTo Err_ControlErrorFuncion Dim contador As Integer Dim objAcObj As AccessObject Dim objCurData As CurrentData Dim DBSS As Database Set objCurData = Application.CurrentData Dim Tabla As TableDef Set DBSS = CurrentDb() For Each objAcObj In objCurData.AllTables Set Tabla = DBSS.TableDefs(objAcObj.Name) 'If objAcObj.Name = "tbl_mmmm" Then 'Debug.Print objAcObj.Name: Stop 'End If 'If Tabla.Attributes And dbSystemObject Then If Tabla.Attributes And dbSystemObject Or Tabla.Name = "tbl_mmmm" Or Tabla.Name = "tbl_xxxx" Or Tabla.Name = "tbl_yyyy" _ Or Tabla.Name = "tbl_zzzz" Or Tabla.Name = "tbl_aaaa" Or Tabla.Name = "tbl_bbbb" _ Or Tabla.Name = "tbl_gggg" Or Tabla.Name = "tbl_sumario_pago" Or Tabla.Name = "tbl_detalle_pagos_local" Then 'cad_conexion = "DRIVER={MySQL ODBC 5.1 Driver};" & _ "SERVER=189.20.50.231;PORT=3306" & _ "DATABASE=mydatabase;" & _ "UID=tuusuario;PWD=tupassw; OPTION=3" 'en este if quito las tablas del sistema y todas aquellas que sean locales 'que obviamente no son necesarias vincular. 'ya que la MDB puede tener tablas locales (Que obviamente no son precisas vincular). 'y tener tablas vinculadas, que son las que se recogerían 'en el ELSE siguiente. Else contador = contador + 1 'If IsNull(Forms!frmvincula.Password) Then 'No tiene clave 'Tabla.Connect = ";DATABASE=" & rutaFichero & ";" 'ACTIVAR PARA VER EL TEST DE CONEXIÓN by htorres Dec 22, 2015 'Debug.Print Tabla.Name 'If Tabla.Name = "tbl_zzzz" Then 'Debug.Print Tabla.Name: Stop 'End If Tabla.Connect = cad_conexion & ";" 'by htorres para mysql solo necesito esto y como no voy a colocar al usuario a vincular 'le paso la ruta en la misma funcion 'Else 'Tabla.Connect = ";DATABASE=" & rutaFichero & ";PWD=" & Forms!frmvincula.Password & ";" 'End If Tabla.RefreshLink If contador = 1 Then 'aqui meto la sugerencia de Juan M AFan de Ribera y no es otra 'que para acelerar el proceso de revinculacion en entornos de red 'se abre el recordset de la primera tabla vinculada y no se cierra hasta 'el final, cuando ya se han revinculado todas. 'De esta forma, dicen, se acelera el proceso de revinculacion. 'El comentario que me hacía Juan era: 'Pues bien, tocando el tema de revincular tablas, sobre todo si es por 'código, me consta que si la base de datos con los datos (backend) está en 'una red, es más que probable que el proceso sea lento o muy lento. Para 'incrementar la velocidad de esa revinculación se puede hacer lo siguiente: 'Una vez se ha conectado con la base de datos origen y se ha vinculado la 'primera tabla, se ha de abrir un recordset de esa primera tabla y seguir con 'el proceso de revinculación. Cuando se haya acabado de revincular, ya se 'puede cerrar el recordset. Podéis encontrar más información sobre este 'proceso y muchas otras cosas interesantes en la página de nuestro amigo Tony 'Towes (alguno de por aquí creo que le ya le conoce) 'http://www.granite.ab.ca/access/splitapp.htm 'yo hice la prueba en el trabajo y la diferencia de tiempo en una bd con unas '30 tablas vinculadas fue de casi 2 minutos. Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset(Tabla.Name) End If End If 'Debug.Print Tabla.Name Next objAcObj If contador <> 0 Then 'cierro el recordset de la primera tabla 'que aceleraba el proceso de revinculación rst.Close Set rst = Nothing End If VinculaTablas = True Exit Function Exit_ControlErrorFuncion: Exit Function Err_ControlErrorFuncion: If Err.Number = 3078 Or Err.Number = 3011 Then MsgBox "La Mdb escogida, parece no ser la que tiene las tablas vinculadas -> " & Chr(13) & Chr(10) & Err.Description, vbCritical + vbOKOnly, "El Búho Informa: Error de Datos" Else If Err.Number = 3219 Then Else MsgBox "Se ha producido el Error Nº: " & Err.Number & " ." & Err.Description, vbCritical + vbOKOnly, "Error de Datos" End If End If VinculaTablas = False Resume Exit_ControlErrorFuncion End Function Y con esto te dejo ver una idea de como pudieras borrar Dim obj As AccessObject, dbs As Object Set dbs = Application.CurrentData For Each obj In dbs.AllQueries If obj.Name = "queryXXX" Then DoCmd.DeleteObject acQuery, "queryXXX" End If Next Recicla esto y veras que lo sacas...espero te sirva |
|
![]() |
|
bugy ![]() Habitual ![]() Unido: 19/Febrero/2013 Localización: España Estado: Sin conexión Puntos: 91 |
![]() |
Buenas
Tema resuelto, ya se puede cerrar. Gracias
|
|
![]() |
Responder ![]() |
|
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 |