Cómo puedo eliminar este cursor:

12/07/2004 - 16:42 por Víctor | Informe spam
Bueno.

Siguiendo un comentario que por aquí he leido un par de veces ("todos los
cursores se pueden sustituir por consultas") y que por ahora he podido
constatar, me encuentro con uno que no consigo eliminar. Tal vez no se
pueda:

Tengo una tabla con acomodaciones

aco char(3) -- Acomodación.
numero tinyint -- Nº de la acomodación.
vacio tinyint -- Indica si está vacio (1) o no (0).
libres tinyint -- Indica el nº de plazas libres.
resevado tinyint -- Indica si se ha reservado la acomodación entera (1) o no
(0).

C2 nº1, 1, 2, 0
C2 nº2, 0, 1, 1
C2 nº3, 0, 1,0
C2 nº4, 1, 2, 0
B1 nº1, 1, 1, 0

Supongamos que tenemos los siguientes pasajeros:

A, en Camarote C2 (dos literas) para él solito.
B, en litera C2 (dos literas)
C, en litera C2 (dos literas)
D, en litera C2 (dos literas)
E, en butaca B1.

A tendría que ir en el C2 nº1 (una acomodación vacia, pues la quiere para él
solito).
B tendría que ir en el C2 nº3 (en el nº2 no puede pues aunque hay plazas
(1), está reservado como "completo"),
C tendría que ir en el C2 nº2 (hay una plaza libre y no está marcada como
"completa").
D tendría que ir en el C2 nº4 (está vacia).
E en la butaca nº1.

Cada vez que se asigna un camarote a un pasajero, cambia el estado, por lo
que ahora mismo utilizo un cursor.

Si a alguien se le ocurre cómo evitarlo, le invito a una cervecita.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
12/07/2004 - 17:36 | Informe spam
Hola Víctor,
No sé si entendí bien, pero me parece que al señor B le correspondería el
camarote nro 4, el 2 y el 3 tienen solo una litera disponible.

En fin, te envío esto para darte una idea de tratamiento de la información
sin el uso de cursores.
El primer SELECT te muestra el primero disponible según el requerimiento del
pasajero.
El UPDATE actualiza el lugar que corresponda, obtenido en la subconsulta.
Es posible que falte tener encuenta alguna condición, esto es solo para que
veas qué puede hacerse sin cursores.

Espero que te sirva, Liliana.

DECLARE @señor char(5), @aco char(2), @cuantas smallint, @todo char(2)
SELECT @señor = 'B', @aco = 'C2', @cuantas = 2, @todo = 'no'

SELECT TOP 1 señor = @señor, aco = @aco, cuantas = @cuantas, todo = @todo,
aco, numero, vacio, libres, resevado
FROM #acomodaciones
WHERE libres >= @cuantas AND
aco = @aco AND
vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
ORDER BY aco, numero

UPDATE #acomodaciones
SET libres = CASE WHEN @todo = 'si' THEN 0 ELSE libres - @cuantas END,
vacio = 0,
resevado = CASE WHEN @todo = 'si' THEN 1 ELSE 0 END
FROM #acomodaciones
INNER JOIN (SELECT TOP 1 aco, numero
FROM #acomodaciones
WHERE libres >= @cuantas AND
aco = @aco AND
vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
ORDER BY aco, numero) AS lugar
ON #acomodaciones.aco = lugar.aco AND
#acomodaciones.numero = lugar.numero


"Víctor" escribió en el mensaje
news:
Bueno.

Siguiendo un comentario que por aquí he leido un par de veces ("todos los
cursores se pueden sustituir por consultas") y que por ahora he podido
constatar, me encuentro con uno que no consigo eliminar. Tal vez no se
pueda:

Tengo una tabla con acomodaciones

aco char(3) -- Acomodación.
numero tinyint -- Nº de la acomodación.
vacio tinyint -- Indica si está vacio (1) o no (0).
libres tinyint -- Indica el nº de plazas libres.
resevado tinyint -- Indica si se ha reservado la acomodación entera (1) o


no
(0).

C2 nº1, 1, 2, 0
C2 nº2, 0, 1, 1
C2 nº3, 0, 1,0
C2 nº4, 1, 2, 0
B1 nº1, 1, 1, 0

Supongamos que tenemos los siguientes pasajeros:

A, en Camarote C2 (dos literas) para él solito.
B, en litera C2 (dos literas)
C, en litera C2 (dos literas)
D, en litera C2 (dos literas)
E, en butaca B1.

A tendría que ir en el C2 nº1 (una acomodación vacia, pues la quiere para


él
solito).
B tendría que ir en el C2 nº3 (en el nº2 no puede pues aunque hay plazas
(1), está reservado como "completo"),
C tendría que ir en el C2 nº2 (hay una plaza libre y no está marcada como
"completa").
D tendría que ir en el C2 nº4 (está vacia).
E en la butaca nº1.

Cada vez que se asigna un camarote a un pasajero, cambia el estado, por lo
que ahora mismo utilizo un cursor.

Si a alguien se le ocurre cómo evitarlo, le invito a una cervecita.

Muchas gracias.


Respuesta Responder a este mensaje
#2 Miguel Egea
12/07/2004 - 18:04 | Informe spam
No parece sencillo, de hecho tal y como lo planteas parece un problema a
resolver de forma recursiva y eso no es recomenadable en SQL.
Pero si no hay muchos pasajeros y muchas habitaciones (me refiero tantos
como para que esto sea inviable puedes hacer un crossjoin y después elegir
los mejores, quizá ordenando, aunque yo no entiendo la estructura y me es
imposible darte una recomendacio´n.,...

create table reservas (
aco char(3), -- Acomodación.
numero tinyint, -- Nº de la acomodación.
vacio tinyint ,-- Indica si está vacio (1) o no (0).
libres tinyint, -- Indica el nº de plazas libres.
resevado tinyint )
go
insert into reservas values ('C2',1, 1, 2, 0)
insert into reservas values('C2',2, 0, 1, 1)
insert into reservas values('C2' ,3, 0, 1,0)
insert into reservas values ('C2',4, 1, 2, 0)
insert into reservas values('B1',1, 1, 1, 0)
go
create table pasajeros (pasajero char(1),aco char(3),
individual bit)
go
insert into pasajeros values ('A','C2',1)
insert into pasajeros values ('B','C2',0)
insert into pasajeros values ('C','C2',0)
insert into pasajeros values ('D','C2',0)
insert into pasajeros values ('e','B1',0)
GO
select * from reservas r inner join pasajeros p on r.aco=p.aco order by
numero,pasajero

"Víctor" escribió en el mensaje
news:
Bueno.

Siguiendo un comentario que por aquí he leido un par de veces ("todos los
cursores se pueden sustituir por consultas") y que por ahora he podido
constatar, me encuentro con uno que no consigo eliminar. Tal vez no se
pueda:

Tengo una tabla con acomodaciones

aco char(3) -- Acomodación.
numero tinyint -- Nº de la acomodación.
vacio tinyint -- Indica si está vacio (1) o no (0).
libres tinyint -- Indica el nº de plazas libres.
resevado tinyint -- Indica si se ha reservado la acomodación entera (1) o


no
(0).

C2 nº1, 1, 2, 0
C2 nº2, 0, 1, 1
C2 nº3, 0, 1,0
C2 nº4, 1, 2, 0
B1 nº1, 1, 1, 0

Supongamos que tenemos los siguientes pasajeros:

A, en Camarote C2 (dos literas) para él solito.
B, en litera C2 (dos literas)
C, en litera C2 (dos literas)
D, en litera C2 (dos literas)
E, en butaca B1.

A tendría que ir en el C2 nº1 (una acomodación vacia, pues la quiere para


él
solito).
B tendría que ir en el C2 nº3 (en el nº2 no puede pues aunque hay plazas
(1), está reservado como "completo"),
C tendría que ir en el C2 nº2 (hay una plaza libre y no está marcada como
"completa").
D tendría que ir en el C2 nº4 (está vacia).
E en la butaca nº1.

Cada vez que se asigna un camarote a un pasajero, cambia el estado, por lo
que ahora mismo utilizo un cursor.

Si a alguien se le ocurre cómo evitarlo, le invito a una cervecita.

Muchas gracias.


Respuesta Responder a este mensaje
#3 Víctor
13/07/2004 - 09:56 | Informe spam
Me lo estoy leyendo, pero...


"Liliana Sorrentino" escribió en el mensaje
news:
Hola Víctor,
No sé si entendí bien, pero me parece que al señor B le correspondería el
camarote nro 4, el 2 y el 3 tienen solo una litera disponible.

En fin, te envío esto para darte una idea de tratamiento de la información
sin el uso de cursores.
El primer SELECT te muestra el primero disponible según el requerimiento


del
pasajero.
El UPDATE actualiza el lugar que corresponda, obtenido en la subconsulta.
Es posible que falte tener encuenta alguna condición, esto es solo para


que
veas qué puede hacerse sin cursores.

Espero que te sirva, Liliana.

DECLARE @señor char(5), @aco char(2), @cuantas smallint, @todo char(2)
SELECT @señor = 'B', @aco = 'C2', @cuantas = 2, @todo = 'no'

SELECT TOP 1 señor = @señor, aco = @aco, cuantas = @cuantas, todo = @todo,
aco, numero, vacio, libres, resevado
FROM #acomodaciones
WHERE libres >= @cuantas AND
aco = @aco AND
vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
ORDER BY aco, numero

UPDATE #acomodaciones
SET libres = CASE WHEN @todo = 'si' THEN 0 ELSE libres - @cuantas END,
vacio = 0,
resevado = CASE WHEN @todo = 'si' THEN 1 ELSE 0 END
FROM #acomodaciones
INNER JOIN (SELECT TOP 1 aco, numero
FROM #acomodaciones
WHERE libres >= @cuantas AND
aco = @aco AND
vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
ORDER BY aco, numero) AS lugar
ON #acomodaciones.aco = lugar.aco AND
#acomodaciones.numero = lugar.numero


"Víctor" escribió en el mensaje
news:
> Bueno.
>
> Siguiendo un comentario que por aquí he leido un par de veces ("todos


los
> cursores se pueden sustituir por consultas") y que por ahora he podido
> constatar, me encuentro con uno que no consigo eliminar. Tal vez no se
> pueda:
>
> Tengo una tabla con acomodaciones
>
> aco char(3) -- Acomodación.
> numero tinyint -- Nº de la acomodación.
> vacio tinyint -- Indica si está vacio (1) o no (0).
> libres tinyint -- Indica el nº de plazas libres.
> resevado tinyint -- Indica si se ha reservado la acomodación entera (1)


o
no
> (0).
>
> C2 nº1, 1, 2, 0
> C2 nº2, 0, 1, 1
> C2 nº3, 0, 1,0
> C2 nº4, 1, 2, 0
> B1 nº1, 1, 1, 0
>
> Supongamos que tenemos los siguientes pasajeros:
>
> A, en Camarote C2 (dos literas) para él solito.
> B, en litera C2 (dos literas)
> C, en litera C2 (dos literas)
> D, en litera C2 (dos literas)
> E, en butaca B1.
>
> A tendría que ir en el C2 nº1 (una acomodación vacia, pues la quiere


para
él
> solito).
> B tendría que ir en el C2 nº3 (en el nº2 no puede pues aunque hay plazas
> (1), está reservado como "completo"),
> C tendría que ir en el C2 nº2 (hay una plaza libre y no está marcada


como
> "completa").
> D tendría que ir en el C2 nº4 (está vacia).
> E en la butaca nº1.
>
> Cada vez que se asigna un camarote a un pasajero, cambia el estado, por


lo
> que ahora mismo utilizo un cursor.
>
> Si a alguien se le ocurre cómo evitarlo, le invito a una cervecita.
>
> Muchas gracias.
>
>


Respuesta Responder a este mensaje
#4 Liliana Sorrentino
13/07/2004 - 18:07 | Informe spam
Partí de la idea de una reserva por vez, no como Miguel que tiene en la
tabla Pasajeros toda la información de los pedidos.
¿Es complicado de entender lo que mandé?
Estoy generando parámetros con los valores que "intuyo" que podés tener en
el momento de la reserva.
El SELECT te devuelve los datos del primero que cumple con los requisitos,
solo eso, te lo muestra.
El UPDATE actualiza los datos del lugar para el pasajero.
Eso es todo.
Si tenés alguna duda concreta, veo de ayudarte.
Liliana.

"Víctor" escribió en el mensaje
news:
Me lo estoy leyendo, pero...


"Liliana Sorrentino" escribió en el


mensaje
news:
> Hola Víctor,
> No sé si entendí bien, pero me parece que al señor B le correspondería


el
> camarote nro 4, el 2 y el 3 tienen solo una litera disponible.
>
> En fin, te envío esto para darte una idea de tratamiento de la


información
> sin el uso de cursores.
> El primer SELECT te muestra el primero disponible según el requerimiento
del
> pasajero.
> El UPDATE actualiza el lugar que corresponda, obtenido en la


subconsulta.
> Es posible que falte tener encuenta alguna condición, esto es solo para
que
> veas qué puede hacerse sin cursores.
>
> Espero que te sirva, Liliana.
>
> DECLARE @señor char(5), @aco char(2), @cuantas smallint, @todo char(2)
> SELECT @señor = 'B', @aco = 'C2', @cuantas = 2, @todo = 'no'
>
> SELECT TOP 1 señor = @señor, aco = @aco, cuantas = @cuantas, todo @todo,
> aco, numero, vacio, libres, resevado
> FROM #acomodaciones
> WHERE libres >= @cuantas AND
> aco = @aco AND
> vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
> ORDER BY aco, numero
>
> UPDATE #acomodaciones
> SET libres = CASE WHEN @todo = 'si' THEN 0 ELSE libres - @cuantas


END,
> vacio = 0,
> resevado = CASE WHEN @todo = 'si' THEN 1 ELSE 0 END
> FROM #acomodaciones
> INNER JOIN (SELECT TOP 1 aco, numero
> FROM #acomodaciones
> WHERE libres >= @cuantas AND
> aco = @aco AND
> vacio = CASE WHEN @todo = 'si' THEN 1 ELSE vacio END
> ORDER BY aco, numero) AS lugar
> ON #acomodaciones.aco = lugar.aco AND
> #acomodaciones.numero = lugar.numero
>
>
> "Víctor" escribió en el mensaje
> news:
> > Bueno.
> >
> > Siguiendo un comentario que por aquí he leido un par de veces ("todos
los
> > cursores se pueden sustituir por consultas") y que por ahora he podido
> > constatar, me encuentro con uno que no consigo eliminar. Tal vez no se
> > pueda:
> >
> > Tengo una tabla con acomodaciones
> >
> > aco char(3) -- Acomodación.
> > numero tinyint -- Nº de la acomodación.
> > vacio tinyint -- Indica si está vacio (1) o no (0).
> > libres tinyint -- Indica el nº de plazas libres.
> > resevado tinyint -- Indica si se ha reservado la acomodación entera


(1)
o
> no
> > (0).
> >
> > C2 nº1, 1, 2, 0
> > C2 nº2, 0, 1, 1
> > C2 nº3, 0, 1,0
> > C2 nº4, 1, 2, 0
> > B1 nº1, 1, 1, 0
> >
> > Supongamos que tenemos los siguientes pasajeros:
> >
> > A, en Camarote C2 (dos literas) para él solito.
> > B, en litera C2 (dos literas)
> > C, en litera C2 (dos literas)
> > D, en litera C2 (dos literas)
> > E, en butaca B1.
> >
> > A tendría que ir en el C2 nº1 (una acomodación vacia, pues la quiere
para
> él
> > solito).
> > B tendría que ir en el C2 nº3 (en el nº2 no puede pues aunque hay


plazas
> > (1), está reservado como "completo"),
> > C tendría que ir en el C2 nº2 (hay una plaza libre y no está marcada
como
> > "completa").
> > D tendría que ir en el C2 nº4 (está vacia).
> > E en la butaca nº1.
> >
> > Cada vez que se asigna un camarote a un pasajero, cambia el estado,


por
lo
> > que ahora mismo utilizo un cursor.
> >
> > Si a alguien se le ocurre cómo evitarlo, le invito a una cervecita.
> >
> > Muchas gracias.
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida