Dúvida PL/SQL.

1. Dúvida PL/SQL.

Hugo Sousa
goj1

(usa Debian)

Enviado em 13/09/2012 - 10:28h

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 pq ele não está avaliando o feriado nem o final de semana pq 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;


  


2. Re: Dúvida PL/SQL.

Hugo Sousa
goj1

(usa Debian)

Enviado em 14/09/2012 - 09:43h

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.


3. Re: Dúvida PL/SQL.

Hugo Sousa
goj1

(usa Debian)

Enviado em 15/09/2012 - 10:53h

Se tem algo que eu não vou ser é QD ou DBA Oracle, é uma tecnologia boazinha, mas para se aprender essa $%¨&% é um roça. Até em foruns é difícil achar pessoas que conheçam....


4. Re: Dúvida PL/SQL.

Mariana Ribeiro Mendes
meldenne

(usa Linux Mint)

Enviado em 20/09/2012 - 10:42h

Eu tive o mesmo problema quando fiz Banco 2, mas acredito que aprender C para criar estas funções seja mais produtivo que PL/SQL.

Apesar de PL/QSL ser muitíssimo interessante, sozinho fica difícil de aprender (até certo ponto).


5. Ponteito PL/SQL.

Hugo Sousa
goj1

(usa Debian)

Enviado em 20/09/2012 - 11:00h

Alguém ai entende de ponteiro?

Poderia dar um exemplo e explicá-lo?

Grato.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts