** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y Otros sistemas
  Mensajes nuevos Mensajes nuevos RSS - automatizar importacion odbc
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

automatizar importacion odbc

 Responder Responder
Autor
Mensaje
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Tema: automatizar importacion odbc
    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

Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2943
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Octubre/2017 a las 14:11
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
Quod natura non dat, Salmantica non præstat
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Octubre/2017 a las 16:20
Hola Luis
El tema no es la macro al abrir, sinó automatizar una importacion por odbc.
Gracias
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2943
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Octubre/2017 a las 19:29
Pues lo mismo que tengas hecho, pero puesto al inicio... ¿o es que lo haces manualmente?

Un saludo
Quod natura non dat, Salmantica non præstat
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Octubre/2017 a las 19:32
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
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4137
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Octubre/2017 a las 19:39
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
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 12:45
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
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4137
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 15:13
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
Arriba
teogf Ver desplegable
Asiduo
Asiduo


Unido: 09/Febrero/2007
Localización: España
Estado: Sin conexión
Puntos: 417
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita teogf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 17:47
Puede que te sirva este post

http://www.mvp-access.com/foro/vincular-tablas-mysql-sin-dsn_topic82550.html
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 19:04
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
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 19:05
Publicado originalmente por teogf teogf escribió:

Puede que te sirva este post

http://www.mvp-access.com/foro/vincular-tablas-mysql-sin-dsn_topic82550.html

Hola 
Gracias por el código, lo que pasa que no las quiero vincular.

Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4137
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2017 a las 22:36
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
Arriba
bugy Ver desplegable
Habitual
Habitual


Unido: 19/Febrero/2013
Localización: España
Estado: Sin conexión
Puntos: 56
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita bugy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2017 a las 08:46
Publicado originalmente por javier.mil javier.mil escribió:

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


Hola Javier
Es una version access 2010. No ha habido manera con la macro.
Como igualmente queria que se abriese un formulario al inicio, lo que he hecho ha sido que al abrir el formulario llame la funcion con el CALL.
Muchas gracias por la ayuda


Arriba
Bebe Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 06/Marzo/2006
Localización: EE.UU
Estado: Sin conexión
Puntos: 5
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Bebe Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 24/Octubre/2017 a las 02:44
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
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable