Whats new? | Login | Parceiros
Cadastre-se | Atendimento | RSS
+ SQL:
artigos   |   vídeos   |    cursos   |    mais

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.

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 ...


Ver space do autor


Estatísticas:
Visualizações:
18653
Favoritado:
 4 vez(es)
Conteúdo:
Didática:
Utilidade:
2 2
votos: 5

Serviços:



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.





Participe! Inclua um comentário
[Fechar]

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


Francisco de assis souza
11/8/2006 23:27
DIA UTIL MUITO BOM... PARABENS

[responder]

 



 
 

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


[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
DevMedia Group   www.devmedia.com.br   |   www.javafree.org   |   www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038