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.
 

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.


Preguntas similares