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

RecordSet Vacio !! me da error !!

Estas en el tema de RecordSet Vacio !! me da error !! en el foro de ASP Clásico en Foros del Web. Hola esto me da un error cuando regresa al Do y se encuentra el recordset vacio.. Código HTML: <table width= "139" border= "0" > <tr> ...
  #1 (permalink)  
Antiguo 26/03/2007, 15:42
Avatar de Raspinu  
Fecha de Ingreso: agosto-2003
Ubicación: Barcelona
Mensajes: 76
Antigüedad: 20 años, 10 meses
Puntos: 0
RecordSet Vacio !! me da error !!

Hola esto me da un error cuando regresa al Do y se encuentra el recordset vacio..

Código HTML:
<table width="139" border="0"><tr><th>
<% If Tabla_1.Eof Then
	Response.Write "No Tenemos Datos"
	Else
Do While Cint (Tabla_1.Fields ("InterpreteIDTEMA"))=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof   %>
                       </th> </tr><tr><th>
     + <%Response.Write Tabla_1.Fields ("Interprete_Artista")%>
                        </th> </tr><tr>
<%Tabla_1.MoveNext
Loop
End If %>
                        </th></tr> </table> 
me da el error...... error '80020009' en la linea X....

Sabeis como podria solucionarlo.. las SQL me funcionan bien ya que el resultado es el deseado solo es que cuando llega al ultimo registro se encuentra vacio y produce el error

Gracias
__________________
Did-Web.com -Diseño y Desarrollo Web-
http://www.did-web.com

Última edición por Raspinu; 26/03/2007 a las 15:49 Razón: un error en el script.. jejej...
  #2 (permalink)  
Antiguo 26/03/2007, 16:40
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: RecordSet Vacio !! me da error !!

Una forma:

Código:
Do While Not Tabla_1.Eof 
   if Cint (Tabla_1("InterpreteIDTEMA"))=Cint (Tabla_2("IdTema")) Then %>
                       </th> </tr><tr><th>
     + <%Response.Write Tabla_1.Fields ("Interprete_Artista")%>
                        </th> </tr><tr>
<% end if
   Tabla_1.MoveNext
Loop
  #3 (permalink)  
Antiguo 26/03/2007, 17:14
Avatar de Raspinu  
Fecha de Ingreso: agosto-2003
Ubicación: Barcelona
Mensajes: 76
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: RecordSet Vacio !! me da error !!

Hola Myakire!

Gracias !

Con lo que me dijiste si soluciono el problema del error ya que no sale..
peerrrooo... parece ser que no saca todo la informacion deseada es como si el Recordset solo diera un Loop y se deja informacion de la proxima vuelta y no llegase al If .

No se si me explico, en cambio como lo tenia antes si que me daba bien todo el RecordSet pero daba el error en el ultimo loop cuando se encontraba el RecordSet vacio.

???? Y eso ??? No se como solucionarlo alguna idea??

Gracias
__________________
Did-Web.com -Diseño y Desarrollo Web-
http://www.did-web.com
  #4 (permalink)  
Antiguo 26/03/2007, 18:37
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: RecordSet Vacio !! me da error !!

mmm, a ver ...

He visto apenas algo, que tu preguntabas por los campos de dos recordSet diferentes!!

Deja modifico el código
  #5 (permalink)  
Antiguo 27/03/2007, 02:34
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 5 meses
Puntos: 7
Re: RecordSet Vacio !! me da error !!

Mover los registros de dos tablas diferentes de forma secuencial puede llevar a error y, lo mas probable, a unos resultados no esperados. Te recomiendo que leas una tabla y busques en la otra dentro del bucle:

Código:
<% If Tabla_1.Eof Then Response.Write "No Tenemos Datos" Else %> <table width="139" border="0"> <% Do while Not Tabla_1.Eof set tabla_2 = conn.execute("SELECT * FROM tabla2 WHERE idTEMA = " & Cint (Tabla_1.Fields ("InterpreteIDTEMA"))) if not tabla_2.EOF then %> <tr><th> + <%Response.Write Tabla_1.Fields ("Interprete_Artista")%> </th> </tr> <% end if Tabla_1.MoveNext Tabla_2.close() Loop %> </table> <% End If %>

Es una idea que, seguro MYakire va a mejorar



Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #6 (permalink)  
Antiguo 27/03/2007, 07:31
Avatar de CésarBalaguer  
Fecha de Ingreso: octubre-2006
Ubicación: en mi casa
Mensajes: 181
Antigüedad: 17 años, 8 meses
Puntos: 0
De acuerdo Re: RecordSet Vacio !! me da error !!

Me parece que solucionarias ese problema haciendo en tu select principal un join directo entre TABLA_1 y TABLA_2 asì recuperas ùnicamente los registros que necesitas, no das tantas vueltas con el loop y no necesitas hacer ningùn IF adentro de tu loop.

strSql = "SELECT Interprete_Artista "
strSql = strSql & "FROM TABLA_1 INNER JOIN TABLA_2 ON "
strSql = strSql & "(TABLA_1.INTERPRETEIDTEMA=TABLA2.IDTEMA) "
set mADO = conn.execute(strSql)


<%
If not mADO.Eof Then
%>
<table width="139" border="0">
<%
Do while Not Tabla_1.Eof %>
<tr><th>
<%Response.Write mADO.Fields ("Interprete_Artista")%>
</th> </tr>
<%
mADO.MoveNext
Loop
mADO.close
else
response.write("No tenemos datos")
end if
set mADO=Nothing
set Conn=Nothing
%>
</table>


Un principio bàsico de las bases de datos es evitar en todo lo que sea posible los "SELECT * " esto se debe a un tema de performance, la informaciòn solicitada en un select puede estar dentro del mismo ìndice y hacer un select * implica que el motor de base de datos deba ir al archivo fìsico para sacar la informaciòn y eso demanda recurso.

Otra cosa que se recomienda pero esta vez en programaciòn es evitar las preguntas dentro de bucles, claro està, casi nunca se puede hacer esto, pero si hay forma de hacerlo entonces en buena hora, esto se debe a que por cada vuelta que de el programa va a realizar la misma pregunta y eso demanda tiempo y recursos

ahora si unes ambos casos estaràs demandando de un tiempo mucho mayor para la ejecuciòn de tu programa y eso afecta directamente al performance, un select con dos tablas anilladas te evitarìa la pregunta dentro de loop y si das en tu select ùnicamente las columnas que requieres estaràs ahorrando otro poco mas de tiempo de ejecuciòn.
  #7 (permalink)  
Antiguo 27/03/2007, 08:08
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: RecordSet Vacio !! me da error !!

Si, es correcto todo lo anterior, pero no es exactamente lo que Raspinu necesita. Veamos:

El código original que regresa todo bien pero marca error es este:
Código:
<table width="139" border="0"><tr><th>
<% If Tabla_1.Eof Then
	Response.Write "No Tenemos Datos"
	Else
Do While Cint (Tabla_1.Fields ("InterpreteIDTEMA"))=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof   %>
                       </th> </tr><tr><th>
     + <%Response.Write Tabla_1.Fields ("Interprete_Artista")%>
                        </th> </tr><tr>
<%Tabla_1.MoveNext
Loop
End If %>
Marca error por que en el mismo While pregunta por el valor del campo Tabla_1("InterpreteIDTEMA") que claro esta cuando se llega al EOF ya no existe. Ello se soluciona colocando un par de asignaciones:

Código:
<table width="139" border="0"><tr><th>
<% If Tabla_1.Eof Then
	Response.Write "No Tenemos Datos"
	Else
IdInterprete = CInt(Tabla_1.Fields ("InterpreteIDTEMA"))
Do While IdInterprete=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof   %>
                       </th> </tr><tr><th>
     + <%Response.Write Tabla_1.Fields ("Interprete_Artista")%>
                        </th> </tr><tr>
<%Tabla_1.MoveNext
     If Not Tabla_1.EOF Then IdInterprete = CInt(Tabla_1.Fields ("InterpreteIDTEMA")) End If
Loop
End If %>
Y listo!! (Luego pasaremos a la optimización del código) con ello la idea es la misma y el código dejara de "tronar"

Ahora veamos la sugerencia:

Cita:
strSql = "SELECT Interprete_Artista "
strSql = strSql & "FROM TABLA_1 INNER JOIN TABLA_2 ON "
strSql = strSql & "(TABLA_1.INTERPRETEIDTEMA=TABLA2.IDTEMA) "
set mADO = conn.execute(strSql)
Este Query nos regresa todas las filas de Tabla_1 y Tabla_2 donde sus campos INTERPRETEIDTEMA y IDTEMA respectivamente sean iguales, pero no es lo que el ciclo original quiere:

Cita:
Do While Cint (Tabla_1.Fields ("InterpreteIDTEMA"))=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof %>
Ahí se ve que se necesitan todos los registros de Tabla_1 cuyo campo InterpreteIDTEMA sea igual al que en el registro X corresponda al campo IdTema de la tabla_2. Es decir, algo como:

Cita:
strSql = "SELECT Interprete_Artista " &_
"FROM TABLA_1 " &_
"WHERE INTERPRETEIDTEMA= " & TABLA2.IDTEMA
Tabla_1.Open strSQL, ObjConn
...
Y todo lo demás, pues ya aplica


Saludos
  #8 (permalink)  
Antiguo 27/03/2007, 08:12
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 5 meses
Puntos: 7
Re: RecordSet Vacio !! me da error !!



Sin lugar a dudas es el mejor metodo. Ni recargas el bucle ni la BD. Permiteme afinar un poco mas y posicionar el tag de final de tabla en su sitio correspondiente y quedará perfecto:

Código:
strSql = "SELECT Interprete_Artista "
strSql = strSql & "FROM TABLA_1 INNER JOIN TABLA_2 ON "
strSql = strSql & "(TABLA_1.INTERPRETEIDTEMA=TABLA2.IDTEMA) "
set mADO = conn.execute(strSql)


<% 
If not mADO.Eof Then
%>
<table width="139" border="0">
<% 
Do while Not Tabla_1.Eof  %>
      <tr><th>
            <%Response.Write mADO.Fields ("Interprete_Artista")%>
      </th> </tr>
<%
     mADO.MoveNext
Loop 
mADO.close
%>
 </table>
<%
else
response.write("No tenemos datos")
end if
set mADO=Nothing
set Conn=Nothing
%>
 
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #9 (permalink)  
Antiguo 27/03/2007, 08:16
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: RecordSet Vacio !! me da error !!

Tiene el mismo detallito que mencioné un post arriba
  #10 (permalink)  
Antiguo 27/03/2007, 08:26
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 5 meses
Puntos: 7
Re: RecordSet Vacio !! me da error !!

Quizás si Raspinu nos pusiera las dos sentencias SQL que usa para ambos recordset se podría afinar mejor: Es decir, no se si necesita todos los registros de tabla_2 y solo aquellos de tabla_1 que sean iguales en su campo IDTEMA al de INTERPRETEIDTEMA de la tabla_1 (en su caso si se haría tal y como tu dices) o bien solo aquellos registros de tabla_2 en el que IDTEMA sea igual a INTERPRETEIDTEMA de la tabla_1 (en cuyo caso sería más eficiente el uso de un JOIN tal como CesarBalaguer argumenta)

En todo caso, recuerda siempre maquetar correctamente las marcas HTML ya que en IE se ven muy bien pero hacen extraños en Mozilla y derivados.

Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #11 (permalink)  
Antiguo 29/03/2007, 12:38
Avatar de Raspinu  
Fecha de Ingreso: agosto-2003
Ubicación: Barcelona
Mensajes: 76
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: RecordSet Vacio !! me da error !!

Hola Gracias por las colaboraciones....



Para Tabla_1....
SQLI ="SELECT * FROM Reggae_Interprete, Reggae_Tema, Reggae_CD WHERE InterpreteIDTEMA=IdTema AND IdCD='"&Disco&"' AND Tema_CD='"&Disco&"'"

y Para Tabla_2...
SQL ="SELECT * FROM Reggae_CD, Reggae_Tema, Reggae_Riddim WHERE IdRiddim=Tema_Riddim AND IdCD='"&Disco&"' AND Tema_CD='"&Disco&"' "

Donde Disco lo traigo con un Request.String..

Igual es una aberracion pero asi es como conseguia los resultados deseados peor claro me daba el error.. tengo qeu probar lo qeu comentavais...


Gracias de nuevo
__________________
Did-Web.com -Diseño y Desarrollo Web-
http://www.did-web.com
  #12 (permalink)  
Antiguo 29/03/2007, 14:01
Avatar de CésarBalaguer  
Fecha de Ingreso: octubre-2006
Ubicación: en mi casa
Mensajes: 181
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: RecordSet Vacio !! me da error !!

----*
Para Tabla_1....
SQLI ="SELECT * FROM Reggae_Interprete, Reggae_Tema, Reggae_CD WHERE InterpreteIDTEMA=IdTema AND IdCD='"&Disco&"' AND Tema_CD='"&Disco&"'"

y Para Tabla_2...
SQL ="SELECT * FROM Reggae_CD, Reggae_Tema, Reggae_Riddim WHERE IdRiddim=Tema_Riddim AND IdCD='"&Disco&"' AND Tema_CD='"&Disco&"' "
----*
¿Estas usando 3 tablas en tu clausula FROM?
¿En que parte del WHERE las relacionas?
  #13 (permalink)  
Antiguo 29/03/2007, 14:09
Avatar de CésarBalaguer  
Fecha de Ingreso: octubre-2006
Ubicación: en mi casa
Mensajes: 181
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: RecordSet Vacio !! me da error !!

Sobre este mensaje:
-------------------
Ahora veamos la sugerencia:

Cita:
strSql = "SELECT Interprete_Artista "
strSql = strSql & "FROM TABLA_1 INNER JOIN TABLA_2 ON "
strSql = strSql & "(TABLA_1.INTERPRETEIDTEMA=TABLA2.IDTEMA) "
set mADO = conn.execute(strSql)

Este Query nos regresa todas las filas de Tabla_1 y Tabla_2 donde sus campos INTERPRETEIDTEMA y IDTEMA respectivamente sean iguales, pero no es lo que el ciclo original quiere:


Cita:
Do While Cint (Tabla_1.Fields ("InterpreteIDTEMA"))=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof %>
----------------------*
si se dan cuenta, en el while iguala tabla1(interpreteidtema) con tabla2(idtema) es decir, la condiciòn es que la columna de la base de datos interpreteidtema de la tabla1 sea igual a la columna idtema de la tabla2; (eso es solucionable con un JOIN, luego viene una condiciòn tabla1.EOF, eso no es una condicion sino el estado de un cursor, eso devuelve un valor lògico que indica si el cursor està al final del archivo, cosa que facilmente podrìa ser condiciòn ùnica del while si la primera pregunta forma parte del query.

en programaciòn, mientras menos preguntas se hagan, màs ràpido es el programa.
  #14 (permalink)  
Antiguo 30/03/2007, 16:58
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: RecordSet Vacio !! me da error !!

Cita:
Iniciado por CésarBalaguer Ver Mensaje
Sobre este mensaje:
-------------------
Ahora veamos la sugerencia:

Cita:
strSql = "SELECT Interprete_Artista "
strSql = strSql & "FROM TABLA_1 INNER JOIN TABLA_2 ON "
strSql = strSql & "(TABLA_1.INTERPRETEIDTEMA=TABLA2.IDTEMA) "
set mADO = conn.execute(strSql)

Este Query nos regresa todas las filas de Tabla_1 y Tabla_2 donde sus campos INTERPRETEIDTEMA y IDTEMA respectivamente sean iguales, pero no es lo que el ciclo original quiere:


Cita:
Do While Cint (Tabla_1.Fields ("InterpreteIDTEMA"))=Cint (Tabla_2.Fields ("IdTema")) AND Not Tabla_1.Eof %>
----------------------*
si se dan cuenta, en el while iguala tabla1(interpreteidtema) con tabla2(idtema) es decir, la condiciòn es que la columna de la base de datos interpreteidtema de la tabla1 sea igual a la columna idtema de la tabla2; (eso es solucionable con un JOIN, luego viene una condiciòn tabla1.EOF, eso no es una condicion sino el estado de un cursor, eso devuelve un valor lògico que indica si el cursor està al final del archivo, cosa que facilmente podrìa ser condiciòn ùnica del while si la primera pregunta forma parte del query.

en programaciòn, mientras menos preguntas se hagan, màs ràpido es el programa.
Pues no le veo el JOIN por ningún lado

Cita:
la condiciòn es que la columna de la base de datos interpreteidtema de la tabla1 sea igual a la columna idtema de la tabla2;
La condición es que es que la columna de la base de datos interpreteidtema de la tabla1 sea igual al valor que tiene el campo idTema de la tabla2 en el registro que este posicionado.

Con ese código no se sabe que operaciones hizo el usuario para posicionar el cursor de Tabla_2 en el registro en el que esta. No le veo el JOIN, insisto.
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 19:55.