Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

Criando uma Stored Procedure em Firebird para retornar o próximo dia útil

Veja como criar uma stored procedure em Firebird para retornar o próximo dia útil com verificação de feriados.

Nesse artigo vou mostrar uma forma simples de como criar uma stored procedure para retornar o próximo dia útil de uma data desconsiderando feriados pré cadastrados. O objetivo dessa procedure é verificar se a data informada no parâmetro é sábado, domingo ou feriado e caso seja irá retornar o próximo dia útil.

Lembrando que utilizei a versão 1.5 do Firebird para fazer este artigo.

Esse exemplo armazena os feriados como tipo DATE, e com isso será necessário atualizar os feriados anualmente, porém pode-se armazenar somente o dia e mês do feriado em campos separados e com isso eliminar essa atualização anual da tabela de feriados.

Mas voltado ao artigo, o primeiro passo é criar uma tabela para armazenar as datas dos feriados anuais e suas respectivas descrições. Segue a estrutura dessa tabela a seguir:

--tabela de feriados
CREATE TABLE FERIADOS
(
  DT DATE NOT NULL,
  DES VARCHAR(30)
)



Agora vamos criar nossa stored procedure:


CREATE PROCEDURE SP_PROXIMO_DIAUTIL
(
  PI_DATA DATE
)
RETURNS
(
  PO_DATA DATE
)

AS
  DECLARE VARIABLE VDATA DATE;
  DECLARE VARIABLE VDAY INTEGER;
  DECLARE VARIABLE VNEWDAY INTEGER;
  DECLARE VARIABLE I INTEGER;
  DECLARE VARIABLE J INTEGER;
  DECLARE VARIABLE VOK INTEGER;

BEGIN

  --pega o dia da semana
  SELECT EXTRACT(WEEKDAY FROM :PI_DATA) FROM RDB$DATABASE INTO :VDAY;

  --se for sexta incrementa dois dias
  IF (VDAY=6) THEN
    VDATA = PI_DATA+2;

  --se for domingo incrementa um dia
  ELSE IF (VDAY=0) THEN
    VDATA = PI_DATA+1;

  --caso contrário não incrementa nada
  ELSE
    VDATA = PI_DATA;

  --verifica se a data é um feriado
  SELECT COALESCE(COUNT(*),0)  FROM FERIADOS F WHERE F.DT = :VDATA INTO :I;

  --se for incrementa ate que a data não seja feriado e seja um dia util
  IF (I>0) THEN
  BEGIN

    VDATA = VDATA+1;
    VOK = 0;

    WHILE (VOK=0) DO
    BEGIN

      SELECT COALESCE(COUNT(*), 0)  FROM FERIADOS F WHERE F.DT = :VDATA INTO :J;

      IF (J>0) THEN
       
VDATA = VDATA+1;

      ELSE BEGIN
        SELECT EXTRACT(WEEKDAY FROM :VDATA) FROM RDB$DATABASE INTO :VNEWDAY;

        IF (VNEWDAY=6) THEN
         
VDATA = VDATA+2;
       
       
ELSE IF (VNEWDAY=0) THEN
          VDATA = VDATA+1;

        ELSE
          VOK = 1;
      END
    END
  END

  PO_DATA = VDATA;
  SUSPEND;
END;


Espero que tenham gostado e até o próximo artigo.





    2 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Francisco De Assis Souza
MUITO BOM... PARABENS


em 11/8/2006 23:27 - Responder

 

Jeandeson De Oliveira Merelis
Rodrigo, boa tarde.

Fiz umas alterações em sua procedure deixando ela mais "limpa", segue o código abaixo:

create procedure SP_PROXIMO_DIA_UTIL (
    IDATA date)
returns (
    DATA date)
as
declare variable I integer;
begin
  -- incrementa data em 1 dia
  DATA = IDATA + 1;

  -- pega o dia da semana
  I = extract(weekday from :DATA);

  --se for sábado incrementa dois dias
  if (I = 6) then
    DATA = DATA + 2;

  --se for domingo incrementa um dia
  else if (I = 0) then
    DATA = DATA + 1;

  -- verifica se a data exite na tabela de feriados
  if (exists(select
                 F.FERIADO_ID
             from TFERIADOS F
             where F.DATA = :DATA)) then

    -- se existir na tabela feriados, busca próximo dia útil
    execute procedure SP_PROXIMO_DIA_UTIL :DATA returning_values :DATA;

  suspend;

end


Att,
Jeandeson O. Merelis.


em 16/11/2010 17:38 - Responder

 



[Este post ainda não foi associado a uma sequência]
Autor
Rodrigo Lazoti

Rodrigo Lazoti (rodrigolazoti@yahoo.com.br) é desenvolvedor de software com mais de 8 anos de experiência, bacharel em Sistemas de Informação e possui também as certificações SCJP, SCWCD e SCBCD. Atualmente desenvolve sistemas utilizando Java e Ruby on Rails, mas já trabalhou com tecnologias como De...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
2   2
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da SQL Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03