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:
Mostrar la cita
no
Mostrar la cita
él
Mostrar la cita
#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:
Mostrar la cita
no
Mostrar la cita
él
Mostrar la cita
#3 Víctor
13/07/2004 - 09:56 | Informe spam
Me lo estoy leyendo, pero...


"Liliana Sorrentino" escribió en el mensaje
news:
Mostrar la cita
del
Mostrar la cita
que
Mostrar la cita
los
Mostrar la cita
o
Mostrar la cita
para
Mostrar la cita
como
Mostrar la cita
lo
Mostrar la cita
#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:
Mostrar la cita
mensaje
Mostrar la cita
el
Mostrar la cita
información
Mostrar la cita
subconsulta.
Mostrar la cita
END,
Mostrar la cita
(1)
Mostrar la cita
plazas
Mostrar la cita
por
Mostrar la cita
Ads by Google
Search Busqueda sugerida