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.
Estatísticas:










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.




Artigo Clube Delphi 80 - Exibindo dicas na forma de balão com a descrição de campos do FB

Artigo Clube Delphi 94 - ClientDataSet

Desenhando um olho em Java

Criando um Messagebox personalizado

Como ler um arquivo XML utilizando AJAX

Validação de campos obrigatórios em um Dataset

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

Criando uma Interface para padronização dos formulários de Cadastro





[vídeo] Consumindo os dados via ajax – Consumindo dados com getJson do jQuery utilizando POCO EF 4.0 – Parte 3

[vídeo] Classe POCO – Consumindo dados com getJson do jQuery utilizando POCO EF 4.0 – Parte 1

Imprimindo Relatório : VCL Crystal Reports XI - Delphi

VCL Crystal Reports XI - Delphi

[vídeo] Gerenciamento das Comunicações - Curso Gerência de Projetos – Parte 8

[vídeo] Plano de Comunicação - Curso Gerência de Projetos – Parte 9

[vídeo] Seleção e Priorização de Projetos - Curso Gerência de Projetos – Parte 6

[vídeo] Escopo, metas, premissas, restrições - Curso Gerência de Projetos – Parte 7

[vídeo] Documento Conceitual do Projeto - Curso Gerência de Projetos – Parte 5


Você está em:




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


