Importa y actualizar tabla en access

Cuento con un el siguiente código:

Private Sub Comando0_Click()

Dim XlsRuta As String
Dim miSql As String
'Indicamos la ruta del Excel
XlsRuta = "E:\JPALOMINOC\WORK\BASES\ESTADOS.XLSX"
'Importamos la hoja de cálculo a la tabla TExcel
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel7, "TExcel", XlsRuta, True
'Definimos la consulta de datos anexados
miSql = "INSERT INTO ESTADOS (NRO_RECLAMO, FASE, ESTADO, CONDICIÓN)"
miSql = miSql & " SELECT TExcel.NRO_RECLAMO, TExcel.FASE, TExcel.ESTADO, TExcel.CONDICIÓN FROM TExcel"
'Ejecutamos la consulta
DoCmd.SetWarnings False
DoCmd.RunSQL (miSql)
DoCmd.SetWarnings True
'Borramos la tabla TExcel
DoCmd.DeleteObject acTable, "TExcel"
'Lanzamos un mensaje de que todo ha ido bien
MsgBox "Datos anexados correctamente", vbInformation, "Importación de Estados"
End Sub

La tabla ESTADOS en access tiene como clave única NRO_RECLAMO para que cuando importe no se suban duplicados, pero quisiera que al importar la información del Excel si un número de reclamo cambio de fase o estado se actualice en la tabla del access.

Respuesta
1

Puedes utilizar una SQL de actualización para actualizar todos los registros coincidentes, independientemente de si han cambiado de valor o no. Si han cambiado, te los cambiará, si no, te escribirá el mismo valor que tenías.

Esta solución da por supuesto que la velocidad de ejecución de la consulta va a ser alta, con lo cual no vas a tener que esperar mucho tiempo. Si la velocidad fuera lenta (por ejemplo, por tener muchos registros, se tendría que optimizar de alguna manera, o cambiar la sistemática).

Ni que decir tiene que hagas la prueba en una copia de tu base de datos, dado que la solución se basa solo en lo que puedo sacar de la información de tu mensaje, y desconozco si habrá otros elementos que afecten al asunto.

Dicho esto...

1.- Declara una nueva variable en el procedimiento, así:

dim miSql2 as string

2.- Antes de tu línea 'Borramos la tabla TExcel escribe lo siguiente:

miSql2 = "UPDATE ESTADOS INNER JOIN TExcel ON ESTADOS.NRO_RECLAMO = TExcel.NRO_RECLAMO" _

& " SET ESTADOS.FASE = [TExcel].[FASE], ESTADOS.ESTADO = [TExcel].[ESTADO]"

Currentdb.execute miSql2, dbfailonerror

'Borramos la tabla TExcel ... y el resto de tu código.

A ver si te funciona bien.

Un saludo,

Neckkito - Access MVP

Tras releer tu pregunta se me ha "encendido la bombilla" y he visto que la operación se puede optimizar si cambias el orden de ejecución de las consultas. Así pues, mejor sería que, el código que te he señalado, lo pusieras antes de tu línea

'Definimos la consulta de datos anexados

Así, el proceso será: 1.- Actualizo los coincidentes / 2.- Añado los no coincidentes

De la otra manera el proceso sería 1.- Añado los no coincidentes / 2.- Actualizo los coincidentes, pero teniendo en cuenta que también actualizaría los nuevos añadidos, lo cual no es necesario, obviamente.

¡Gracias! 

Gracias por el apoyo, me sirvió mucho.

Desarrolle los siguientes pasos:

1. Creo la tabla en Access: Tabla_1

2. Importó una tabla al Access con datos actualizados y registros nuevos: Tabla_2

3. Proceso una consulta de actualización de los coincidentes entre la Tabla_1 y Tabla_2

4. Proceso una consulta para crear una tabla con los registros nuevos que están en la Tabla_2 y no en la Tabla_1: Tabla_3

5.  Proceso una consulta para agregar en la Tabla_1 los registro de la Tabla_3.

6. Elimino Tabla_2

7. Elimino Tabla_3

Todos los pasos los adicioné un botón para que corran.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas