Copiar contenido de un campo anterior con VBA

Estoy aprendiendo VBA Access porque creo que me puede ser util para el trabajo y podré automatizar algunas tareas de mi base de datos, pero aún tengo conocimientos muy básicos. El caso es que me he encontrado con una tarea susceptible de aplicación, he tratado de usar VBA pero no funciona. Probablemente lo que he hecho sea una barbaridad de novato, pero si alguien me puede decir porque no funciona y como sería correcto le estaría agradecido. Paso a describir el problema y el código:

Lo que pretendo es que en aquellos registros de una tabla donde el campo 'serie' sea nulo, se copie el valor del campo 'numero_procedimiento' del registro anterior y se actualize ese campo 'numero_procedimiento' del registro actual (donde se había encontrado el nulo). Y esto con todos los registros de la tabla.

Para ello lo que intento es conectar a la base actual (eso funciona con ayuda de una respuesta anterior), hacer un bucle para que recorra todos los registros, un if para buscar nulos y las instrucciones (métodos) a ejecutar sobre el recordset (aquí debe ser una barbaridad lo que hago a base de adaptar códigos que he visto). El código es:

Sub actualiza_nulo()
Dim miconexion As New ADODB.Connection
Set miconexion = CurrentProject.Connection
Dim instruccion_sql As String
instruccion_sql = "SELECT * FROM procedimientos"
Dim mirecordset As New ADODB.Recordset
mirecordset.Open instruccion_sql, miconexion
Dim mirecordsetclone As Integer
Do Until mirecordset.EOF
    If IsNull(mirecordset!serie) Then
        mirecordset.MoveLast
        mirecordsetclone = mirecordset!numero_procedimiento
        mirecordset.MoveNext
        mirecordset!numero_procedimiento = mirecordsetclone
    End If
mirecordset.MoveNext
Loop
mirecordset.Close
Set mirecordset = Nothing
miconexion.Close
Set miconexion = Nothing
End Sub

Y error que me sale en la ventana emergente es:

Se ha producido el error '3251' en tiempo de ejecución. El recordset actual no admite actualizaciones. Puede ser una limitación del proveedor o del tipo de bloqueo seleccionado.

Respuesta
2

Para editar un recordset, primero tienes que usar Edit, y luego Update para que te guarde los cambios. Además, tal como pones las instrucciones dentro del if, nunca te va a copiar el valor del registro anterior al que encuentra el nulo, pues lo mandas a coger el último valor del recordset. Tampoco te actualizará registros más allá del primero que tenga un nulo, por lo mismo de antes, que lo mandas al último registro y luego lo mueves al siguiente, en vez de volver al que estabas.

En definitiva, y sin entrar a valorar el código en sí, lo que está dentro del If tendría que ser así:

    If IsNull(mirecordset!serie) Then
        mirecordset.MovePrevious
        mirecordsetclone = mirecordset!numero_procedimiento
        mirecordset.MoveNext
        mirecordset.Edit
        mirecordset!numero_procedimiento = mirecordsetclone
        mirecordset.Update
    End If

Además tendrías que controlar que el primer nulo no fuera el primer registro, ya que en ese caso no hay registro anterior y te dará un error...

Aquí tienes otro ejemplo de cómo se podría hacer usando un sistema diferente: http://neckkito.xyz/nck/index.php/ejemplos/18-codigo/181-obtener-datos-del-registro-anterior 

Un saludo.


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas