Stored Procedure - Dúvida

Firebird

28/07/2004

pessoal, estou tentando montar uma stored procedure no interbase com o FOR SELECT chamando dois campos diferentes (um de uma tabela e um de outra tabela)

esta é a SP

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE ´SP_CENSOENFERMARIA2´
(
´DATAINICIAL´ DATE,
´DATAFINAL´ DATE
)
RETURNS
(
´DATACENSO´ DATE,
´ENTRADACM´ INTEGER,
´ENTRADAPED´ INTEGER,
´ENTRADACC´ INTEGER,
´SAIDACM´ INTEGER,
´SAIDAPED´ INTEGER,
´SAIDACC´ INTEGER,
´SALDOCM´ INTEGER,
´SALDOPED´ INTEGER,
´SALDOCC´ INTEGER
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE ´SP_CENSOENFERMARIA2´
(
´DATAINICIAL´ DATE,
´DATAFINAL´ DATE
)
RETURNS
(
´DATACENSO´ DATE,
´ENTRADACM´ INTEGER,
´ENTRADAPED´ INTEGER,
´ENTRADACC´ INTEGER,
´SAIDACM´ INTEGER,
´SAIDAPED´ INTEGER,
´SAIDACC´ INTEGER,
´SALDOCM´ INTEGER,
´SALDOPED´ INTEGER,
´SALDOCC´ INTEGER
)
AS
DECLARE VARIABLE ITOTALENTRADACM INTEGER;
DECLARE VARIABLE ITOTALENTRADAPED INTEGER;
DECLARE VARIABLE ITOTALENTRADACC INTEGER;
DECLARE VARIABLE ITOTALSAIDACM INTEGER;
DECLARE VARIABLE ITOTALSAIDAPED INTEGER;
DECLARE VARIABLE ITOTALSAIDACC INTEGER;

BEGIN

/*Agrupa as informações por data de internação na enfermaria e data de alta

AQUI NO FOR SELECT TENHO QUE ACRESCENTAR O CAMPO ´DATAALTA´ DA TABELA ´ALTAS´

*/

FOR SELECT ENFERMARIA.DATAINTENF
FROM ENFERMARIA
WHERE CAST(ENFERMARIA.dataintenf AS DATE) BETWEEN :datainicial AND :datafinal
GROUP BY ENFERMARIA.DATAINTENF
ORDER BY ENFERMARIA.DATAINTENF
INTO :DATACENSO
DO
BEGIN

/* Inicializa as variáveis*/


ITOTALENTRADACM = 0;
ITOTALENTRADAPED = 0;
ITOTALENTRADACC = 0;
ITOTALSAIDACM = 0;
ITOTALSAIDAPED = 0;
ITOTALSAIDACC = 0;


/* Total de entradas CM*/
SELECT COUNT(N_PACENF)
FROM ENFERMARIA
WHERE CAST(ENFERMARIA.dataintenf AS DATE) BETWEEN :datainicial AND :datafinal
AND ENFERMARIA.dataintenf = :DATACENSO
AND ENFERMARIA.ESPENF = ´CM´
GROUP BY DATAINTENF
INTO :ITOTALENTRADACM;

/* Total de entradas PED*/
SELECT COUNT(N_PACENF)
FROM ENFERMARIA
WHERE CAST(ENFERMARIA.dataintenf AS DATE) BETWEEN :datainicial AND :datafinal
AND ENFERMARIA.dataintenf = :DATACENSO
AND ENFERMARIA.ESPENF = ´PED´
GROUP BY DATAINTENF
INTO :ITOTALENTRADAPED;

/* Total de entradas CC*/
SELECT COUNT(N_PACENF)
FROM ENFERMARIA
WHERE CAST(ENFERMARIA.dataintenf AS DATE) BETWEEN :datainicial AND :datafinal
AND ENFERMARIA.dataintenf = :DATACENSO
AND ENFERMARIA.ESPENF = ´CC´
GROUP BY DATAINTENF
INTO :ITOTALENTRADACC;

/* Total de saidas CM*/
SELECT COUNT(N_PAC)
FROM ALTAS
WHERE CAST(ALTAS.dataalta AS DATE) BETWEEN :datainicial AND :datafinal
AND ALTAS.dataalta = :DATACENSO
AND ALTAS.ESPALTA = ´CM´
GROUP BY DATAALTA
INTO :ITOTALSAIDACM;

/* Total de saidas PED*/
SELECT COUNT(N_PAC)
FROM ALTAS
WHERE CAST(ALTAS.dataalta AS DATE) BETWEEN :datainicial AND :datafinal
AND ALTAS.dataalta = :DATACENSO
AND ALTAS.ESPALTA = ´PED´
GROUP BY DATAALTA
INTO :ITOTALSAIDAPED;

/* Total de saidas CC*/
SELECT COUNT(N_PAC)
FROM ALTAS
WHERE CAST(ALTAS.dataalta AS DATE) BETWEEN :datainicial AND :datafinal
AND ALTAS.dataalta = :DATACENSO
AND ALTAS.ESPALTA = ´CC´
GROUP BY DATAALTA
INTO :ITOTALSAIDACC;

/* Composição das médias*/
ENTRADACM = ITOTALENTRADACM;
ENTRADAPED = ITOTALENTRADAPED;
ENTRADACC = ITOTALENTRADACC;
SAIDACM = ITOTALSAIDACM;
SAIDAPED = ITOTALSAIDAPED;
SAIDACC = ITOTALSAIDACC;
SALDOCM = (ITOTALENTRADACM-ITOTALSAIDACM);
SALDOPED = (ITOTALENTRADAPED-ITOTALSAIDAPED);
SALDOCC = (ITOTALENTRADACC-ITOTALSAIDACC);

SUSPEND;
END
END
^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;



Espero que possam me ajudar


Armando.boza

Armando.boza

Curtidas 0

Respostas

Armando.boza

Armando.boza

28/07/2004

o relatório que estou montando é este:

www.armando.k6.com.br


GOSTEI 0
POSTAR