Access - Bucle infinito al duplicar registros con Recordset

 
Vista:

Bucle infinito al duplicar registros con Recordset

Publicado por José Carlos (3 intervenciones) el 16/02/2017 20:11:06
Hola, buenas tardes.
Pretendo que el usuario de una base de datos pueda duplicar unos registros que tienen muchos datos coincidentes, para a continuación modificar los pocos cambios que procedan. La idea es duplicar los registros que tengan un determinado valor en uno de los campos.
Para ello he formado un procedimiento que, a partir del nombre de una tabla, del nombre de un campo de la tabla y del valor específico de ese campo, debe buscar los registros de la tabla con coincidencia y debe duplicar dichos registros.

Para ello, en un primer Recordset almaceno esos registros de la tabla que cumplen la condición pedida. A continuación en otro Recordset almaceno una copia completa de la tabla donde se van a duplicar los registros.
Si el primer Recordset no es nulo, añado un nuevo registro, vacío, en el segundo Recordset y copio en éste el valor de los campos del Recordset original, cuidando de no duplicar los que tengan carácter de autonumérico. Al final actualizo a partir del Recordset
Después con un .MoveNext paso a otro registro del Recordset original, vuelvo a añadir un registro vacío en el segundo Recordset y almaceno en sus campos lo valores correspondientes del registro actual del Recordset original, como antes.
El recorrido por el Recorset original se hace con un bucle Do While que debe finalizar cuando la propiedad .EOF del Recordset original se haga True.
Pues el problema es que no funciona correctamente, ya que no sale del bucle Do While, o lo hace después de haber duplicado los registros ¡100.000 veces!
¿Qué está mal en el código?
Gracias por vuestra ayuda.

Sub Duplicar_Registro(nom_tabla As String, nom_campo As String, val_campo As String)
Dim rstOri As DAO.Recordset
Dim rstDes As DAO.Recordset
Dim rst_SQL As String
rst_SQL = "SELECT * FROM " & nom_tabla & " WHERE " & nom_campo & " = " & "'" & val_campo & "'"
Set rstOri = CurrentDb.OpenRecordset(rst_SQL)
Set rstDes = CurrentDb.OpenRecordset("SELECT * FROM " & nom_tabla, , dbAppendOnly)
Dim fld As Field
Do While Not rstOri.EOF
rstDes.AddNew
For Each fld In rstOri.Fields
If (fld.Attributes And dbAutoIncrField) = 0 Then
rstDes(fld.Name) = rstOri(fld.Name)
End If
Next
rstDes.Update
rstOri.MoveNext
Loop
rstOri.Close
Set rstOri = Nothing
Set rstDes = Nothing
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Bucle infinito al duplicar registros con Recordset

Publicado por José Carlos (3 intervenciones) el 16/02/2017 22:01:31
Pues después de mucho buscar, encontré la solución; antes de empezar el bucle Do While, hacer un .MoveLast y un .MoveFirst del Recordset rstOri y ya todo funciona correctamente.
No sé exactamente porqué, pero así hace lo esperado.
Por si a alguien le es de utilidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel
Val: 395
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Bucle infinito al duplicar registros con Recordset

Publicado por Manuel (171 intervenciones) el 17/02/2017 09:05:38
Llegue un poco tarde, pero la explicación de porque te pasa, es por el tipo de recordset que estás creando, concretamente estás creando un recordset de tipo dbOpenDynaset... Aunque no lo especificas (como si haces con el recordset rstDes que especificas dbAppendOnly), pues lo coge automáticamente de ese tipo cuando le metes una consulta así.

Y ese tipo de recordset es dinámico, igual que los dbOpenDynamic... En esos recordsets los datos se van modificando tal como se va cambiando los datos de las tablas sobre las que realmente estás leyendo/modificando/escribiendo los datos. No es una visión puntual de los datos.

Por lo anterior, cuando quieras hacer ciertas operaciones, pues tienes que hacer que mire que datos hay en ese momento de forma clara (es como una actualización), aunque sea solo para contar cuantos registros efectivamente tiene en ese momento (con RecordCount()). Y para ello, pues hay que ir al principio y después final, así mira que tiene realmente en ese momento puntual... que no tiene porque coincidir con lo que tiene unos minutos después. E incluso hay que hacerlo recién creado en recordset y cargado de datos.

hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Bucle infinito al duplicar registros con Recordset

Publicado por José Carlos (3 intervenciones) el 17/02/2017 18:16:44
Gracias por la explicación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel
Val: 395
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Bucle infinito al duplicar registros con Recordset

Publicado por Manuel (171 intervenciones) el 17/02/2017 20:52:05
Un placer, todos nos hemos encontrado con esto antes o después... y no se porque no suele estar mencionado en casi ningún sitio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar