anidamiento de conexiones de base de datos

22/10/2005 - 11:23 por Enrique | Informe spam
hola a todos,

una vez hecho el carrito de compra, quiero dar a la empresa un acceso a los
pedidos, para ello dispongo que un combo que lista los clientes y una vez se
elige uno se muestran los datos del cliente elegido asi como una lista de
todos sus pedidos.

para hacer esto, rastreo primero los datos de pedidos. hasta aqui todo me va
bien pero cuando dentro de cada pedido, trato de mostrar los detalles de
pedidos, me da problemas.

he intentado hacerlo de varias formas pero imposible. visto que se trata de
2 select (uno para los pedidos y otro para los detalles de pedidos), creo 2
recordset sobre la misma conexion pero no funciona. tambien lo he intentado
llamando a un procedimiento para poder recrear la conexion y acceder a los
detalles de pedidos pero parecer ser que a ASP no le gusta el anidamiento de
conexiones aunque sea indirecto (llamada a procedimiento).

resumiendo, no me funcionan 2 recordset sobre la misma conexion o sobre
conexiones distintas mediante llamada a procedimiento.

¿sabeis como se puede hacer esto?


muchas gracias de antemano por su ayuda

Preguntas similare

Leer las respuestas

#1 Gatón
22/10/2005 - 15:31 | Informe spam
Hola:

En general y por múltiples razones, puedes buscar el tema en la web y
encontraras muchos articulos al respecto ya que es un tema importante, se
debe siempre liberar al servidor de cualquier carga innecesaria. Entonces
los criterios no son los mismos que en las aplicaciones de por ejemplo VB.
En las aplicaciones ASP se abre la conexión se hace la consulta y se cierra
la conexion.
Con ese esquema no tendras problemas en abrir tu conexión hacer un SELECT
para poblar el combo de clientes y de inmediato cierras la conexión (que
tampoco lo veo muy buen sistema ya que me imagino si la empresa es la
telefónica y tienes que cargar en tu combo 3 millones de clientes la cosa se
pondría fea y entonces si ya tienes que comenzar a filtrar los clientes por
algunos parametros ¿porque mejor no filtras en serio y simplemente ubicas el
cliente y ya no necesitas el primer combo?) bueno me fui lejos...sigo: luego
cuando el usuario decida seleccionar un cliente (podria pasar una hora y la
conexion abierta) abre la conexión y otro SELECT pobraría el segundo combo.

Disculpa las opiniones, un abrazo

Saludos

Enrique Medina
Santiago de Chile




"Enrique" escribió en el mensaje
news:
hola a todos,

una vez hecho el carrito de compra, quiero dar a la empresa un acceso a


los
pedidos, para ello dispongo que un combo que lista los clientes y una vez


se
elige uno se muestran los datos del cliente elegido asi como una lista de
todos sus pedidos.

para hacer esto, rastreo primero los datos de pedidos. hasta aqui todo me


va
bien pero cuando dentro de cada pedido, trato de mostrar los detalles de
pedidos, me da problemas.

he intentado hacerlo de varias formas pero imposible. visto que se trata


de
2 select (uno para los pedidos y otro para los detalles de pedidos), creo


2
recordset sobre la misma conexion pero no funciona. tambien lo he


intentado
llamando a un procedimiento para poder recrear la conexion y acceder a los
detalles de pedidos pero parecer ser que a ASP no le gusta el anidamiento


de
conexiones aunque sea indirecto (llamada a procedimiento).

resumiendo, no me funcionan 2 recordset sobre la misma conexion o sobre
conexiones distintas mediante llamada a procedimiento.

¿sabeis como se puede hacer esto?


muchas gracias de antemano por su ayuda



Respuesta Responder a este mensaje
#2 Enrique
22/10/2005 - 18:53 | Informe spam
gracias por tu ayuda pero no trato de poblar 2 combos sino a partir de un
combo de clientes del cual saco el idCliente obtengo todos los pedidos y
para cada pedido el detalle de este pedido.

el 1º rastreo con conexion a BD me va bien. la cosa se complica cuando
intento mostrar los detalles de cada pedido. en teoria es solo un nuevo
SELECT anidado en el recorrido del primer SELECT, es decir un nuevo
recordset para detalles de pedidos dentro de un recordset existente para los
pedidos.

el caso es que no funciona ni con 2 recordset con una sola conexion ni con 2
conexiones (en este caso se llama a un procedimiento que simplemente se
conecta a la base de datos, crea un recordset e intenta mostrar los detalles
de pedido a partir del idPedido)

¿que trato de hacer con eso?
mostrar TODOS los pedidos de un cliente que elegimos previamente en un
combo.

claro esta que siempre se puede resolver el problema de otra forma u obviar
este problema y hacer las cosas de forma distinta. en mi caso, y por el
momento, he escogido la 2º solucion, es decir que muestro los pedidos y para
cada pedido, existe un vinculo que permite abrir otra pagina que muestra los
detalles de este pedido. esto si que funciona perfectamente, tampoco me
parece mala solucion pero me gustaria resolver mi problema aunque a pesar de
todo el resultado sea algo menos elegante.

lo que si constato es que lo que da problemas es el anidamiento de
conexiones. en una misma pagina, 2 recordsets sobre la misma conexion o en 2
conexiones distintas no funciona pero si funciona cuando esta pagina llama a
otra, siendo las conexiones no anidadas, totalmente independientes.


otra forma de solucionar el problema podria ser recuperar los datos del 1º
SELECT en un array y despues recorrer los detalles de pedidos a partir del
rastreo de este array por lo que se evitaria asi el anidamiento de
conexiones.



en fin, ¿sabes cual puede ser la solucion "elegante" para este problema?

muchas gracias de antemano por tu ayuda :-)
Respuesta Responder a este mensaje
#3 Sandra y María Claudia
22/10/2005 - 19:24 | Informe spam
No estoy muy segura de haberte entendido, por lo que me disculpo si es que
mi comentario no resulta útil.
Una vez que determino el registro del cliente y quiero mostrar los pedidos y
los datos de estos estan relacionados con varias tablas, yo uso siempre una
conexión y varios recordset y nunca he tenido problemas. Algo como esto

Temp="Select * From Pedidos Where IdCliente='" & Request("valorIDCliente") &
"'"
Tabla1.Open Temp, Conexion
While Not Tabla1.EOF
Temp2="Select * from Productos Where IdProducto='" &
Tabla1.Fields("producto") & "'"
Tabla2.Open Temp2, Conexion
...
Tabla2.Close
Tabla1.MoveNext
Wend
Tabla1.Close

¿es lo que preguntas?...

Besitos!!!!!!
____________________________________________________________________________________
SyMC
Suerte es la ayuda que te da la vida... Destino es lo que haces con esta
ayuda
Comparte con los demás, es la mejor manera de crecer y quererse más
El SP2 lo puedes bajar desde
http://www.microsoft.com/downloads/...p;FamilyID9c9dbe-3b8e-4f30-8245-9e368d3cdb5a
El artículo de JM Tella sobre como integrar SP2 con el Xp esta en
http://www.multingles.net/docs/xpsp2.htm
Ad-aware SE en español: http://www.lavasoft.de/spanish/
spywareblaster:
http://www.ct7support.com/javacool/...nload.html
Spybot - Search & Destroy 1.3:
http://www.zonavirus.com/descargas/spybotsd13.exe
The Cleaner http://www.moosoft.com/
CWShreader, Hijackthis http://www.majorgeeks.com/download4086.html
Respuesta Responder a este mensaje
#4 dani castillo
22/10/2005 - 20:38 | Informe spam
una preguntilla

¿porque no con una consulta cruzada?

supongo que lo que quieres es, dado un codigo de cliente, obtener todos sus
pedidos y detalles depedidos?

si es asi podemos suponer que no van a dar muchos detalles, solo "algunos"
(50 o 100 pongamos) , si el cruce es entre clientes y pedidos puede crecer
demasiado

pero si es algo ligero o vas a cargar todos los datos de una mejor hacer una
cruzada, algo como

sql= "select pedidos.* , detalles.* from pedidos inner join detalles on
detalles.id_pedido=pedidos.id where pedidos.id_cliente=" & id_clienteatratar
& " order by pedidos.id"

(suponiendo una estructura tipica de tablas:
clientes: id,nombre,apellidos... etc
pedidos: id,id_cliente,fecha etc
detalles: id, id_pedido, articulo, etc
)
el cruce anterior te devolvera algo como
id,id_cliente,fecha, etc, id(articulo), id_pedido, articulo

solo hay q hacer un bucle para mostrarlos, problema: hay que separarlos en
pedidos (van todos juntos) por suerte con el order llegan ordenados, asi que
solo agrupamos:

id_pedido="" ' inicializado
do while not rs.eof
if id_pedido<>rs("pedidos.id") then
' es un articulo que "inicia" un pedido nuevo, por ejemplo escribo la
cabecera del pedido
response.write "PEDIDO NUMERO:" & rs("pedidos.id") & "<br>"
id_pedido=rs("pedidos.id") ' mientras el articulo pertenezca al mismo
pedido no hara la cabecera
end if
' para cada articulo del detalle, la accion que sea:
response.write "<li>" & rs("articulo")
rs.movenext
loop


con un esquema similar puedes llenar combos con los pedidos para sacar los
detalles o lo que sea, en algunos casos en lugar de responses acumulas la
salida html en una variable de texto que luego imprimes con response.write

no se si me he explicado bien :S
dani
"Enrique" escribió en el mensaje
news:
gracias por tu ayuda pero no trato de poblar 2 combos sino a partir de un
combo de clientes del cual saco el idCliente obtengo todos los pedidos y
para cada pedido el detalle de este pedido.

el 1º rastreo con conexion a BD me va bien. la cosa se complica cuando
intento mostrar los detalles de cada pedido. en teoria es solo un nuevo
SELECT anidado en el recorrido del primer SELECT, es decir un nuevo
recordset para detalles de pedidos dentro de un recordset existente para
los
pedidos.

el caso es que no funciona ni con 2 recordset con una sola conexion ni con
2
conexiones (en este caso se llama a un procedimiento que simplemente se
conecta a la base de datos, crea un recordset e intenta mostrar los
detalles
de pedido a partir del idPedido)

¿que trato de hacer con eso?
mostrar TODOS los pedidos de un cliente que elegimos previamente en un
combo.

claro esta que siempre se puede resolver el problema de otra forma u
obviar
este problema y hacer las cosas de forma distinta. en mi caso, y por el
momento, he escogido la 2º solucion, es decir que muestro los pedidos y
para
cada pedido, existe un vinculo que permite abrir otra pagina que muestra
los
detalles de este pedido. esto si que funciona perfectamente, tampoco me
parece mala solucion pero me gustaria resolver mi problema aunque a pesar
de
todo el resultado sea algo menos elegante.

lo que si constato es que lo que da problemas es el anidamiento de
conexiones. en una misma pagina, 2 recordsets sobre la misma conexion o en
2
conexiones distintas no funciona pero si funciona cuando esta pagina llama
a
otra, siendo las conexiones no anidadas, totalmente independientes.


otra forma de solucionar el problema podria ser recuperar los datos del 1º
SELECT en un array y despues recorrer los detalles de pedidos a partir del
rastreo de este array por lo que se evitaria asi el anidamiento de
conexiones.



en fin, ¿sabes cual puede ser la solucion "elegante" para este problema?

muchas gracias de antemano por tu ayuda :-)






Respuesta Responder a este mensaje
#5 Enrique
22/10/2005 - 22:23 | Informe spam
es otra posibilidad que no se me habia occurido la verdad.

muchas gracias por tu ayuda. si lo pruebo, te mantengo al tanto y... si que
te has explicado bien, al menos creo haberlo entendido bien :-)
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida