ORACLE - Retornar somas em uma procedure

29/08/2018

0

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.

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

Johnny

Responder

Post mais votado

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!

Santos

Santos
Responder

Mais Posts

30/08/2018

Johnny

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;

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar