Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida PL/SQL


Hugão

Pergunta

Estou há duas semanas tentando criar uma função PL/SQL para verificar se um boleto foi pago em dia ou não e caso o vencimento caia num feriado ou final de semana o vencimento passa para o próximo dia útil, caso tenha sido pago após a data de vencimento.

O problema é basicamente o descrito

Criei duas tabelas BOLETO e CALENDARIO (foi utilizado o mês de novembro em razão dos feriados) Já povoei as duas entidades.

Minha dificuldade é, no oracle não existe o tipo boolean, portanto não tive como eu definir os feriados e os finais de semana como TRUE, eles estão como number com valor 1 para sim e 0 para não, ou seja, 1 é feriado ou final de semana e 0 não é feriado nem final de semana.

Aqui está a função:

create or replace

function

CALCULAR_VL_PAGAMENTO(V_CD_BARRAS in varchar2)

return varchar2 is

--Definição de variáveis.

data_vencimento date;

data_vencimento_antiga date;

data_pagamento date;

data_calendario date;

dia_util date;

feriado number;

final_semana number;

atraso number := 0;

valor_documento number(10,2);

valor_pago number(10,2);

verifica_valor_pago number(10,2);

valor_multa number(10,2);

valor_juros number(10,2);

acrescimo number(10,2);

mensagem varchar2(1000);

begin

--Select para recuperar as colunas das duas tabelas que serão utilizadas no corpo da função.

select dt_vencimento, dt_pagamento, vl_documento, vl_acrescimo, vl_pagamento, dt_calendario, bo_feriado, bo_final_semana

into data_vencimento, data_pagamento, valor_documento, acrescimo, valor_pago, data_calendario, feriado, final_semana

from boleto B inner join calendario C on B.dt_vencimento = C.dt_calendario

where cd_barras = v_cd_barras;

valor_multa := 0.10 * valor_documento;

valor_juros := 0.0033 * valor_documento;

--Se o pagamento for menor ou igual à data de vencimento entra aqui

if data_pagamento <= data_vencimento then

mensagem := 'pagamento dentro do prazo!'

||' data de vencimento: '||to_char(data_vencimento, 'dd-mm-yyyy')

||'. data de pagamento: '||to_char(data_pagamento, 'dd-mm-yyyy')

||' valor pago: R$ '||to_char(valor_pago)||'.';

/*

senão (o pagamento ocorreu após o vencimento) entra aqui e verifica se o vencimento caiu num dia não útil para jogar o vencimento para o próximo dia útil.

*/

else

data_vencimento_antiga := data_vencimento; /*Guardando a data de vencimento original*/

/*Aqui se eu usar somente final_semana = 1 or feriado = 1 não entra no while por isso a rendundância data_pagamento > data_vencimento que já foi a condição para entrar no else. O problema está nessa condição porque ele não está avaliando o feriado nem o final de semana porque no final data de vencimento será igual à data de pagamento.

Eu utilizei um boleto que foi pago em 14-11-2012 e venceu num sábado 10-11-2012.

*/

while data_pagamento > data_vencimento and final_semana = 1 or feriado = 1 loop

data_vencimento := data_vencimento + 1;

atraso := 0;

end loop;

/*Aqui é só um teste para testar o while e já tentei o que sei e sempre as datas de pagamento e vencimento saem iguas.*/

mensagem := to_char(data_pagamento, 'dd-mm-yyyy')||' '||to_char(data_vencimento, 'dd-mm-yyyy');

end if;

return mensagem;

end;

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Bom dia,

Eu só gostaria de saber porque o while abaixo só itera a data_vencimento uma vez, eu usei a data 10-11-2012, sendo assim, enquanto a data do pagamento for maior que o vencimento final de semana ou feriado ele deveria iterar a até a condição ser falsa, mas ele não está verificando os valores do final de semana e do feriado.

while data_pagamento > data_vencimento and final_semana = 1 or feriado = 1 loop

data_vencimento := data_vencimento + 1;

atraso := 0;

end loop;

Alguém poderia me dar uma força?

Eu nunca programei em PL/SQL o professor não explica nada apenas deu ordem para estudarmos (ou seja, ou você se vira ou não passa na matéria), aprendi muito em 3 semanas, mas não foi suficiente para fazer a função funcionar.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...