Actualizar los campos de una tabla a partir de otra Access

Tengo una tabla llamada Nomina, con un subformulario llamado Detalle_Nomina. Quiero actualizar los campos de otra tabla llamada Detalle_Colaborador a partir de los cálculos de Detalle_Nomina, ya que quiero guardar por cada Colaborador los resultados calculados de la nomina para cada nomina que se calcule. O sea, la tabla Detalle_Nomina tiene los cálculos de la Nomina 1 para todos los colaboradores, y quiero guardar en la Tabla Detalle_Colaboradores todos los cálculos de todas las nominas para cada Colaborador.

3 Respuestas

Respuesta
1

Se puede hacer fácilmente si ambas tablas tienen un campo que perita relacionarlas, asumo que existe: el campo colaborador.

Se tiene que crear una consulta, en ella se añaden ambas tablas (la que hay que actualizar y la contiene los resultados de los cálculos), ambas deben de tener el campo común por el que se las relacionara.

Para relacionarlas se arrastra ( con el ratón) el campo común de una de ellas y se superpone al campo de la otra con la que se desea relacionar (se da por supuesto que ambos campos tiene el mismo tipo de dato).

Solicitara el tipo de relación, se elige en principio que ambos sean iguales, los otros tipos de relación se utilizan en el caso de que una tenga mas registros que la otra o se den las condiciones.

Ya relacionadas se bajan de una el campo a actualizar y de la otra el campo con el resultado, para verificar que todo esta correcto se añade un campo (el que las relaciona puede ser adecuado).

De momento es una consulta de selección, al ejecutarla se verán el campo de añadido (el de relación), el campo que tendrá el resultado y el resultado que tendrá el campo.

Si algo no esta bien se corrige y cuando los resultados se visualicen de forma correcta es el momento de cambiar el tipo de consulta, se selecciona una de actualización y bajo el campo que se desea actualizar (en la línea 'actualizar a:') el campo con el resultado.

Se ejecuta, se confirma cuando lo solicite y cuando finalice se pasa de nuevo a consulta de selección y al ejecutarla se verán ambos campos iguales.

Si quedo algo en el tintero hazlo saber para aclararlo (son pasos sencillos y a veces se da todo por conocido).

Respuesta
1

Lo más habitual en Access para este caso es usar una consulta de anexado (INSERT INTO) o una consulta de actualización (UPDATE) ejecutada cuando se termina de calcular la nómina.

Supongamos esta estructura

Tabla Detalle_Nomina

Contiene los cálculos de una nómina específica:

IdDetalleNominaIdNominaIdColaboradorSalarioHorasExtraTotalDevengadoTotalDeduccionesNetoPagar

Tabla Detalle_Colaborador

Quieres almacenar el histórico de todas las nóminas:

IdDetalleColaboradorIdNominaIdColaboradorSalarioHorasExtraTotalDevengadoTotalDeduccionesNetoPagar

Opción recomendada: INSERT INTO (guardar histórico)

Si cada nómina debe quedar registrada para cada colaborador, no debes actualizar registros existentes sino agregar nuevos registros.

INSERT INTO Detalle_Colaborador
(
    IdNomina,
    IdColaborador,
    Salario,
    HorasExtra,
    TotalDevengado,
    TotalDeducciones,
    NetoPagar
)
SELECT
    IdNomina,
    IdColaborador,
    Salario,
    HorasExtra,
    TotalDevengado,
    TotalDeducciones,
    NetoPagar
FROM Detalle_Nomina
WHERE IdNomina = Forms!Nomina!IdNomina;

Esto copiará todos los registros de la nómina actual desde Detalle_Nomina hacia Detalle_Colaborador.

Ejecutarlo desde un botón

En el formulario Nomina puedes colocar un botón:

Private Sub cmdGuardarHistorico_Click()
    Dim sql As String
    sql = "INSERT INTO Detalle_Colaborador " & _
          "(IdNomina, IdColaborador, Salario, HorasExtra, " & _
          "TotalDevengado, TotalDeducciones, NetoPagar) " & _
          "SELECT IdNomina, IdColaborador, Salario, HorasExtra, " & _
          "TotalDevengado, TotalDeducciones, NetoPagar " & _
          "FROM Detalle_Nomina " & _
          "WHERE IdNomina = " & Me.IdNomina
    CurrentDb.Execute sql, dbFailOnError
    MsgBox "Histórico de nómina guardado correctamente.", vbInformation
End Sub

Si deseas actualizar registros existentes

Si en Detalle_Colaborador ya existe un registro para el mismo colaborador y la misma nómina, entonces usarías una consulta UPDATE:

UPDATE Detalle_Colaborador AS DC
INNER JOIN Detalle_Nomina AS DN
    ON DC.IdColaborador = DN.IdColaborador
    AND DC.IdNomina = DN.IdNomina
SET
    DC.Salario = DN.Salario,
    DC.HorasExtra = DN.HorasExtra,
    DC.TotalDevengado = DN.TotalDevengado,
    DC.TotalDeducciones = DN.TotalDeducciones,
    DC.NetoPagar = DN.NetoPagar;

Recomendación de diseño

Para conservar el historial correctamente:

  • Nomina → Cabecera de cada nómina.
  • Detalle_Nomina → Detalle calculado de cada colaborador por nómina.
  • No reutilizar ni sobrescribir registros.
  • Guardar cada cálculo mediante INSERT INTO en una tabla histórica (o incluso usar directamente Detalle_Nomina como histórico si cada registro ya tiene IdNomina e IdColaborador).

De hecho, si Detalle_Nomina ya almacena permanentemente los registros de cada nómina con su IdNomina, podría no ser necesario duplicar la información en Detalle_Colaborador. Bastaría consultar los datos históricos mediante consultas relacionadas por IdColaborador e IdNomina.

Respuesta

Perdonen mi intromisión.

Miguel, vi que el experto Enrique Feijóo ya le ha aportado una solución. Pese a no ser conocedor ayer en la noche estuve ojeando una serie de páginas a cerca de su consulta que desearía trasladarle con la esperanza de que llegado el caso aún pudiese serle quizás de alguna utilidad adicional.

En estas otras consultas por ejemplo lograron hacerlo creo utilizando las funciones ''Join''' y ''DLookUp''.

https://stackoverflow.com/questions/38219619/access-update-column-with-values-from-another-table

https://www-tek--tips-com.translate.goog/threads/update-a-table-based-on-a-totals-query-of-another-table.1779117/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc


Disculpe de nuevo por la propuesta de tanta lectura. Ánimo.


https://stackoverflow.com/questions/787186/access-db-update-one-table-with-value-from-another

https://www-access--programmers-co-uk.translate.goog/forums/threads/update-one-table-using-another.223875/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://dba-stackexchange-com.translate.goog/questions/90241/updating-one-table-from-another-table-where-non-primary-key-field-is-similar-str?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://www.access-programmers.co.uk/forums/threads/update-one-table-using-another.223875/

https://www.forosdelweb.com/f21/actualizar-campo-con-valores-otra-tabla-205088/

https://blogs-webtech-ab-ca.translate.goog/2008/05/updating-fields-of-table-with-values.html?_x_tr_sch=http&_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://es.stackoverflow.com/questions/31467/actualizar-datos-de-una-tabla-a-partir-de-otra-en-sql

https://superuser-com.translate.goog/questions/1771593/update-a-field-in-other-records-based-on-the-value-of-same-field-in-a-record-aut?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://www.youtube.com/watch?v=hTmarQ0kT4Y

https://www.youtube.com/watch?v=pOIqkGfqLfY

https://documentation.help/MS-Office-Access-2003/achowUpdateTableBasedOnAnotherTableS.htm

https://www.pcreview.co.uk/threads/update-field-from-one-table-with-field-from-another.1104686/

https://www-mrexcel-com.translate.goog/board/threads/how-do-i-update-an-access-table-based-on-updated-information-in-another-one.456674/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://es.stackoverflow.com/questions/618491/es-posible-actualizar-diferentes-valores-en-un-campo-seg%C3%BAn-diferentes-criterios

https://www-w3schools-com.translate.goog/sql/sql_update.asp?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://www-access--programmers-co-uk.translate.goog/forums/threads/update-table-with-values-from-another-table.206249/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas