Índice de contenidos:
Aquí vamos a explicar el comportamiento que se sigue a la hora de desarrollar el cálculo de aforo. Para ello tendremos los siguientes elementos
En el paquete de oracle tenemos un procedimiento llamado p_reajusta_aforo, este lo primero que hará es borrar la tabla aforo_sala y la vuelve a recalcular. Para ello itera por todos los vista v_ges_salas_x_entorno para tener la relación de todas las salas en cada uno de los entornos.
Ahora para cada iteración tenemos la sala y el entorno, ahora iteraremos por todas las colas de dicho entorno guardamos en la tabla aforo_sala la relación de la sala con la cola y su aforo máximo. Finalmente miramos todas las salas de espera de desborde y sacamos las salas padres de estas, y guardamos la relación de la sala de desborde con cada una de las colas del entorno de cada una de su sala padre.
Así tenemos relleno la tabla aforo_sala. Este proceso se debe de colocar en un scheduler para que cada día se ejecute y calcule nuevamente los datos ya que puede haber modificación de la configuración de los entornos, añadiendo o quitando salas y/o colas.
Después de esto tenemos el procedimiento llamado p_calcula_sala_espera_nuevo, en este método lo que haremos será realizar el cálculo de la tabla aforo_sala_temporal para una cola concreta (con todas las salas que tenga asociadas) y luego seleccionaremos de la tabla temporal la sala con mayor disponibilidad.
Para ello llamamos al procedimiento p_calcula_tabla_temporal_cola con la cola en cuestión. Este procedimiento se encarga de rellenar la tabla temporal, lo primero que realiza es una iteración por las salas de la cola en cuestión usando la tabla aforo_sala. Por cada registro llama al procedimiento p_calcula_tabla_temporal junto con la cola, la sala y el entorno.
p_calcula_tabla_temporal lo primero que hace es ver si la sala es de desborde o no para poner el tipo ordinario o de desborde, una vez asignado esto, mira si la cola está sentada en alguna de las consultas.
Ahora vamos a proceder a explicar el funcionamiento del procedimiento p_calcula_tabla_temporal_final. Esta función recibe como parámetros lo siguiente
Lo primero que hacemos es mirar si la cola existe, si existe asignamos la reserva mínima de huecos a la reserva de la cola, si no la ponemos a 0. Ahora miramos si existe ya la entrada en la tabla temporal para saber si tenemos que actualizar la entrada o insertarla. Ademas sacamos valores como
Tanto si actualizamos como si insertamos, lo primero es ver el tipo de hueco
SELECT id_sala, ( CASE WHEN tipo_sala = 0 THEN '0_PREFERENTE' WHEN tipo_sala = 1 THEN '1_ORDINARIA' WHEN tipo_sala = 2 THEN '2_DESBORDE' WHEN tipo_sala = 3 THEN '3_ORDINARIA_NO_RELACIONADA' WHEN tipo_sala = 4 THEN '4_DESBODE_NO_RELACIONADA' END ) AS tipo_sala, cod_cola, ( CASE WHEN tipo_hueco = 0 THEN '0_RESERVA' WHEN tipo_hueco = 1 THEN '1_GENERAL' END ) AS tipo_hueco, ( CASE WHEN tipo_hueco = 0 THEN ( SELECT reservamin_huecos_sala FROM agenda WHERE cod_agenda = af.cod_cola ) WHEN tipo_hueco = 1 THEN ( SELECT aforo_maximo FROM sala_espera WHERE id_sala = af.id_sala ) END ) AS total_aforo, ( CASE WHEN tipo_hueco = 0 THEN ( SELECT reservamin_huecos_sala FROM agenda WHERE cod_agenda = af.cod_cola ) WHEN tipo_hueco = 1 THEN total_hueco END ) AS aforo_por_tipo_hueco, --TOTAL_HUECO as CALC_TEMP, hueco_ocupado AS pac_en_sala_y_cola, hueco_ocupado_total AS pac_en_sala_de_todas_colas, ( total_hueco - hueco_ocupado_total ) AS hueco_disponibles FROM aforo_sala_temporal af where cod_cola = 'AGENDA' ORDER BY tipo_sala ASC, tipo_hueco ASC, ( total_hueco - hueco_ocupado_total ) DESC, ( hueco_ocupado_total - hueco_ocupado ) DESC; |
DECLARE P_ID_SALA SALA_ESPERA.ID_SALA%TYPE; P_SALA_DESCRIPCION SALA_ESPERA.DESCRIPCION%TYPE; BEGIN PK_SALAS_DESBORDE.P_CALCULA_SALA_ESPERA('AGENDA_1',P_ID_SALA, P_SALA_DESCRIPCION); ....REPETIR CON TODAS LAS AGENDAS A COMPROBAR.... PK_SALAS_DESBORDE.P_CALCULA_SALA_ESPERA('AGENDA_N',P_ID_SALA, P_SALA_DESCRIPCION); DBMS_OUTPUT.PUT_LINE('P_ID_SALA: ' || P_ID_SALA); DBMS_OUTPUT.PUT_LINE('P_SALA_DESCRIPCION: ' || P_SALA_DESCRIPCION); END; |
DECLARE BEGIN PK_SALAS_DESBORDE.P_REAJUSTA_AFORO(); END; |
Para realizar las pruebas lo primero ser lanzar el script de refrescar la tabla aforo_sala
Luego cogemos todas las colas a probar y modificamos el script para refrescar la tabla temporal añadiendo cada una de las colas, y lo ejecutamos.
Ejecutamos la consulta para cada una de las colas fijando la ventana
En cada paso realizado, será necesario volver a ejecutar el script para refrescar la tabla temporal y luego de eso refrescar cada una de las consultas fijadas
Prueba con una sola sala verificando el funcionamiento:
Configuración:
Datos iniciales:
Pasos:
Prueba con dos salas verificando el funcionamiento:
Configuración:
Datos iniciales:
Pasos:
Prueba con varias salas verificando el funcionamiento:
Configuración:
Datos iniciales:
Pasos:
Prueba con varias salas verificando el funcionamiento:
Configuración:
Datos iniciales:
Pasos:
Prueba con una sola sala verificando el funcionamiento:
Configuración:
Datos iniciales: