26 agosto 2006

Errores de programación (III)

Volvemos a hablar de errores de programación por tercera vez. Lo raro es que trabajando en desarrollo de aplicaciones sólo sea la tercera vez.

El siguiente código, de Visual Basic .NET, donde Rs y Rs2 son dos recordset abiertos casi a la par:

ReDim Preserve EstrDatos(i)
With EstrDatos(i)
.NombreCli = Rs.Fields("Nombre").Value & " " & Rs.Fields("Apellidos").Value
.Codigo = Rs.Fields("Codigo").Value

.Total = PuntosSep(Rs2.Fields("Debe").Value)

.Bloque = CStrAv(Rs.Fields("Bloque").Value)
.Esc = CStrAv(Rs.Fields("Escalera").Value)
.Piso = CStrAv(Rs.Fields("Piso").Value)
.Letra = CStrAv(Rs.Fields("Letra").Value)
.CP = CStrAv(Rs.Fields("CP").Value)
.Poblacion = CStrAv(Rs.Fields("Poblacion").Value)
.Provincia = CStrAv(Rs.Fields("Provincia").Value)

.Saldo = PuntosSep(Rs2.Fields("Saldo").Value)
.Sello = PuntosSep(Rs2.Fields("Sello").Value)

(...)
End With

da el siguiente fallo:

Excepción no controlada del tipo System.Runtime.InteropServices.COMException en adodb.dll. Información adicional: El valor BOF o EOF es True, o el actual registro se eliminó; la operación solicitada requiere un registro actual.

Ahora bien, basta cambiar una sola línea de sitio, concretamente la quinta, y dejar el fragmento de código así:

ReDim Preserve EstrDatos(i)
With EstrDatos(i)
.NombreCli = Rs.Fields("Nombre").Value & " " & Rs.Fields("Apellidos").Value
.Codigo = Rs.Fields("Codigo").Value
.Bloque = CStrAv(Rs.Fields("Bloque").Value)
.Esc = CStrAv(Rs.Fields("Escalera").Value)
.Piso = CStrAv(Rs.Fields("Piso").Value)
.Letra = CStrAv(Rs.Fields("Letra").Value)
.CP = CStrAv(Rs.Fields("CP").Value)
.Poblacion = CStrAv(Rs.Fields("Poblacion").Value)
.Provincia = CStrAv(Rs.Fields("Provincia").Value)

.Total = PuntosSep(Rs2.Fields("Debe").Value)
.Saldo = PuntosSep(Rs2.Fields("Saldo").Value)
.Sello = PuntosSep(Rs2.Fields("Sello").Value)
(...)
End With


y se resuelve el problema.

Quizá sea alguna operación extraña del compilador que, para optimizar la velocidad, eliminaba Rs2 después de haber, teóricamente, terminado de trabajar con él, o un simple fallo de programación del propio compilador.

No hay comentarios: