Hola a todos, el problema es el siguiente:
Tengo un aplicativo de encuestas que funciona sobre plataforma web en el que recojo información para 8 servicios, por estado y ciudad para prestadores de servicios de salud y todo va muy bien, pero ahora necesito hacer un informes anual que sea mes por mes mostrando unos índices de satisfacción para cada prestador en el que se hayan realizado encuestas y como es bastante información entonces he creado unos procedimientos en la BD para hacer consultas y cáulculos y que me devuelva el indicador de un mes para un prestador.
Pero la cuestión es que si tengo por ejemplo encuestas realizadas en 60 prestadores y debo mostrar la ifnormación mes por mes para cada uno de los 8 servicios, eso me da un total de 720 consultas al procedimiento en un solo servicio (60x12meses) y dadas las consultas y cálculos que debo hacer el proceso de generar el reporte se cuelga y no me muestra nada.
He logrado obtener resultados haciendolo localmente, pero la idea es que lo pueda hacer sobre internet, no se si soy claro, entonces si alguién me puede ayudar con esto lo agradecería mucho.
uno de los procedimientos almacenados es el siguiente, para ver si lo puedo optimizar mas:
Código SQL
[-]CREATE PROCEDURE CALC_IND_GLOBAL (
FI DATE,
FF DATE,
DEPTOMUN VARCHAR (5),
COD_PREST INTEGER)
RETURNS (
INDICADOR FLOAT)
AS
DECLARE VARIABLE tiempo_espera CHAR(1);
DECLARE VARIABLE tot_enc INTEGER;
DECLARE VARIABLE tot_b INTEGER;
DECLARE VARIABLE ind_p2 FLOAT;
DECLARE VARIABLE suf CHAR(1);
DECLARE VARIABLE cla CHAR(1);
DECLARE VARIABLE opo CHAR(1);
DECLARE VARIABLE tot_s_s INTEGER;
DECLARE VARIABLE tot_c_s INTEGER;
DECLARE VARIABLE tot_o_s INTEGER;
DECLARE VARIABLE ind_s FLOAT;
DECLARE VARIABLE ind_c FLOAT;
DECLARE VARIABLE ind_o FLOAT;
DECLARE VARIABLE ind_p3 FLOAT;
DECLARE VARIABLE tot_s INTEGER;
DECLARE VARIABLE trato CHAR(1);
DECLARE VARIABLE ind_p4 FLOAT;
DECLARE VARIABLE ind_serv_amb FLOAT;
DECLARE VARIABLE tot_sat INTEGER;
DECLARE VARIABLE niv_sat CHAR(2);
DECLARE VARIABLE ind_ph FLOAT;
BEGIN
ind_p2=0;
tot_enc=0;
tot_b=0;
FOR select TBL_P2_MCI_F_01.TIEMPO_ESPERA from TBL_P2_MCI_F_01, TBL_MCI_F_01 where
TBL_MCI_F_01.FECHA_ENC<=:FF and TBL_MCI_F_01.FECHA_ENC>=:FI and
TBL_MCI_F_01.ID_ENC=TBL_P2_MCI_F_01.ID_ENC and TBL_MCI_F_01.DEPTO_MUN=:DEPTOMUN
and TBL_MCI_F_01.IPS=:COD_PREST INTO :tiempo_espera DO
BEGIN
tot_enc=:tot_enc+1;
if(:tiempo_espera='b') then tot_b=:tot_b+1;
END
if(:tot_enc>0) then ind_p2=(:tot_b*100)/:tot_enc;
else ind_p2=0;
tot_enc=0; tot_s_s=0; tot_c_s=0; tot_o_s=0;
FOR select TBL_P3_MCI_F_01.SUFICIENTE,TBL_P3_MCI_F_01.CLARA,TBL_P3_MCI_F_01.OPORTUNA
from TBL_P3_MCI_F_01, TBL_MCI_F_01 where TBL_MCI_F_01.FECHA_ENC<=:FF
and TBL_MCI_F_01.FECHA_ENC>=:FI and TBL_MCI_F_01.ID_ENC=TBL_P3_MCI_F_01.ID_ENC
and TBL_MCI_F_01.DEPTO_MUN=:DEPTOMUN and TBL_MCI_F_01.IPS=:COD_PREST
INTO :suf, :cla, :opo DO
BEGIN
tot_enc=:tot_enc+1;
if(suf='s') then tot_s_s=:tot_s_s+1;
if(cla='s') then tot_c_s=:tot_c_s+1;
if(opo='s') then tot_o_s=:tot_o_s+1;
END
if(tot_enc>0) then ind_s=(:tot_s_s*100)/:tot_enc; else ind_s=0;
if(tot_enc>0) then ind_c=(:tot_c_s*100)/:tot_enc; else ind_c=0;
if(tot_enc>0) then ind_o=(:tot_o_s*100)/:tot_enc; else ind_o=0;
ind_p3=(:ind_s+:ind_c+:ind_o)/3;
tot_enc=0; tot_s=0;
FOR select TBL_P4_MCI_F_01.TRATO
from TBL_P4_MCI_F_01, TBL_MCI_F_01 where TBL_MCI_F_01.FECHA_ENC<=:ff
and TBL_MCI_F_01.FECHA_ENC>=:fi and TBL_MCI_F_01.ID_ENC=TBL_P4_MCI_F_01.ID_ENC
and TBL_MCI_F_01.DEPTO_MUN=:deptomun and TBL_MCI_F_01.IPS=:cod_prest INTO :trato DO
BEGIN
tot_enc=:tot_enc+1;
if(trato='s') then tot_s=:tot_s+1;
END
if(tot_enc>0) then ind_p4=(:tot_s*100)/:tot_enc; else ind_p4=0;
ind_serv_amb=(:ind_p2+:ind_p3+:ind_p4)/3;
tot_enc=0; tot_sat=0;
FOR select TBL_MCI_F_02.P2 from TBL_MCI_F_02 where
TBL_MCI_F_02.FECHA_ENC<=:ff and TBL_MCI_F_02.FECHA_ENC>=:fi
and TBL_MCI_F_02.DEPTO_MUN=:deptomun
and TBL_MCI_F_02.IPS=:cod_prest into :niv_sat DO
BEGIN
tot_enc=:tot_enc+1;
if(niv_sat='s') then tot_sat=:tot_sat+1;
END
if(tot_enc>0) then ind_ph=(:tot_sat*100)/:tot_enc; else ind_ph=0;
indicador=(:ind_serv_amb+:ind_ph)/2;
SUSPEND;
END