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
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


0