Consulta copiar datos de una tabla a otra?

Espero que me puedan ayudar

Tengo dos tablas "T_Productos" y "TProductos2", las dos tienen los mismos campos Codigo (que es la clave), Descripcion y PrecioPublico.

Lo que necesito es reemplazar la información de los campos (Descripcion y PrecioPublico) de la T_Productos con la de T_Productos2. Ademas si en la Tabla T_Productos2 hay registros nuevos (es decir nuevos codigos, necesito que los cree en T_Productos.

Todo esto me gustaria ejecutarlo desde un botón en un formulario.

Aclaro que el campo Codigo de la tabla T_Productos esta relacionado con un campo de otra tabla de la base de datos. En cambio la tabla T_Productos2 no tiene ninguna relación. No se si tiene relevancia pero por las dudas se los comento.

2 Respuestas

Respuesta
3

¿Has probado a poner en el botón(tienes que cambiar los nombres)

DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE Clientes INNER JOIN Empleados ON Clientes.IdCliente = Empleados.IdEmpleado SET Clientes.NombreCompañía = [empleados].[apellidos], Clientes.NombreContacto = [empleados].[nombre]"

Respuesta
2

Te adjunto el Código de un Procedimiento Publico, con el fin de que lo puedas poner si quieres en un Módulo Estándar, pero puede ir si quieres en el propio Formulario, donde tienes ese Botón que comentas.

Public Sub AnexaActualizaProductos()
Dim StrSQL As String
Dim RegTP2 As Long, RegTP As Long, RegFinTP As Long
Dim ProdAnexados As Integer
On Error GoTo AnexaActualizaProductos_TratamientoErrores
RegTP = DCount("[Codigo]", "[T_Productos]")
RegTP2 = DCount("[Codigo]", "[T_Productos2]")
ProdAnexados = RegTP2 - RegTP
'Sondeo y comparo el Codigo en Ambas Tablas
If RegTP2 > RegTP Then
        MsgBox "La Tabla de [T_Productos] se actualizará con los Añadidos", vbInformation, "MENSAJE AL USUARIO"
        StrSQL = "INSERT INTO [T_Productos] SELECT [T_Productos2].* "
        StrSQL = StrSQL & "FROM [T_Productos2] LEFT JOIN [T_Productos] ON [T_Productos2].Codigo = [T_Productos].Codigo "
        StrSQL = StrSQL & "WHERE ((([T_Productos].Codigo) Is Null));"
        CurrentDb.Execute StrSQL, dbFailOnError
        RegFinTP = DCount("[Codigo]", "[T_Productos]")
        If RegTP2 = RegFinTP Then
                MsgBox "A la Tabla [T_Productos] se le han ANEXADO  " & ProdAnexados & "  Registros", vbInformation, "MENSAJE AL USUARIO"
        Else
                MsgBox "No se han ANEXADO  " & ProdAnexados & "  Registros", vbCritical, "MENSAJE AL USUARIO"
        End If
Else
        MsgBox "La Tabla de [T_Productos] NO se ha incrementado enNúmero de Registros", vbInformation, "TABLA CON LOS MISMOS REGISTROS"
End If
StrSQL = ""
StrSQL = "UPDATE [T_Productos] "
StrSQL = StrSQL & "LEFT JOIN [T_Productos2] "
StrSQL = StrSQL & "ON [T_Productos].Codigo = [T_Productos2].Codigo SET [T_Productos].Descripcion = [T_Productos2]![Descripcion], "
StrSQL = StrSQL & "[T_Productos].PrecioPublico= [T_Productos2]![PrecioPublico] WHERE ((([T_Productos]![Codigo])=[T_Productos2]![Codigo]));"
CurrentDb.Execute StrSQL, dbFailOnError
MsgBox "Los datos de la Tabla [T_Productos] se han actualizado con Exito", vbInformation, "TABLA ACTUALIZADA"
StrSQL = ""
AnexaActualizaProductos_Salir:
On Error GoTo 0
Exit Sub
AnexaActualizaProductos_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Procedimiento.: AnexaActualizaProductos de Documento VBA: Xxxxxxxxxx (" & Err.Description & ")"
Resume AnexaActualizaProductos_Salir
End Sub  'AnexaActualizaProductos

Para el Ejemplo, a ese botón le voy a llamar >> BtnAnexaActualiza, que tendrá su própio código en el Evento Click. Será desde donde llamemos al Procedimiento de arriba

Private Sub BtnAnexaActualiza_Click()
Call AnexaActualizaProductos
End Sub

Espero no haber errado en alguna línea. Un saludo >> Jacinto

Ante todo muchas gracias, pero todavía necesito de tu ayuda ya que me da un error y no se como solucionarlo. Adjunto imagen.

Creo que el campo que yo he puesto Código, de acuerdo a tu texto inicial es posible que se llame Código (con acento) y entonces no lo reconoce. Asegura que los nombres sea "Idénticamente Iguales". Ya me contarás. Un saludo >> Jacinto

Muchísimas gracias, si fue un error mio, no le puse el acento. El código que escribiste funciona maravillosamente. 

Te estoy muy agradecido ya que me voy a ahorrar mucho tiempo de trabajo.

Saludos

Jacinto, si no te es molestia, tengo una consulta mas.

Resulta que en la tabla T_Productos2 se agregan tanto como se eliminan registros.

Por lo tanto no me sirve que para saber si se tiene que agregar registros a T_Productos, cuente la cantidad de registros y los compare. Es posible modificar esa condición.

No estoy totalmente seguro, pero tendría que  comparar el campo Código y si no existe en T_Productos agregarlo.

No hay problema ninguno. Incluso si no quieres los mensajes el código se quedará con muchas menos líneas.

Public Sub AnexaActualizaProductos()
Dim StrSQL As String
On Error GoTo AnexaActualizaProductos_TratamientoErrores
StrSQL = "INSERT INTO [T_Productos] SELECT [T_Productos2].* "
StrSQL = StrSQL & "FROM [T_Productos2] LEFT JOIN [T_Productos] ON [T_Productos2].Código = [T_Productos].Código "
StrSQL = StrSQL & "WHERE ((([T_Productos].Código) Is Null));"
CurrentDb.Execute StrSQL, dbFailOnError
StrSQL = ""
StrSQL = "UPDATE [T_Productos] "
StrSQL = StrSQL & "LEFT JOIN [T_Productos2] "
StrSQL = StrSQL & "ON [T_Productos].Código = [T_Productos2].Código SET [T_Productos].Descripcion = [T_Productos2]![Descripcion], "
StrSQL = StrSQL & "[T_Productos].PrecioPublico= [T_Productos2]![PrecioPublico] WHERE ((([T_Productos]![Código])=[T_Productos2]![Código]));"
CurrentDb.Execute StrSQL, dbFailOnError
StrSQL = ""
AnexaActualizaProductos_Salir:
On Error GoTo 0
Exit Sub
AnexaActualizaProductos_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Procedimiento.: AnexaActualizaProductos de Documento VBA: Xxxxxxxxxx (" & Err.Description & ")"
Resume AnexaActualizaProductos_Salir
End Sub  'AnexaActualizaProductos

En esas Lineas ya te he puesto "Código" . Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas