ORACLE - Retornar somas em uma procedure
Boa tarde pessoal,
estou com dificuldades para criar uma procedure no oracle. Faz tempo que não mexo com oracle e conheço apenas os blocos anônimos, segue um exemplo da procedure que estou precisando, porém a sintaxe é firebird.
estou com dificuldades para criar uma procedure no oracle. Faz tempo que não mexo com oracle e conheço apenas os blocos anônimos, segue um exemplo da procedure que estou precisando, porém a sintaxe é firebird.
SET TERM ^ ;
CREATE PROCEDURE STP_CUPOM_DIVERGENTE (
pi_data_inicio date, --parâmetro de entrada
pi_data_fim date)
returns (
po_loja integer, --parâmetro de saida
po_pdv integer,
po_coo integer,
po_produtos double precision,
po_financeiro double precision,
po_troco double precision,
po_diferenca double precision)
as
declare variable pv_loja integer; --variaveis
declare variable pv_pdv integer;
declare variable pv_coo integer;
declare variable pv_produtos double precision;
declare variable pv_financeiro double precision;
declare variable pv_troco double precision;
begin
for select R04.I_LOJA, R01.S_ECF, R04.S_COO
from R04
left join R01 on R04.ID_R01 = R01.ID
left join R05 on R04.ID = R05.ID_R04
where R04.D_DATA_INICIO_EMISSAO between :PI_DATA_INICIO and :PI_DATA_FIM
group by R04.I_LOJA, R01.S_ECF, R04.S_COO
into :PV_LOJA, :PV_PDV, :PV_COO
do
begin
select COALESCE(sum(R05.R_VALOR_TOTAL_LIQUIDO),0) as VAL_PRODUTOS
from R05
left join R04 on R05.ID_R04 = R04.ID
left join R01 on R04.ID_R01 = R01.ID
where R05.B_CANCEL_CUPOM = 0 and
R04.S_COO = :PV_COO and
r05.s_indicador_cancelamento = ''N'' and
R04.I_LOJA = :PV_LOJA and
R01.S_ECF = :PV_PDV and
R04.D_DATA_INICIO_EMISSAO between :PI_DATA_INICIO and :PI_DATA_FIM
into :PV_PRODUTOS ;
select COALESCE(sum(R07.R_VALPAGTO),0)
from R07
left join R04 on R07.ID_R04 = R04.ID
left join R01 on R04.ID_R01 = R01.ID
where R07.B_CANCEL_CUPOM = 0 and
R04.S_COO = :PV_COO and
R04.I_LOJA = :PV_LOJA and
R01.S_ECF = :PV_PDV and
R04.D_DATA_INICIO_EMISSAO between :PI_DATA_INICIO and :PI_DATA_FIM
into :PV_FINANCEIRO ;
select COALESCE(abs(sum(R07.R_VALPAGTO)),0)
from R07
left join R04 on R07.ID_R04 = R04.ID
left join R01 on R04.ID_R01 = R01.ID
where R07.B_CANCEL_CUPOM = 0 and
R04.S_COO = :PV_COO and
R04.I_LOJA = :PV_LOJA and
R01.S_ECF = :PV_PDV and
R07.R_VALPAGTO < 0 and
R04.D_DATA_INICIO_EMISSAO between :PI_DATA_INICIO and :PI_DATA_FIM
into :PV_TROCO;
PO_LOJA = :PV_LOJA;
PO_PDV = :PV_PDV;
PO_COO = :PV_COO;
PO_PRODUTOS = :PV_PRODUTOS;
PO_FINANCEIRO = :PV_FINANCEIRO;
PO_TROCO = :PV_TROCO;
po_diferenca = :pv_produtos - :pv_financeiro;
suspend ;
end
end^
SET TERM ; ^
Johnny
Curtidas 0
Melhor post
Santos
31/08/2018
Olá, Johnny.
Que bacana, cara! Muito bom você compartilhar sua solução pois poderá ser a dúvida de outras pessoas também!
Abraço!
Que bacana, cara! Muito bom você compartilhar sua solução pois poderá ser a dúvida de outras pessoas também!
Abraço!
GOSTEI 3
Mais Respostas
Johnny
29/08/2018
Já resolvi usando um bloco anônimo.
declare
pv_produtos double precision;
pv_financeiro double precision;
pv_troco double precision;
pv_pdiferenca double precision;
begin
for rec in (
SELECT DISTINCT
DET_FILIAL,
DET_NR_PDV,
DET_NR_CUPOM
FROM
DETCUPOM
WHERE
DET_FILIAL = 7 AND
DET_DATA BETWEEN DATETO_RMS7(:data) AND DATETO_RMS7(:data2)
)
loop
SELECT
COALESCE(SUM(DET_TOTAL),0) into pv_produtos
FROM
DETCUPOM
WHERE
DET_FILIAL = rec.det_filial
AND
DET_CANCELADO = 'N'
AND
det_nr_pdv = rec.det_nr_pdv
AND
det_nr_cupom = rec.det_nr_cupom;
SELECT
SUM(COALESCE(DETP_VLR_PGTO,0) - COALESCE(DETT_VLR_TROCO,0)) into pv_financeiro
FROM
DETCUPOMP1
LEFT JOIN DETCUPOMT1 ON DETCUPOMP1.DETP_FILIAL = DETCUPOMT1.DETT_FILIAL AND
DETCUPOMP1.DETP_NR_PDV = DETCUPOMT1.DETT_NR_PDV AND
DETCUPOMP1.DETP_NR_CUPOM = DETCUPOMT1.DETT_NR_CUPOM AND
DETCUPOMP1.DETP_SEQ = DETCUPOMT1.DETT_SEQ
WHERE
DETP_FILIAL = rec.det_filial
AND
DETP_CANCELADO = 'N'
AND
detp_nr_pdv = rec.det_nr_pdv
AND
detp_nr_cupom = rec.det_nr_cupom;
SELECT
COALESCE(SUM(DETT_VLR_TROCO),0) into pv_troco
FROM
DETCUPOMT1
WHERE
DETT_FILIAL = rec.det_filial
AND
DETT_CANCELADO = 'N'
AND
dett_nr_pdv = rec.det_nr_pdv
AND
dett_nr_cupom = rec.det_nr_cupom;
insert into tab_cupom_divergencia (loja, pdv, coo, produtos, financeiro, troco, diferenca)
values (rec.det_filial, rec.det_nr_pdv, rec.det_nr_cupom, pv_produtos, pv_financeiro, pv_troco, pv_produtos - pv_financeiro);
end loop;
end;
GOSTEI 2