Los Foros de ASPTutor.com
Home | Perfil | Registrarse | Temas Activos | Miembros | Buscar | FAQ
Usuario:
Password:
 Todos los Foros
 ADO
 Ciclo do while
 Foro Bloqueado  Tema Bloqueado


Autor Temas
jenqu
Junior Member


244 Posts
Mensajes - 12 Dec 2003 :  18:38:27  Ver Perfil  Enviar Email
Hola, estoy intentando hacer un do while para mostrar unos datos de la base de datos. El problema es que tengo que realizar la conexion dentro del ciclo por lo que se abre y se cierra continuamente. Supongo que no está muy bien hacer esto, pero no he encontrado otra forma. Tengo dos recordset de dos tablas relacionadas y no me queda otro remedio.
Aun así no me funciona porque si cierro la conexion dentro del ciclo, me da el error de que no se puede hacer con el objeto cerrado y si no lo cierro, logicamente me dice que lo tengo que cerrar.
Alguien me puede decir qué hago mal, o si hay otra manera de hacerlo?
Os pongo la parte de mi código que me da el error:

<%do while not rs.eof
cadsql2="select * from Descargas_Clientes where Cliente="&rs("id_cliente")
rs2.open cadsql2, conexion2,2
%>

<tr><td><%=rs("empresa")%></td>
<td>

<%response.write(rs2.recordcount)%>

</td>

<%rs2.close
conexion2.close
rs.movenext

loop%>

</tr></table>

Muchas gracias...

jenqu
Junior Member


244 Posts
Posted - 15 Dec 2003 :  16:12:18  Ver perfil  Enviar e-mail
Hola otra vez, no me puede ayudar nadie? Por favor, que me estoy volviendo loca... He descubierto que si quito la linea del do while, la del rs.movenext y el loop, osea la parte del ciclo, funciona perfectamente. Pero claro, solo sale un registro... Por qué no puedo recorrer los recordset? Ayuda, plis. Os pongo todo el código a ver si así...

<table>

<!--#include file= ../include/conexion.inc-->
<%cadsql="select * from clientes order by empresa"
rs.open cadsql, conexion

do while not rs.eof

cadsql2="select * from Descargas_Clientes where Cliente="&rs("id_cliente")
rs2.open cadsql2, conexion2, 1
%>

<tr><td><%=rs("empresa")%></td>
<td>

<%response.write(rs2.recordcount)%>

</td><td>

<%rs2.close
conexion2.close
rs.movenext
loop
%>

</table>

El error es el siguiente, en la linea donde pone rs2.open cadsql2, conexion2, 1:

ADODB.Recordset (0x800A0E7D)
Operación no permitida en un objeto que hace referencia a una conexión cerrada o no válida.

Muchas gracias.

Inicio Pagina

buho_nero
Moderator

España
1316 Posts
Posted - 16 Dec 2003 :  11:21:27  Ver perfil  Enviar e-mail
¿Por qué crees que tienes que abrir y cerrar conexion2 en cada paso del ciclo?

Inicio Pagina

jenqu
Junior Member


244 Posts
Posted - 16 Dec 2003 :  11:58:22  Ver perfil  Enviar e-mail
Pues no estoy segura, pero es lo único que se me ha ocurrido.
Me explico:
Tengo la tabla Clientes y la tabla Descargas_Clientes y quiero mostrar el nombre de la empresa del Cliente, que pertenece a la tabla Clientes y a su vez el número de descargas de ese cliente, es decir el número de registros o recordcount que está relacionado con ese cliente y que pertenece a la table Descargas_CLientes. (Las dos tablas están relacionadas, lógicamente)
Si no abro y cierro la conexion2 dentro del ciclo, me muestra siempre el mismo recordcount, o sea el primero.

No sé, alguna otra idea? Muchas gracias.

Inicio Pagina

buho_nero
Moderator

España
1316 Posts
Posted - 16 Dec 2003 :  16:16:43  Ver perfil  Enviar e-mail
Deberías mirarte a fondo ADO y SQL.
Respecto a las conexiones, debes verlas como caminos a una fuente de datos, puedes recorrerlos las veces que quieras y usar tantos vehículos (recordsets) como quieras (con un límite claro). Con lo que si las consultas se hacen sobre la misma BD sólo necesitas una conexión.
Respecto al RecordCount, no tiene sentido abrir un "SELECT * ..." para contar los registros, es mucho mejor sacar partido a las herramientas de SQL:
"SELECT count(*) as cuenta FROM tabla"

Y para tu problema concreto, se puede hacer desde una única sentencia SQL:

SELECT empresa,count(*) as cuenta FROM Clientes INNER JOIN Descargas_Clientes ON Clientes.ic_cliente=Descargas_Clientes.id_cliente GROUP BY id_cliente

Si sólo buscas un cliente concreto le añades una clausula WHERE o HAVING.

Inicio Pagina

jenqu
Junior Member


244 Posts
Posted - 16 Dec 2003 :  17:01:03  Ver perfil  Enviar e-mail
Vaya, pues si que es verdad que estoy verde. En fin, que ya lo he solucionado y me miraré lo que me has comentado.
Muchas gracias, buho_nero.

Inicio Pagina

jenqu
Junior Member


244 Posts
Posted - 17 Dec 2003 :  11:06:35  Ver perfil  Enviar e-mail
Hola, ya estoy aquí otra vez... Había solucionado lo del ciclo pero resulta que la sentencia me da un error:

Microsoft JET Database Engine (0x80040E21)
Ha intentado ejecutar una consulta que no incluye la expresión especificada 'Empresa' como parte de una función de agregado.

La he escrito tal y como me la has pasado y me he mirado todo lo que he encontrado de inner join y count, pero no doy con el error... Otra ayudita, plis?


Inicio Pagina

buho_nero
Moderator

España
1316 Posts
Posted - 18 Dec 2003 :  16:30:34  Ver perfil  Enviar e-mail
La consulta que te mandé no puedes verla de una forma literal, yo no conozco los nombre de los campos en tus tablas. "empresa" es el nombre que supuse para el campo donde tienes almacenado el nombre de las empresas, supongo que en la tabla de "Clientes".

Inicio Pagina

jenqu
Junior Member


244 Posts
Posted - 23 Dec 2003 :  10:04:00  Ver perfil  Enviar e-mail
Hola y gracias por tu contestación.
La consulta no me la he tomado de forma literal, por supuesto que he adaptado el nombre de los campos y es por eso que no entendía lo que pasaba.
Al final he desistido y en vez de hacerlo todo en un consulta he abierto dos recordsets. Ya sé que no es tan correcto, pero no he encontrado otra solución...
Gracias, buho_nero.

Inicio Pagina

   
 Foro Bloqueado  Tema Bloqueado
Ir a:
Los Foros de ASPTutor.com Los Foros de ASPTutor.com
Ir al principio de la Página

 Imprimir Tema
 

Descargas de manuales¦ Ejemplos de código ¦ Artículos mas visitados ¦ Envía tu articulo ¦ Foros ¦
  Libro de visitas ¦Crea un enlace con ASPTutor 
 

    © 2001-Hasta hoy  Pedro Rufo Martín  contactar