** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Comparar campos de dos tablas iguales
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoComparar campos de dos tablas iguales

 Responder Responder
Autor
Mensaje
javifergavilan Ver desplegable
Nuevo
Nuevo


Unido: 25/Marzo/2020
Localización: España- Madrid
Estado: Sin conexión
Puntos: 49
Enlace directo a este mensaje Tema: Comparar campos de dos tablas iguales
    Enviado: 25/Marzo/2020 a las 12:32
Buenos días :

Tengo dos tablas de access y quiero comparar sus datos para que me diga cuales son los que varian...
Ejemplo:

Tabla 1
ID   uso   Nserie        fecha 
1     act    1234    03/05/2020
2     des   1235    04/05/2020 

Tabla 2
ID   uso   Nserie        fecha 
1     des    1234    03/05/2020
2     des   1235    04/05/2020 

Quiero que access me diga el Campo Uso de la Tabla 2 con el valor DES es diferente al de la tabla 1.

Creo que me explicado...

un saludo y gracias
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 13:42
Hola javifergavilan y bienvenido al foro,

Se supone que ambas tablas tienen la misma cantidad de registros (si no fuera así sería necesario ampliar)

- Abres dos recordsets, uno por cada tabla
>> Set rst = CurrentDb.OpenRecordset(....
- Recorres la primera tabla y, en cada iteración, buscas el Id en el segundo recordset
>>Un bucle Do.. Loop
>>Utilizar FindFirst para localizar en el segundo recordset
>>Utilizar NoMatch para controlar si existe o no
- Una vez localizado, recorres todos los campos (se supone que son los mismos nombres)
>>Bucle For Each
- Comparas los valores y muestras las diferencias. Por ejemplo en la ventana de inmediato
>>Debug.Print ...


Así es como yo lo enfocaría.

Un saludo


Xavi, un minyó de Terrassa

Mi web
Arriba
javifergavilan Ver desplegable
Nuevo
Nuevo


Unido: 25/Marzo/2020
Localización: España- Madrid
Estado: Sin conexión
Puntos: 49
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 14:44
Buenos días :

Gracias por la Respuesta pero no se programar código...¿ Se puede hacer desde access sin codigo?

Muchas Gracias.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 14:50
Lo siento. Yo no se ninguna forma de hacerlo.


Xavi, un minyó de Terrassa

Mi web
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 14:55
Hola!

Y umna consulta de búsqueda de no coincidentes no te valdría?
Un Saludo.
Arriba
javifergavilan Ver desplegable
Nuevo
Nuevo


Unido: 25/Marzo/2020
Localización: España- Madrid
Estado: Sin conexión
Puntos: 49
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 17:01
Buenos días:

Lo he intentado pero no me sale para todos los campos de una tabla...

Gracias...
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 17:19
Hola!

En este hilo tienes la respuesta tal y como te decía Xavi

Comprobar dos tablas con recordsets
Un Saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 17:22
Las consultas de no coincidentes son adecuadas para encontrar "viudas" y "huérfanos". Por ejemplo: clientes sin facturas. Pero no son adecuadas para localizar "diferencias" entre registros.

Como decía, creo que no es posible hacerlo sin VBA.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 25/Marzo/2020 a las 18:55
Como decía mi primer jefe:  "En informática siempre hay otro camino"  LOL

La SQL sería:
SELECT Tabla.Id, IIf([Tabla].[H1]=[Tabla-Cop].[H1],"","Campo H1: " & [Tabla].[H1] & " | " & [Tabla-Cop].[H1]) AS Comp_H1,
IIf([Tabla].[H2]=[Tabla-Cop].[H2],"","Campo H2: " & [Tabla].[H2] & " | " & [Tabla-Cop].[H2]) AS Comp_H2
FROM Tabla INNER JOIN [Tabla-Cop] ON Tabla.Id = [Tabla-Cop].Id;

En modo diseño de consultas el primer campo sería:
Comp_H1: SiInm([Tabla].[H1]=[Tabla-Cop].[H1];"";"Campo H1: " & [Tabla].[H1] & " | " & [Tabla-Cop].[H1])

y el resultado:

Consulta17
Id Comp_H1 Comp_H2
2 Campo H1: 100 | 1001
3
Campo H2: 95 | 195
4 Campo H1: 132 | 1321 Campo H2: 80 | 180
5




Eso sí, como tengas unos cuantos campos la cosa va a ser costosa ...  Evil Smile




Editado por Mihura - 25/Marzo/2020 a las 18:55
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
javifergavilan Ver desplegable
Nuevo
Nuevo


Unido: 25/Marzo/2020
Localización: España- Madrid
Estado: Sin conexión
Puntos: 49
Enlace directo a este mensaje Enviado: 27/Marzo/2020 a las 20:41
BUENAS NOCHES:

Muchas gracias , Ya esta solucionado...

Un saludo. 
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 27/Marzo/2020 a las 20:49
¿Y cómo lo has hecho?
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
javifergavilan Ver desplegable
Nuevo
Nuevo


Unido: 25/Marzo/2020
Localización: España- Madrid
Estado: Sin conexión
Puntos: 49
Enlace directo a este mensaje Enviado: 01/Abril/2020 a las 17:58
Buenas Tardes:

He puesto esto:

'borramos los datos de las tablas destino


Dim campo As Object

' creamos el objeto recorset con los datos de la tabla tabla1

Dim rsttabla2 As DAO.Recordset

' creamos el objeto recorset con los datos de la tabla tabla3

Dim rsttabla4 As DAO.Recordset

' creamos el objeto recorset con los datos de la tabla tabla1

Dim rsttabla2filtrado As DAO.Recordset

' creamos el objeto recorset con los datos de la tabla tabla3

Dim rsttabla4filtrado As DAO.Recordset

' creamos el objeto recorset con los datos de la tabla tabla1

Dim rsttabla1 As DAO.Recordset

' creamos el objeto recorset con los datos de la tabla tabla3

Dim rsttabla3 As DAO.Recordset

' consulta SQL

Dim strSQLtabla2 As String

' consulta SQL

Dim strSQLtabla4 As String

' consulta SQL

Dim strSQLtabla2filtrado As String

' consulta SQL

Dim strSQLtabla4filtrado As String

' consulta SQL

Dim strSQLtabla1 As String

' consulta SQL

Dim strSQLtabla3 As String

' valores nombre del campo y valor del campo

Dim nombrecampo As String

Dim valorcampo As String

' creamos la consulta de los datos que queremos recuperar

strSQLtabla2 = "SELECT [Identificador], [Estado], [Número de serie], [Uso], [USO nominal], [Última configuración] FROM TABLA2"

' creamos la consulta de los datos que queremos recuperar

strSQLtabla4 = "SELECT [Identificador], [Estado], [Número de serie], [Uso], [USO nominal],[Última configuración] FROM TWP WHERE Estado = " & " '" & "En servicio" & "' "

'"SELECT * FROM ALTASBAJAS  WHERE Identificador = " & " '" & datos & "'" & " And id_alta = " & datos1 & ";"

 

' creamos la consulta de los datos que queremos recuperar

strSQLtabla3 = "SELECT * FROM TABLA3"

' creamos la consulta de los datos que queremos recuperar

strSQLtabla1 = "SELECT * FROM TABLA1"

' rellenamos el recorset con la consulta de sql de la tabla tabla2

Set rsttabla2 = CurrentDb.OpenRecordset(strSQLtabla2)

' rellenamos el recorset con la consulta de sql de la tabla tabla4

Set rsttabla4 = CurrentDb.OpenRecordset(strSQLtabla4)

' rellenamos el recorset con la consulta de sql de la tabla tabla3

Set rsttabla3 = CurrentDb.OpenRecordset(strSQLtabla3)

' rellenamos el recorset con la consulta de sql de la tabla tabla3

Set rsttabla1 = CurrentDb.OpenRecordset(strSQLtabla1)

' borramos los registros antiguos de la tabla tabla1

Do Until rsttabla2.EOF

' creamos la consulta de los datos que queremos recuperar

strSQLtabla4filtrado = "SELECT [Identificador], [Estado], [Número de serie], [Uso], [USO nominal],[Última configuración] FROM TWP WHERE Identificador = " & " '" & rsttabla2(0) & "'"

Set rsttabla4filtrado = CurrentDb.OpenRecordset(strSQLtabla4filtrado)

If rsttabla4filtrado.EOF = True Then

''''''''''''''''''''''''''''''''''''''''''''''

'''' copiar a tabla1'''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

rsttabla1.AddNew

For Each campo In rsttabla2.Fields

' cambiamos los valores de un recorset a otro

nombrecampo = campo.Name

rsttabla1(nombrecampo).Value = rsttabla2(nombrecampo).Value

Next

rsttabla1.Update

''''''''''''''''''''''''''''''''''''''''''''''

'''''''' fin copiar tabla1'''''''

''''''''''''''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

'''' editar tabla3'''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

rsttabla3.AddNew

rsttabla3("Identificador") = rsttabla2(0)

rsttabla3("Estado") = "0"

rsttabla3("Número de serie") = "0"

rsttabla3("Uso") = "0"

rsttabla3("USO nominal") = "0"

rsttabla3("Última configuración") = "01/01/1999"

rsttabla3.Update

''''''''''''''''''''''''''''''''''''''''''''''

'''''''' fin editar tabla3'''''''

''''''''''''''''''''''''''''''''''''''''''''''

Else

    If rsttabla4filtrado(1) = rsttabla2(1) And rsttabla4filtrado(2) = rsttabla2(2) And rsttabla4filtrado(3) = rsttabla2(3) And rsttabla4filtrado(4) = rsttabla2(4) And rsttabla4filtrado(5) = rsttabla2(5) Then

    ' no hacer nada

    'MsgBox ("ok")

    ElseIf rsttabla4filtrado(1) <> rsttabla2(1) Or rsttabla4filtrado(2) <> rsttabla2(2) Or rsttabla4filtrado(3) <> rsttabla2(3) Or rsttabla4filtrado(4) <> rsttabla2(4) Or rsttabla4filtrado(5) <> rsttabla2(5) Then

    ''''''''''''''''''''''''''''''''''''''''''''''

    '''' copiar a tabla1'''''''''''''

    ''''''''''''''''''''''''''''''''''''''''''''''

    rsttabla1.AddNew

    For Each campo In rsttabla2.Fields

    ' cambiamos los valores de un recorset a otro

    nombrecampo = campo.Name

    rsttabla1(nombrecampo).Value = rsttabla2(nombrecampo).Value

   

    Next

    rsttabla1.Update

    ''''''''''''''''''''''''''''''''''''''''''''''

    '''''''' fin copiar tabla1'''''''

    ''''''''''''''''''''''''''''''''''''''''''''''

    ''''''''''''''''''''''''''''''''''''''''''''''

   

    '''' copiar tabla3'''''''''''''

    ''''''''''''''''''''''''''''''''''''''''''''''

    rsttabla3.AddNew

    For Each campo In rsttabla4filtrado.Fields

    ' cambiamos los valores de un recorset a otro

     nombrecampo = campo.Name

     rsttabla3(nombrecampo).Value = rsttabla4filtrado(nombrecampo).Value

    Next

    rsttabla3.Update

    ''''''''''''''''''''''''''''''''''''''''''''''

    '''''''' fin copiar tabla3'''''''

    ''''''''''''''''''''''''''''''''''''''''''''''

    End If

End If

rsttabla4filtrado.Close

Set rsttabla4filtrado = Nothing

rsttabla2.MoveNext

Loop

Do Until rsttabla4.EOF

' creamos la consulta de los datos que queremos recuperar

strSQLtabla2filtrado = "SELECT Identificador, Estado, [Número de serie], Uso, [USO nominal],[Última configuración] FROM TABLA2 WHERE Identificador = " & " '" & rsttabla4(0) & "'"

Set rsttabla2filtrado = CurrentDb.OpenRecordset(strSQLtabla2filtrado)

If rsttabla2filtrado.EOF = True Then

''''''''''''''''''''''''''''''''''''''''''''''

'''' copiar a tabla3'''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

rsttabla3.AddNew

For Each campo In rsttabla4.Fields

' cambiamos los valores de un recorset a otro

nombrecampo = campo.Name

valorcampo = campo.Value

rsttabla3(nombrecampo) = valorcampo

Next

rsttabla3.Update

''''''''''''''''''''''''''''''''''''''''''''''

'''''''' fin copiar tabla3'''''''

''''''''''''''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

'''' editar tabla1'''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''

rsttabla1.AddNew

rsttabla1("Identificador") = rsttabla4(0)

rsttabla1("Estado") = "0"

rsttabla1("Número de serie") = "0"

rsttabla1("Uso") = "0"

rsttabla1("USO nominal") = "0"

rsttabla1("Última configuración") = "01/01/1999"

rsttabla1.Update

''''''''''''''''''''''''''''''''''''''''''''''

'''''''' fin editar tabla1'''''''

''''''''''''''''''''''''''''''''''''''''''''''

End If

rsttabla2filtrado.Close

Set rsttabla2filtrado = Nothing

rsttabla4.MoveNext

Loop

rsttabla2.Close

Set rsttabla2 = Nothing

rsttabla4.Close

Set rsttabla4 = Nothing

rsttabla1.Close

Set rsttabla1 = Nothing

rsttabla3.Close

Set rsttabla3 = Nothing

Subformulario_TABLA3.Requery

Subformulario_TABLA1.Requery

 


En mi base de datos Access funciona ... de código no me preguntéis que no se!!

En teoría coge las dos tablas a comparar e inserta los cambios en otras dos tablas solo con los resultados que no coinciden...

un saludo.




Editado por javifergavilan - 01/Abril/2020 a las 17:59
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable