** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error al insertar recordset en tabla
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError al insertar recordset en tabla

 Responder Responder Página  <12
Autor
Mensaje
salvaleuven Ver desplegable
Nuevo
Nuevo


Unido: 04/Octubre/2020
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 45
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 12:50
Ya he visto que el rs.MoveLast ha de ser rs.MoveFirst. Ahora me los copia uno por uno, advirtiéndome cada vez que va a copiar un registro...por lo que le he desactivado los warnings (docmd.warnings off) y tarda unos 3 seg en copiar 150 registros...creo que no es la manera más eficiente de copiar muchos registros, pero es bastante asumible para nuestro día a día.

El código sin informar del número de registros del recordset quedaría así finalmente. Lo he probado y funciona. ¿Alguna sugerencia para mejorarlo? ¿Hay algún modo de redactar más sencillamente el sqlinsert, dado que ha de copiar todos los registros del recordset rs, y los campos son exactamente los mismos en el recordset y la tabla mailfiltrados?

Public Sub Comando1_Click()

Dim rs As DAO.Recordset
Set rs = Forms!MailFacturasPendientes!SubFMailFacturasPendientes.Form.RecordsetClone
rs.MoveFirst
DoCmd.RunSQL ("delete * from mailfiltrados")
DoCmd.SetWarnings off
Do Until rs.EOF
sqlinsert = "INSERT INTO mailfiltrados (numero, fecha_emision, Totalfactura, cli_nif, direcciones, cli_nombre)" & _
" VALUES ('" & rs("numero") & "', '" & rs("fecha_emision") & "', '" & rs("totalfactura") & "', '" & rs("cli_nif") & "', '" & rs("direcciones") & "', '" & rs("cli_nombre") & "') "
DoCmd.RunSQL (sqlinsert)
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
DoCmd.SetWarnings (warningsOn)
End Sub
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14732
Respuesta Respuesta
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 13:04
Utiliza CurrentDb.Execute en lugar de DoCmd.RunSQL para evitar las advertencias
Utiliza un doble recordset. Cada consulta de inserción implica abrir la tabla, guardar y salir. Si utilizas un recordset, la apertura y la salida solo se hacen 1 vez.
El segundo recordset como AppendOnly (la tabla está vacía y solo quieres insertar)
Utiliza la colección de campos del recordset de destino para escribir menos

Dim rstClone As DAO.Recordset
Dim rstDestino As DAO.Recordset
Dim fld As DAO.Field

CurrentDb.Execute "DELETE * FROM mailfiltrados", dbFailOnError

Set rstClone = Forms!MailFacturasPendientes!SubFMailFacturasPendientes.Form.RecordsetClone
Set rstDestino = CurrentDb.OpenRecordset("SELECT * FROM mailfiltrados",, dbAppendOnly)

Do Until rstClone.EOF
  rstDestino.AddNew
  For Each fld In rstClone.Fields
    rstDestino.Fields(fld.Name) = rstClone.Fields(fld.Name)
  Next
  rstDestino.Update
  rstClone.MoveNext
Loop
rstClone.Close
Set rstClone = Nothing
rstDestino.Close
Set rstDestino = Nothing
MsgBox "Proceso de volcado finalizado", vbInformation, "AVISO"

Escrito al vuelo.


Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
salvaleuven Ver desplegable
Nuevo
Nuevo


Unido: 04/Octubre/2020
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 45
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 13:28
Brutal!!!

Muchísimas gracias Xavi!!
Arriba
 Responder Responder Página  <12
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable