Foros del Web » Programando para Internet » ASP Clásico »

¿Bug de ASP? Encuentra el error

Estas en el tema de ¿Bug de ASP? Encuentra el error en el foro de ASP Clásico en Foros del Web. Buenas a todos Tengo un pequeño problema con un código asp; En si son 2 funciones, una de esas llama a la otra, la cual ...
  #1 (permalink)  
Antiguo 21/01/2011, 09:22
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
Exclamación ¿Bug de ASP? Encuentra el error

Buenas a todos
Tengo un pequeño problema con un código asp;
En si son 2 funciones, una de esas llama a la otra, la cual le paso una variable por referencia.

Bueno el código es esté


Código ASP:
Ver original
  1. <!-- #include file="ArchivoConexion.asp" -->
  2.  
  3. <%
  4. call AbrirConexionBD
  5. sSQL= "SELECT * FROM tabla WHERE campoclavpri = 1 "  
  6. variable = GetRatingInfo (sSQL)
  7.  
  8. Function GetRatingInfo(sSQL)
  9.     Set rs = Conexion.Execute(sSQL) 'Ejecuto consulta que devuelve una fila
  10.     If Not rs.EOF Then
  11.         While Not rs.EOF    'Mientras que no termine (al tener 1 fila recorre una única vez)
  12.             Response.Write "Fields.Count value: " & rs.Fields.Count & "<br/>"  
  13.             For i=0 To rs.Fields.Count -1   'recorro los valores de esa fila
  14.            
  15.                 tamaarray =  Push (arrResult,rs(i)) 'le paso a la funcion push una variable por referencia, y un dato o valor
  16.                
  17.                 Response.Write "Item "& i & " value: " & rs(i) & "<br/>"
  18.                 Response.Write "arrResult "& i & " value: " & arrResult(i) & "<br/>" ' ACA, DENTRO DEL FOR, EL INDICE 0 DEL ARRAY ANDA
  19.                 response.flush()
  20.                
  21.             Next
  22.             Response.Write "arrResult "& 0 & " value: " & arrResult(0) & "<br/>" ' ACA, FUERA DEL FOR, EL INDICE 0 DEL ARRAY DA ERROR
  23.             rs.MoveNext
  24.         Wend
  25.     End If
  26.     GetRatingInfo = arrResult
  27. End Function
  28.  
  29. Function Push(ByRef mArray, ByVal mValue) ' función que recibe una variable y un valor
  30.  
  31.     If IsArray(mArray) Then 'si la variable es una array
  32.         If isnull(mValue) Then mValue = "NULL"
  33.         Redim Preserve mArray(UBound(mArray) + 1)   ' agrando el array y
  34.         mArray(UBound(mArray)) = mValue ' le pongo el valor
  35.     Else ' si la variable no es un array
  36.         If isnull(mValue) Then mValue = "NULL"
  37.         mArray = Array(mValue) ' la convierto en array y le pongo el valor (que se asigna a la posicion 0)
  38.  
  39.         'Redim Preserve mArray(0)   ' SOLUCIÓN AL ERROR
  40.         'mArray(0)= mValue          ' SOLUCIÓN AL ERROR
  41.     End If
  42.     Push = UBound(mArray) ' devuelvo el tamaño del array (no lo uso)
  43. End Function


Esta variable que se modifica por ser pasada por referencia es un array, que se va generando al recorrer un recordset.
A medida que le agrego los elementos voy mostrando en pantalla que el array esta funcionando bien.
El problema surge que cuando termino de asignar todos los datos al array, y intento mostrar la posición 0, me da un error:

error '80020009'
Exception occurred.


La solución alternativa que encontré esta comentada en el código
Que es al código:
mArray = Array(mValue)
agregarle
Redim Preserve mArray(0)
mArray(0)= mValue
Que en si no debería cambiar nada; pero con eso funciona.

Yo creo que el error esta en la creación del array de la forma
mArray = Array(mValue), pero no entiendo como primero funciona y luego no.

Las preguntas son:

1 - ¿Cual es el error?
2 - ¿Porque no me da dentro del FOR?
3 - ¿Porque redimencionar el array a las misma cantidad de elementos soluciona el error?
4 - ¿Quienes somos y de donde venimos?

bueno si alguno sabe estas respuestas (principalmente la 4) le agradecería mucho su respuesta!

saludos!
__________________
Tomarse un tiempo para redactar correctamente la pregunta, utilizando los signos de puntuación adecuados, es ganar tiempo y calidad en la respuesta.
  #2 (permalink)  
Antiguo 24/01/2011, 18:57
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

No leí todo el post a detalle, ahorita no hay oportunidad pero me llamó la atención que haces invocaciones a parámetros por referencia, que yo me acuerde vbscript solo trabaja con parámetros por valor.

Ya comprobaste que si funcionan estos llamados?

saludos
  #3 (permalink)  
Antiguo 25/01/2011, 02:21
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 5 meses
Puntos: 54
Respuesta: ¿Bug de ASP? Encuentra el error

Vbscript sí permite pasar valores por referencia, conozco scripts que tienen código por referencia y funcionan
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #4 (permalink)  
Antiguo 25/01/2011, 06:02
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
Respuesta: ¿Bug de ASP? Encuentra el error

Buenas y gracias por contestar,
No soy de usar mucho variables por referencia, pero en este caso era necesario;
y si funciona pasar por referencia, puesto que ya lo había usado y probado.
De todos modo hice una prueba sencilla y funcionó. Acá esta:

Código ASP:
Ver original
  1. <%
  2. 'SI todo funciona, los 2 valores deberían devolver "1"
  3. Dim varByVal, varByRef
  4. varByVal = 1
  5. varByRef = 2
  6. SwapValues varByVal, varByRef
  7.  
  8. Response.Write "<p>First: " & varByVal & "</p>"
  9. Response.Write "<p>Second: " & varByRef & "</p>"
  10.  
  11.  
  12. Sub SwapValues(ByVal varByVal, ByRef varByRef)
  13.     Dim iTemp
  14.    
  15.     iTemp = varByVal
  16.     varByVal = varByRef
  17.     varByRef = iTemp
  18. End Sub
  19. %>

saludos
  #5 (permalink)  
Antiguo 25/01/2011, 09:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

Ok, aclarada la duda mia de si existen o no los parámetros por referencia en vbscript, pasemos al código.

Y no le veo error ... de hecho lo copie y corrí en mi PC y no truena, la última linea me muestra "arrResult 0 value: 0" lo cual es correcto.
  #6 (permalink)  
Antiguo 25/01/2011, 09:51
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
Respuesta: ¿Bug de ASP? Encuentra el error

Es cierto, pero si intentas mover el response.write , bajo el rs.MoveNext, muestra el error.
Osea, en donde dice:

Código ASP:
Ver original
  1. ......
  2.          Next
  3.             Response.Write "arrResult "& 0 & " value: " & arrResult(0) & "<br/>" ' ACA, FUERA DEL FOR, EL INDICE 0 DEL ARRAY DA ERROR
  4.             rs.MoveNext
  5.         Wend
  6.  ......

Debe quedar así:

Código ASP:
Ver original
  1. ......
  2.          Next
  3.             rs.MoveNext
  4.             Response.Write "arrResult "& 0 & " value: " & arrResult(0) & "<br/>" ' ACA, FUERA DEL FOR, EL INDICE 0 DEL ARRAY DA ERROR
  5.         Wend
  6.  ......

Aun no entiendo porque pasa esto, puesto que solo el indice 0 es el que no funciona.
  #7 (permalink)  
Antiguo 25/01/2011, 11:19
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

Qué interesante ....

Independientemente que tu problema se soluciona quitando las lineas 11, 23 y 24 ... ¿qué tiene que ver llegar al EOF de un recordSet para que no puedas acceder al LBound de un Array?

Qué interesante ....
  #8 (permalink)  
Antiguo 25/01/2011, 11:33
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

ya

El problema es que seguramente al mover un puntero el recordSet, ese puntero esta ahora en la localidad de memoria correspondiente a la posición 0 del arreglo, supongo que si pudieras moverlo dos lugares te encimaría ahora dos casillas del arreglo.

Y supongo que es por que no declaraste que ibas a usar ese arreglo sino hasta que creaste el arreglo, dentro del FOR. La solución entonces es definir el arreglo antes, con algo como:

...
Redim arrResult(0)
variable = GetRatingInfo (sSQL)
...

Y funciona, ya lo probé.

Aunque claro esta que hay que limpiar tu código, no es obligatorio pero yo lo dejaría así:


Código ASP:
Ver original
  1. sSQL= "SELECT * FROM Usuarios WHERE Idusuario = 1 "
  2. Redim arrResult(0)
  3. variable = GetRatingInfo (sSQL)
  4.  
  5. Function GetRatingInfo(sSQL)
  6.     Set rs = Conexion.Execute(sSQL) 'Ejecuto consulta que devuelve una fila
  7.     If Not rs.EOF Then
  8.             Response.Write "Fields.Count value: " & rs.Fields.Count & "<br/>"  
  9.             For i=0 To rs.Fields.Count -1   'recorro los valores de esa fila
  10.            
  11.                 call Push (arrResult,rs(i)) 'le paso a la funcion push una variable por referencia, y un dato o valor
  12.                
  13.                 Response.Write "Item "& i & " value: " & rs(i) & "<br/>"
  14.                 Response.Write "arrResult "& i & " value: " & arrResult(i) & "<br/>" ' ACA, DENTRO DEL FOR, EL INDICE 0 DEL ARRAY ANDA
  15.                
  16.             Next
  17.             Response.Write "arrResult 0 value: " & arrResult(0) & "<br/>" ' ACA, FUERA DEL FOR, EL INDICE 0 DEL ARRAY DA ERROR
  18.     End If
  19.     GetRatingInfo = arrResult
  20. End Function
  21.  
  22. Sub Push(ByRef mArray, ByVal mValue) ' función que recibe una variable y un valor
  23.         If isnull(mValue) Then mValue = "NULL"
  24.         Redim Preserve mArray(UBound(mArray) + 1)   ' agrando el array y
  25.         mArray(UBound(mArray)) = mValue ' le pongo el valor
  26. End Sub

