Visual Basic para Aplicaciones - Crear valores de un campo con dos condicionales

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de Carlos
Val: 2
Ha aumentado su posición en 3 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Crear valores de un campo con dos condicionales

Publicado por Carlos (1 intervención) el 28/03/2020 10:53:06
Buenos días, he compuesto el código, pero me da un error en su parte final y no entiendo como solucionarlo. Expongo a continuación mi problema a ver si alguien puede echarme una mano.

Tengo una tabla de Access en la que trato de automatizar la creación de datos del campo signatura (cuando éste está en blanco) a partir del campo caja.

Si el valor del campo caja de ese registro es igual al valor del campo caja del registro anterior, entonces se copia el campo signatura de ese registro anterior y ese será el valor de signatura en el registro actual.

Si por el contrario, el valor del campo caja es distinto en el registro anterior, entonces habría que sumarle 1 al valor de signatura del registro anterior. Como signatura es un campo cadena (ej.: 0101, 0102, 0103..) lo que hago es con una función seleccionar el último cáracter, convertirlo a número, sumarle 1, convertirlo a cadena y componer la actual signatura con la conjunción de los tres primeros cáracteres y el cuarto al que le he sumado 1 previamente.

Este es el código que he escrito:

Option Compare Database
Option Explicit
Sub bucle_signatura()
 
Dim miconexion As New ADODB.Connection
Set miconexion = CurrentProject.Connection
 
Dim instruccion_sql As String
instruccion_sql = "SELECT * FROM Tabla1 "

Dim mirecordset As New ADODB.Recordset
mirecordset.Open instruccion_sql, miconexion, adOpenKeyset, adLockOptimistic
 
Dim mirecordsetclone As String
Dim caja_anterior As Integer
Dim mirecordsetclone2 As String
Dim derecha_signatura As Integer
Dim izquierda_signatura As String
Dim nuevo_digito As Integer
 
Do Until mirecordset.EOF
 
    If IsNull(mirecordset!signatura) Then
        mirecordset.MovePrevious
        caja_anterior = mirecordset!Caja
        mirecordset.MoveNext
    End If
 
    If (mirecordset!Caja) = caja_anterior Then
        mirecordset.MovePrevious
        mirecordsetclone = mirecordset!signatura
        mirecordset.MoveNext
        mirecordset!signatura = mirecordsetclone
        mirecordset.Update
    Else
        mirecordset.MovePrevious
        mirecordsetclone2 = mirecordset!signatura
        izquierda_signatura = Left(mirecordsetclone2, 3)
        nuevo_digito = Val(Right(mirecordsetclone2, 1)) + 1
        derecha_signatura = CStr(nuevo_digito)
        mirecordset.MoveNext
        mirecordset!signatura = izquierda_signatura & derecha_signatura
        mirecordset.Update
    End If
   
mirecordset.MoveNext
Loop
 
MsgBox "Se han introducido los valores del campo Caja/signatura_archivo"
 
mirecordset.Close
Set mirecordset = Nothing
miconexion.Close
Set miconexion = Nothing
 
End Sub

El error que me da al intentar ejecutar el código es:
Se ha producido el error '3021' en tiempo de ejecución:
El valor de BOF o EOF es True, o el catual registro se eliminó; la operació solicitada requiere de un registro actual.

Y al presionar el botón de depurar me selecciona la parte correspondiente a:
mirecorsetclone2 = mirecordset!signatura
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