Access - Subíndice fuera del intervalo

 
Vista:
sin imagen de perfil

Subíndice fuera del intervalo

Publicado por Mercedes (22 intervenciones) el 29/06/2016 13:08:38
Estoy trabajando con Access 2003 y Dao y el propósito de esta función es dinamizar la busqueda de datos y el índice superior de la matriz. La idea para ello es contar la cantidad de registros y guardar en la matriz el dato del campo [Apellido] para utilizar en otro procedimiento del mismo formulario.
Luego de ejecutar el código paso a paso al recorrer los registros con la instrucción For... Next visualizo el dato de cada campo [Apellido] pero la matriz resulta vacía e indica "Subíndice fuera del intervalo"
Es la primera vez que uso DAO y matrices por eso estuve leyendo la ayuda y los temas en internet y tendría que ver con el límite inferior de la matriz, traté algunas modificaciones incluyendo usar Option Base 1 pero no me resultaron

Este es el código original de la función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Function Busqueda()
Dim DelControl() As String
Dim TotalReg As Long
Dim DB As Database
Dim RS As DAO.Recordset
 
Set DB = CurrentDb()
Set RS = DB.OpenRecordset("SELECT Apellido FROM Empleados WHERE Delegado = True")
 
RS.MoveLast
 
TotalReg = RS.RecordCount
 
 
ReDim DelControl(TotalReg)
 
 
RS.MoveFirst
 
Do While Not RS.EOF
For i = 0 To TotalReg
    DelControl(i) = (RS![Apellido])
    RS.MoveNext
Next i
Loop
 
RS.Close
DB.Close
End Function

Agradecería me ayuden a encontrar el error.
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
sin imagen de perfil

Subíndice fuera del intervalo

Publicado por Enrique Heliodoro (1664 intervenciones) el 29/06/2016 15:48:19
Poca claridad en ese código expuesto.

Lo primero, el bucle FOR dará error porque comienza en cero y su limite es el numero de registros (que comienzan a contar en uno)
.- conclusión: se le exige un numero superior a los disponibles
.- solución = quitarle uno al limite superior
..- antes ==> For i = 0 To TotalReg
..- después ==> For i = 0 To TotalReg -1

Otro error, según esa disposición se inicia un bucle
(Do ... Loop)

dentro de el otro bucle
(For ... Next)

y en el bucle interno se ejecuta una asignación
DelControl(i) = (RS![Apellido])

Pero ... esa asignación avanza al bucle DO ... Loop
RS.MoveNext

Con lo que al llegar al final del bucle interno (que al finalizar actualmente con un error puede romper cualquier esquema), reitero: al llegar al final el bucle interno, se llega con el apuntador en el ultimo registro del bucle externo
.- conclusión: solo se ejecuta una vez (lo que lo hace innecesario)
. -solución: eliminar el bucle (Do ...Loop) por ser intrascendente.

Ojo con la memoria DE TRABAJO que consumen las matrices (su velocidad tiene un precio bastante alto).

Yo la reconstruiría asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Function Busqueda()
'creamos las variables, el 'problema' es que al salir del procedimiento se pierden TODAS por cuestiones de AMBITO
'Las que se desean utilizar en otras ubicaciones, deberían estar declaradas a nivel de modulo (en referencia a 'Del_Control')
Dim DelControl() As String, RS As DAO.Recordset, i as Long
'Cargamos el recordset
Set RS = CurrentDb.OpenRecordset("SELECT Apellido FROM Empleados WHERE Delegado <> 0")
'Evaluamos si hay contenido a tratar
IF RS.RecordCount = 0 Then Exit sub ' añadir mensaje si se desea, pero si no hay registros continuar carece de sentido
'Lo hay asi que tomamos a RS como objeto por defecto
With RS
'Agitamos el recordset
.MoveLast: .MoveFirst
'Adaptamos la matriz a nuestra necesidad
ReDim DelControl(.RecordCount)
'Comenzamos con el bucle (bien dimensionado)
 For i = 0 To .RecordCount -1
'Adjudicamos al elemento (i) el valor de recordset
 DelControl(i) = !Apellido
'y avanzamos el recorset
 .MoveNext
'también avanzamos el bucle
 Next i
'cerramos el recorset
 .Close
' fin de la asignación por defecto
End With
' liberamos la memoria DE TRABAJO utilizada
 Set RS = Nothing
 End Function
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