Como comparar 3 tablas y actualizar una de ellas con coinicdencia (auditoria inventario)

espero puedan ayudarme .

Tengo la tabla Auditoria_vieja, Auditoria_nueva y una tercer tabla llamada Auditoria.

La tabla Auditoria tienen todos los datos de las otras dos tablas pero ningún dato se repite ya que puse una columna [clavecomp] como indexada en las tres tablas.

Lo que busco es que al crear una consulta (no se cual sea la mejor opción) tomando como origen la tabla [Audotira], vaya y me busque el campo [clavecomp] en la tabla [Auditoria_vieja] y me traiga el campo [Cantidad] en el campo [Auditoria].[Cantidad_vieja], y después vaya y me busque el campo [clavecomp] de la tabla [Audoitoria_nueva] y me traiga el campo Cantidad en el campo [Auditoria].[Cantidad_nueva].

No necesito que esto se almacene, es decir esta acción se hará una vez al día y cada que se haga esta acción, las 3 tablas tendrán información diferente, no necesito tener históricos.

Tengo esto pero al correr la consulta deja de funcionar Access.

2 Respuestas

Respuesta
1

Si no necesitas almacenar el resultado (que no deberías, ya que ya lo tienes en las otras tablas), no necesitas para nada una consulta de actualización.

Para que lo veas con un ejemplo:

Tengo 3 tablas, exactamente iguales, pero con diferentes datos en los campos PrecioUnidad y Existencia, para simular distintos momentos de tiempo en el almacén (sería lo mismo que tus tablas auditoría)

Productos:

 

Productos_Vieja:

 

Productos_Nueva:

Hago una simple consulta de selección como ésta:

 

Y ya tengo el resultado que buscas, una consulta en la que se muestran las existencias de Productos, las de Productos_Vieja en ExistenciasViejas y las de Productos_Nueva en ExistenciasNuevas

¡Muchísimas Gracias El Rojo!

Me diste completamente otra idea de lo que quería hacer pero con el resultado que estoy buscando, realmente esto es mucho más sencillo.

Gracias! Excelente

Rojo,

AL momento de hacer la consulta me manda un mensaje de error, no se si podemos darle la vuelta al error, mi campo clavecomp es long text ya que concateno varios valores para sacar registros únicos.

Lo que te dice el error es que no puedes establecer relaciones por campos Memo (o Long text, como se llaman ahora), ni campos de tipo OLE ni hipervínculo.

Si con 255 caracteres te llega para almacenar tu clavecomp, cambia el tipo de campo en el diseño de las tablas a texto corto.

Si no, nada te impide tener los campos sin encadenar, marcarlos (si lo necesitas) como clave compuesta, y establecer la relación entre las tres tablas por esos campos: dos a dos, tres a tres...

¡Gracias Rojo!

No había contestado ya que estaba probando lo que me dijiste.

En efecto cambie el tipo de campo de mi columna clavecomp y mi código me quedo así:

CurrentDb.Execute ("ALTER TABLE Auditoria_vieja ADD ClaveComp Text(200) index")
CurrentDb.Execute ("UPDATE Auditoria_vieja SET ClaveComp=[CODIGO ITEM]&[DESCRIPCION]&[LOTE]&[LOCALIZADOR]")
CurrentDb.Execute ("ALTER TABLE Auditoria_nueva ADD ClaveComp Text(200) index")
CurrentDb.Execute ("UPDATE Auditoria_nueva SET ClaveComp=[CODIGO ITEM]&[DESCRIPCION]&[LOTE]&[LOCALIZADOR]")

La verdad es que no utilice la opcion que me diste, me fui creo yo por el camino largo, y lo que hace mi archvio es:

1.- Importa inventario viejo, y crea clave unica
2.- Importa inventario nuevo, y crea clave unica

3.- Une los dos inventarios dejando registros unicos

4.- Muevo las cantidades mi inventario viejo y del nuevo a mi tabla auditoria

Este fue mi codigo, que como lo digo, creo es muy largo para lo que se tiene que hacer, igual si puedes decirme algo sobre el codigo seria de mucha ayuda, para futuros trabajos.

Set db = CurrentDb
Dim miSQL0 As String
Dim miSQL1 As String
Dim salida As Integer
Dim qry As QueryDef
CurrentDb.Execute ("ALTER TABLE Auditoria_vieja ADD ClaveComp Text(200) index")
CurrentDb.Execute ("UPDATE Auditoria_vieja SET ClaveComp=[CODIGO ITEM]&[DESCRIPCION]&[LOTE]&[LOCALIZADOR]")
CurrentDb.Execute ("ALTER TABLE Auditoria_nueva ADD ClaveComp Text(200) index")
CurrentDb.Execute ("UPDATE Auditoria_nueva SET ClaveComp=[CODIGO ITEM]&[DESCRIPCION]&[LOTE]&[LOCALIZADOR]")
   ''''''''Movemos auditoria vieja''''''''
    miSQL0 = "INSERT INTO Auditoria ([ORGANIZACION DE INVENTARIO], [DIVISION],[SUBINVENTARIO],[BUSINESS UNIT],[CODIGO ITEM],[DESCRIPCION],[LOTE],[FECHA CREACION LOTE],[LOCALIZADOR],[CLAVECOMP])" _
        & "SELECT Auditoria_vieja.[ORGANIZACION DE INVENTARIO],Auditoria_vieja.[DIVISION],Auditoria_vieja.[SUBINVENTARIO],Auditoria_vieja.[BUSINESS UNIT],Auditoria_vieja.[CODIGO ITEM], Auditoria_vieja.[DESCRIPCION]," _
        & "Auditoria_vieja.[LOTE],Auditoria_vieja.[FECHA CREACION LOTE],Auditoria_vieja.[LOCALIZADOR],Auditoria_vieja.[CLAVECOMP] FROM Auditoria_vieja"
    Set qry = db.CreateQueryDef("MueveDatos", miSQL0)
    DoCmd.OpenQuery "MueveDatos"
     ''''''''''''borro query'''''''''''''
    db.QueryDefs.Delete "MueveDatos"
       ''''''''Movemos auditoria nueva''''''''
    miSQL1 = "INSERT INTO Auditoria ([ORGANIZACION DE INVENTARIO], [DIVISION],[SUBINVENTARIO],[BUSINESS UNIT],[CODIGO ITEM],[DESCRIPCION],[LOTE],[FECHA CREACION LOTE],[LOCALIZADOR],[CLAVECOMP])" _
        & "SELECT Auditoria_nueva.[ORGANIZACION DE INVENTARIO],Auditoria_nueva.[DIVISION],Auditoria_nueva.[SUBINVENTARIO],Auditoria_nueva.[BUSINESS UNIT],Auditoria_nueva.[CODIGO ITEM], Auditoria_nueva.[DESCRIPCION]," _
        & "Auditoria_nueva.[LOTE],Auditoria_nueva.[FECHA CREACION LOTE],Auditoria_nueva.[LOCALIZADOR],Auditoria_nueva.[CLAVECOMP] FROM Auditoria_nueva"
    Set qry = db.CreateQueryDef("MueveDatos", miSQL1)
    DoCmd.OpenQuery "MueveDatos"
     ''''''''''''borro query'''''''''''''
    db.QueryDefs.Delete "MueveDatos"
    ''''''''actualizar cantidad ''''''''''''
    miSQL2 = "UPDATE Auditoria, Auditoria_nueva SET Auditoria.[CANTIDAD NEW] = [Auditoria_nueva].[CANTIDAD] WHERE (((Auditoria.CLAVECOMP)=[Auditoria_nueva].[ClaveComp]));"
    Set qry = db.CreateQueryDef("Actualiza_nuevo", miSQL2)
    miSQL3 = "UPDATE Auditoria, Auditoria_vieja SET Auditoria.[CANTIDAD OLD] = [Auditoria_vieja].CANTIDAD WHERE (((Auditoria.CLAVECOMP)=[Auditoria_vieja].[ClaveComp]));"
    Set qry = db.CreateQueryDef("Actualiza_viejo", miSQL3)
    DoCmd.OpenQuery "Actualiza_viejo"
    DoCmd.OpenQuery "Actualiza_nuevo"
    DoCmd.DeleteObject acTable, "Auditoria_nueva"
    DoCmd.DeleteObject acTable, "Auditoria_vieja"
    db.QueryDefs.Delete "Actualiza_viejo"
    db.QueryDefs.Delete "Actualiza_nuevo"

Saludos y nuevamente muchas gracias

Como poco, no necesitas tener tanta variables miSQL (además solo declaras 2 de las 4 que usas), ni necesitas andar creando y borrando consultas. Con una única variable miSQL puedes definir todas las consultas que quieres, y la puedes ejecutar con CurrentDb. Execute, con lo que tu código ya se reduce a la mitad, por lo menos.

Respuesta
1

No sé si lo he entendido bien. Pero si tengo la tabla Auditoria

Y tengo la tabla Auditoria Vieja

Y creo una consulta, donde relaciono los campos ClaveComp, que son los que me van a señalar que registros debe actualizar

Cuando la ejecuto, la tabla Auditoria

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas