Cómo copio un solo registro de una tabla a otra en Access?

Tengo que pasar un registro seleccionado a través de un cuando combinado que concatena el Apellido y el nombre de una tabla historicos y pasarlo a otra de activos. El campo DNI es la clave principal sin duplicados. El código que hice es:

Dim strSQL As String

strSQL = "INSERT INTO activos "

strSQL = strSQL & "SELECT Socio, APELLIDO, NOMBRE, cuit, Nacim, Edad, DNI, FechaActa, NroActa, NroLibro, Folio, Ingreso "
strSQL = strSQL & "FROM HISTORICOS "
strSQL = strSQL & "WHERE dni = '" & Str(Me!APEL) & "' "
'strSQL = strSQL & "WHERE(((ASOCIADOS1.APELLIDO)=[apellido]) AND ((ASOCIADOS1.NOMBRE)=[nombre]))"
CurrentDb. Execute strSQL

Cuando hago click en el botón respectivo, siempre me aparece el mje "Error 3061 ... Pocos parámetros.Se esperaba 2".

Ya probé miles de cambios y no me funciona.

Este es el formulario que hice. Gracias por la ayuda que me puedan dar.

1 respuesta

Respuesta
2

Si sólo quieres pasar un registro, en vez de usar la sintaxis INSERT INTO SELECT, puedes usar esta otra alternativa: INSERT INTO (Campo1,Campo2,...CampoN) VALUES(Valor1,Valor2...ValorN)

y vas cogiendo los cuadros de texto que necesites de tu formulario, algo así:

Dim strSQL As String

strSQL = "INSERT INTO activos (campo1, campo2...CampoN) "

strSQL = strSQL & "VALUES(" & Me.Socio & ",'" & Me.Apellido & "','" & Me.Nombre & ...& ",#" & Format(Me.FechaActa,"mm/dd/yyy") & "#," &... &")"

CurrentDb.Execute strSQL

Fíjate que los valores de texto tienes que encerrarlos entre comillas simples ('), y los de fecha/hora entre almohadillas (#), y además, darle formato americano a las fechas, con la función format, para evitar problemas.

Has de cambiar Campo1, campo2... por los nombres que tengas en tu tabla activos.

Otra opción sería que usases un recordset para añadir los datos:

Dim rst as DAO.Recordset

Set rst=CurrentDb.OpenRecordset("activos")

rst.AddNew

rst("Campo1")=Me.Valor1

rst("Campo2")=Me.Valor2

...

rst.Update

rst.close

Set rst=Nothing

Has de sustituir Campo1... por los nombres de tu tabla activos y Me. Valor1... por los nombres de los controles de tu formulario.

¡Gracias! Usé el método recordset y funciono bárbaro.

Pero por inexperiencia me faltó aclararte que dentro de historicos se admite tener  valores duplicados, ya que una persona se fue de baja, volvió a incorporarse y nuevamente renunció. Esto me sirve para saber cuantas veces fue reincorporado. en ese caso la clave principal es un autonumérico que no lo paso a la tabla activos.

La idea es pasar a activos los datos que tienen como fecha de renuncia (baja) la más reciente.

Tendía que colocar un If antes de AddNew con la condición que sea la última fecha??, o conviene utilizar INTO TO ....VALUES???

Mil gracias y disculpa la falta de conocimiento.

Si sólo vas insertar un registro, es mejor usar INSERT INTO ...VALUES o un recordset. Si vas a insertar varios registros que dependan e un mismo valor (por ejemplo el DNI), es mejor usar INSERT INTO... SELECT, pues de lo contrario vas a tener que repetir varias veces el método para insertar cada uno de los registros.

Cualquiera de los dos métodos que te propuse te sirven para insertar UNICAMENTE los datos que te muestra el formulario.

¡Gracias! Nuevamente vuelvo a molestarte porque creo que no me expliqué bien anteriormente. La tabla historicos está armada así:

Socio  Nombre        DNI        Nacim    Ingreso    Renuncia      Calle        Nro

1234   LOPEZ     12345678  29/01/80   23/06/08   17/10/14     Quintana   1550

1234   LOPEZ     12345678  29/01/80  01/01/15    02/02/15      Brasil           965

Como verás, la clave principal de historicos es un Id autonumérico que no me interesa pasar a la tabla activos y tampoco quiero copiar Ingreso.

De estos dos registros de la misma persona, solamente quiero copiar los datos del segundo registro, donde en el campo desde aparece 02/02/2015, pero no me permite pasarlo a activos porque se crearían valores duplicados. En la tabla activos, el campo principal es DNI.

No sé cómo tendría que hacer el código con recordset.

Gracias nuevamente por tu ayuda, pero estoy que se me rompe la cabeza con este tema.

Saludos

Pues no veo el ID autonumérico con el ejemplo que pones... Quiero pensar que será el campo que llamas Nro, aunque no me tienen sentido los datos (el id más alto tendría que corresponder con la fecha de renuncia más reciente)

Lo que tendrías que hacer, tal como planteas tu bd en la pregunta, es mostrar ya en tu formulario el registro con la fecha más actual, y usar el código que te di antes y te funciona.

Si en tu formulario muestras todos los registros que se corresponden al nombre y apellido que seleccionas en el combo, vas a tener que usar dos recordsets, uno para coger los datos del registro más actual y otro para guardarlos en la tabla:

Dim rstOrigen as DAO.Recordset
Dim rstDestino as DAO.Recordset
Dim miSQL As String
miSQL="SELECT * FROM historicos WHERE DNI='" & Me.DNI & "' ORDER BY FechaRenuncia"
Set rstOrigen=CurrentDb.OpenRecordset(miSQL)
Set rstDestino=CurrentDb.OpenRecordset("activos")
rstOrigen.MoveLast   'Te vas a la última fecha
rstDestino.AddNew
rstDestino("Campo1")=rstOrigen("Campo1")
rstDestino("Campo2")=rstOrigen("Campo2")
...
rstDestino.Update
rstDestino.close
rstOrigen.Close
Set rstOrigen=Nothing
Set rstDestino=Nothing

Es decir,

1º/ creas una SQL sobre la tabla historicos, filtrada por el campo que sea y ordenada por el campo fecha. (miSQL="...")

2º/ Abres un recordset sobre esa consulta (Set rstOrigen=...) y otro sobre la tabla (Set rstDestino=...)

3º/ Te mueves al último registro, el de fecha más reciente (rstOrigen. Movelast)

4º/ Pasas los datos a la tabla destino y guardas.

¡Muchas Gracias!  Ahora si se me pasó el dolor de cabeza por este tema, anduvo todo bien y copio los datos que necesitabas.

Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas