Jump to content
Fórum Script Brasil
  • 0

Dúvida PL/SQL


Hugão

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...