Fórum Duvida com procedure -AB #547584
03/03/2016
0
tenho uma procedure no firebird e gostaria de fazer o seguinte:
Depois de informar um periodo entre datas, ele me retornasse:
01/02/2016 a 31/03/2016
retornasse 01/2016,
02/2016,
03/2016
e que apartir daí, pudesse com esse resultado fazer meus selects.
vejam minha procedure
CREATE PROCEDURE MOVRESSUMO(
DATAI DATE,
DATAF DATE,
PFILIAL INTEGER)
RETURNS(
MES_ANO VARCHAR(7) CHARACTER SET NONE,
TOTAL_ENTRADA DOUBLE PRECISION,
TOTAL_CONSUMO DOUBLE PRECISION,
TOTAL_ATEND_FARMACIA INTEGER,
TOTAL_DEVOLUCAO DOUBLE PRECISION,
TOTAL_PERDAS DOUBLE PRECISION)
AS
begin
for
SELECT EXTRACT(MONTH FROM B.dtentrada) ||'/'|| EXTRACT(year FROM b.dtentrada),
coalesce(sum(b.qtdund*b.custund),0)
FROM estoque_lote B
where b.filial=:pfilial and b.dtentrada between :datai and :dataf
group by EXTRACT(MONTH FROM B.dtentrada), EXTRACT(year FROM b.dtentrada)
into :Mes_Ano, :Total_Entrada
DO
BEGIN
for
select coalesce(sum(a.qtd * a.custo),0) from consumopaciente a
where a.filial=:pfilial and
EXTRACT(MONTH FROM a.data) ||'/'|| EXTRACT(year FROM a.data)=:MES_ANO
group by EXTRACT(MONTH FROM a.data), EXTRACT(year FROM a.data)
into :Total_Consumo
do
begin
for select coalesce(count(c.paciente),0)
from regatfarmpac c
WHERE c.filial=:pfilial and c.paciente is not null and
eXTRACT(MONTH FROM c.data) ||'/'|| EXTRACT(year FROM c.data)=:MES_ANO
into :total_atend_Farmacia
do
begin
for select coalesce(sum(d.qtd * d.custo),0)
from perdas d
WHERE d.filial=:pfilial and d.tipomov='P' and
eXTRACT(MONTH FROM d.data) ||'/'|| EXTRACT(year FROM d.data)=:MES_ANO
into :Total_Perdas
do
begin
for select coalesce(sum(e.qtd * e.custo),0)
from perdas e
WHERE e.filial=:pfilial and e.tipomov='D' and
eXTRACT(MONTH FROM e.data) ||'/'|| EXTRACT(year FROM e.data)=:MES_ANO
into :total_devolucao
do
suspend;
end
end
end
end
end
ela funciona, porém se a primeira tabela não possuir movimentação no periodo especificado, todas as outras tbm não irão mostrar nada, por estarem dependendo da estrutura da primeira.
Depois de informar um periodo entre datas, ele me retornasse:
01/02/2016 a 31/03/2016
retornasse 01/2016,
02/2016,
03/2016
e que apartir daí, pudesse com esse resultado fazer meus selects.
vejam minha procedure
CREATE PROCEDURE MOVRESSUMO(
DATAI DATE,
DATAF DATE,
PFILIAL INTEGER)
RETURNS(
MES_ANO VARCHAR(7) CHARACTER SET NONE,
TOTAL_ENTRADA DOUBLE PRECISION,
TOTAL_CONSUMO DOUBLE PRECISION,
TOTAL_ATEND_FARMACIA INTEGER,
TOTAL_DEVOLUCAO DOUBLE PRECISION,
TOTAL_PERDAS DOUBLE PRECISION)
AS
begin
for
SELECT EXTRACT(MONTH FROM B.dtentrada) ||'/'|| EXTRACT(year FROM b.dtentrada),
coalesce(sum(b.qtdund*b.custund),0)
FROM estoque_lote B
where b.filial=:pfilial and b.dtentrada between :datai and :dataf
group by EXTRACT(MONTH FROM B.dtentrada), EXTRACT(year FROM b.dtentrada)
into :Mes_Ano, :Total_Entrada
DO
BEGIN
for
select coalesce(sum(a.qtd * a.custo),0) from consumopaciente a
where a.filial=:pfilial and
EXTRACT(MONTH FROM a.data) ||'/'|| EXTRACT(year FROM a.data)=:MES_ANO
group by EXTRACT(MONTH FROM a.data), EXTRACT(year FROM a.data)
into :Total_Consumo
do
begin
for select coalesce(count(c.paciente),0)
from regatfarmpac c
WHERE c.filial=:pfilial and c.paciente is not null and
eXTRACT(MONTH FROM c.data) ||'/'|| EXTRACT(year FROM c.data)=:MES_ANO
into :total_atend_Farmacia
do
begin
for select coalesce(sum(d.qtd * d.custo),0)
from perdas d
WHERE d.filial=:pfilial and d.tipomov='P' and
eXTRACT(MONTH FROM d.data) ||'/'|| EXTRACT(year FROM d.data)=:MES_ANO
into :Total_Perdas
do
begin
for select coalesce(sum(e.qtd * e.custo),0)
from perdas e
WHERE e.filial=:pfilial and e.tipomov='D' and
eXTRACT(MONTH FROM e.data) ||'/'|| EXTRACT(year FROM e.data)=:MES_ANO
into :total_devolucao
do
suspend;
end
end
end
end
end
ela funciona, porém se a primeira tabela não possuir movimentação no periodo especificado, todas as outras tbm não irão mostrar nada, por estarem dependendo da estrutura da primeira.
Eliseu Souza
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)