Saludos
  #9 (permalink)  
Antiguo 25/01/2011, 11:44
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
Sonrisa Respuesta: ¿Bug de ASP? Encuentra el error

Es que es muy extraño, por lo general no tengo problemas con este lenguaje a no ser por mis propios errores.

Porque ademas, dejando las lineas 11, 23 y 24, y descomentando las lineas 39 y 40, funciona perfectamente;
que en si estas 2 lineas no hacen mas que volver a colocar el mismo valor en el mismo indice del array.

La única explicación que encuentro es que la asignación de un valor de la forma
Código:
mArray = Array(mValue)
genera un puntero al valor "mValue" pero no lo copia a otro lugar de la memoria,
y al momento de llegar al EOF este valor se pierde.
En cambio, la asignación de la forma
Código:
mArray(0)= mValue
si copia el valor en otro lado de la memoria, y al llegar al EOF no causa problemas.

Esto también explicaría porque es que el indice 0 es el único que da error,
puesto que es el único que se asigna de la forma mArray = Array(mValue)
el resto de los indices entran en el if y se asignan de la manera mArray(i)= mValue

No he encontrado ningún dato sobre esto, pero de ser así, es un error del lenguaje.
  #10 (permalink)  
Antiguo 25/01/2011, 12:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

Deja tu código como lo tienes incialmente y solo declara el arreglo antes como te sugerí, con eso funciona; por ello estoy seguro que el problema es el que te comenté. Cuando tu declaras una variable el intérprete le reserva cierto espacio de memoria, como no declaras el arreglo, lo pone en la localidad siguiente al espacio reservado para el RS, y seguramente el puntero te plancha la localidad 0

Por eso se recomienda poner el Option Explicit y evitarte errores poco controlados como estos.

Es más, no definas el arreglo, solo declara las variables que usas:

option explicit
dim conexion, ConnString, variable, sSQL, rs, i, tamaarray, arrResult

Y con eso funciona, entonces ahora si NO es un error del lenguaje, el error esta entre el teclado y la silla

Saludos
  #11 (permalink)  
Antiguo 25/01/2011, 12:23
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
De acuerdo Respuesta: ¿Bug de ASP? Encuentra el error

Cita:
Iniciado por Myakire Ver Mensaje
ya

El problema es que seguramente al mover un puntero el recordSet, ese puntero esta ahora en la localidad de memoria correspondiente a la posición 0 del arreglo, supongo que si pudieras moverlo dos lugares te encimaría ahora dos casillas del arreglo.

Y supongo que es por que no declaraste que ibas a usar ese arreglo sino hasta que creaste el arreglo, dentro del FOR. La solución entonces es definir el arreglo antes, con algo como:

...
Redim arrResult(0)
variable = GetRatingInfo (sSQL)
...

Hice la prueba con una consulta de varios registros, y usando "move.next" y "move 2", para ver
si pasaba por arriba otro valor del indice, pero sigue marcando como único error el indice 0.

El problema con la solucion que propones, de declarar la variable antes de usarla,
es que el valor del indice 0 nunca se asigna. Cuando pasa por el codigo
Redim Preserve mArray(UBound(mArray) + 1)
El array comenzará a llenarse desde la posición 1 y no de la 0.
Tampoco puedo declararla dinamicamente "dim mArray()" porque cuando
vaya a utilizar el UBound me va a dar error.

Como solución igual esta la de colocar
mArray = Array(mValue)
y luego
mArray(0)= mValue

Esto funciona sin declarar el array ni nada. Eso muestra que las 2 formas de asignar el valor trabajan diferente.

Gracias igual por la atencion y saludos!
  #12 (permalink)  
Antiguo 25/01/2011, 12:29
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: ¿Bug de ASP? Encuentra el error

Si, lo noté pero es un error de lógica fácil de solventar

Escribiste antes de que terminara de editar mi mensaje:

Cita:
Es más, no definas el arreglo, solo declara las variables que usas:

option explicit
dim conexion, ConnString, variable, sSQL, rs, i, tamaarray, arrResult

Y con eso funciona, entonces ahora si NO es un error del lenguaje, el error esta entre el teclado y la silla

Saludos
Con eso, ya no hay duda. El problema es el que comenté.

Saludos
  #13 (permalink)  
Antiguo 25/01/2011, 12:59
Avatar de Javier01  
Fecha de Ingreso: febrero-2008
Ubicación: Montevideo
Mensajes: 261
Antigüedad: 16 años, 2 meses
Puntos: 31
Respuesta: ¿Bug de ASP? Encuentra el error

Con el primer código que puse, variando solo las lineas 22 y 23 para dejar el response.write bajo el rs.movenext, y
agregando el option explicit por lo cual definiendo todas las variables, aun así me sigue marcando el error.
Pero seguro como tu dices, el error sigue entre el teclado y la silla

Etiquetas: asp, bug, encuentra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.