Bucle base de datos access para actualizar tablas

Tengo una base de datos en access con dos tablas, cada tabla tiene 65052 registros.

La idea que tengo es buscar registros en la tabla1 y tabla 2 que coincidan en 3 campos.

Lo intente con este codigo pero al ejecutarlo access se queda en "No responde" y tengo que cerrarlo con el administrador de tareas porque se bloquea totalmente.

No se si es por la cantidad de datos o si estoy haciendo algo mal.

Nota: las dos tablas tienen la misma estructura (Mismas columnas).

De ante mano gracias por su respuesta, no tengo mucha experiencia esto pero aprendo bien.

Sub actualiza()

Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Set rs1 = CurrentDb.OpenRecordset("tabla1", dbOpenDynaset) 

Set rs2 = CurrentDb.OpenRecordset("tabla2", dbOpenDynaset) 

Dim z As Long  'Este contador es simplemente para ver cuantos registros actualiza.
z = 0
rs1.MoveFirst
rs2.MoveFirst

Do Until rs1.EOF
          rs2.MoveFirst
          Do Until rs2.EOF
                 If (rs1!campo1 = rs2!campo1) And (rs1!campo2 = rs2!campo2) And (rs1!campo3 =                                          rs2!campo3) Then
                 rs2.Edit
                 rs2!campo4 = rs1!campo4
                 rs2.Update
                 z = z + 1
                 Exit Do
                Else
                rs2.MoveNext
                End If
         Loop
rs1.MoveNext
Loop

Debug.Print "Se actualizaron " & z
rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing

End Sub

1 Respuesta

Respuesta
2

Honestamente, no entiendo la pregunta, por la sencillez de la respuesta. Mira, tengo una tabla Clientes

Como puedes ver tiene 84 registros, y para no trabajar mucho, hago una Copia y le quito algunos registros y en nombre de compañia le cambio algunos nombres

Verás que sólo tiene 64 y de ellos hay 5 donde el nombre es tipo aaaa, cccc

Si construyo una consulta como

El resultado es

Como puedes ver sólo hay 59(64-5) registros en que los campos son iguales. Y si lo quieres hacer desde un formulario en vista diseño de la consulta pulsa Vista SQL y ya tienes lo que poner en código.

Me había olvidado, la consulta2 la puedes poner como de actualización y debajo del campo Ciudad, por ejemplo, donde pone Actualizar a

[clientes].[ciudad]

Muchas gracias por la respuesta Julián González Cabarcos .. Me explico mejor.

  1. las dos tablas tienen la misma cantidad de datos, sin embargo esa cantidad es fija en una de ellas y variable en la otra. La que es fija es la que quiero actualizar en base a la tabla de tamaño variable. (No creo que esto sea problema.)
  2. Los 3 campos que comparo representan una posición del cliente, esa posición esta asociada a un solo cliente. Cada uno de los 3 campos contiene una parte de esa posición.(Los datos contenidos en estos campos no cambian, es necesario que siempre sean los mismo por cuestiones logísticas, burocráticas y demás babosadas).
  3. Al momento de ejecutar la instruccion SQL se podrían realizar otro tipo de operaciones en la misma fila de los registros actualizados?. Como por ejemplo generar campos calculados, cambiar valores de otros campos o incluso agregar campos a la tabla.

Muchas gracias por tu respuesta de verdad.

Lo que intentaba hacer con el código es recorrer segunda tabla contra cada registro de la primera y al encontrar y al cumplir los criterios que quiero que se actualizaran los registros. Pero al hacerlo access se bloquea y me toca finalizarlo a la fuerza

Por partes, lo del bloqueo puede ser porque el motor de base de datos no soporte tanta información. Podrías hacerlo, por ejemplo

dim i as long

for i =1 to 10000

docmd...

Docmd. Gotorecord,, acnext

next

for i=100001 to 30000 etc

Es decir ir desglosando el recorrido

No se si sigo entendiendo la pregunta pero allá vamos

Supongamos que tienes una tabla Fija Clientes como la imagen

Observa que en ciudad están las "correctas". Tengo otra tabla "variable", que por comodidad mía he copiado la anterior y la he llamado Copia, Si construyopero le he cambiado las ciudades.

Si construyo la consulta como te decía

y la ejecuto, la tabla clientes queda como

Como puedes ver le ha cambiado las ciudades a los que tienen campos iguales. Desde un botón de un formulario le he dicho

docmd.setwarnings false

Docmd. Openquery"consulta1"

Lo de setwarnings es para que no aparezca la dichosa ventana de "Va a actualizar... y lo de docmd.openquery, realmente no la abre, la ejecuta.

De todas formas, si deseas hacerlo todo en código y quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Brian, ya que si no sé quien me escribe ni los abro. Te anticipo que no tengo ninguna tabla con tantos registros, pero me parece que tengo una con 2.900 que quizá te pueda dar una idea.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas