[firebase-br] PROCEDURE LOCALIZA FERIADOS - Achei na net
Anderson Miranda Barrozo
andersonpaduarj em gmail.com
Sáb Jul 26 17:23:17 -03 2008
Achei esta procedure na lista e achei interessante. Não testei.
CREATE PROCEDURE FU_FERIADOS_DATAS(
WDAT DATE)
RETURNS (
WTIP CHAR(1))
AS
declare variable c integer;
declare variable d integer;
declare variable g integer;
declare variable h integer;
declare variable i integer;
declare variable j integer;
declare variable l integer;
declare variable m integer;
declare variable w integer;
declare variable de date;
declare variable ds date;
declare variable dp date;
declare variable cc date;
declare variable wano integer;
declare variable wfer varchar(40) =
'0101,0421,0501,0907,1012,1102,1115,1225';
declare variable trab varchar(5);
begin
/*
Localiza feriados nacionais e religiosos de um ano
*/
wtip = 'U';
if (:wdat is not null) then begin
w = extract(weekday from :wdat);
if (:w = 0) then
wtip = 'D';
else if (:w = 6) then
wtip = 'B';
trab = substring(cast(:wdat as varchar(10)) from 6 for 2) ||
substring(cast(:wdat as varchar(10)) from 9 for 2);
select result from Fu_pos(:trab, :wfer) into i;
if (:i > 0) then -- Feriado Indicado em WFER
wtip = 'F';
end
-- Ver se é Páscoa
select rdia, rmes, rano from Fu_decode_date(:wdat) into :d, :m, :wano;
select r_mod from Fu_Mod(:wano, 19) into :g;
select r_div from Fu_Div(:wano, 100) into :c;
-- Cálculo de H (C - C div 4 - (8 * C + 13) div 25 + 19 * G + 15) mod 30;)
select r_div from Fu_Div(:c, 4) into :w;
h = c - w;
w = (8 * :c) + 13;
select r_div from Fu_Div(:w, 25) into :w;
h = :h - :w + (19 * :g) + 15;
select r_mod from Fu_Mod(:h, 30) into :h;
-- Cálculo de i (H - (H div 28) * (1 - (H div 28) * (29 div (H + 1)) *
((21 - G) div 11)) )
select r_div from Fu_Div(:h, 28) into :w; -- H DIV 28
select r_div from Fu_Div(29, (:h + 1)) into :m; -- 29 DIV (h + 1)
select r_div from Fu_Div((21 - :g), 11) into :l; -- ((21 - G) div 11)
i = (:h - :w) * 1 - (:w * :m * :l);
-- Cálculo de j ((ano + ano div 4 + I + 2 - C + C div 4) mod 7)
select r_div from Fu_Div(:wano, 4) into :w;
select r_div from Fu_Div(:c, 4) into :l;
select r_mod from Fu_Mod(:wano + :w + :i + 2 - :c + :l, 7) into :j;
l = :i - :j;
-- Cálculo de m (3 + (L + 40) div 44)
select r_div from Fu_Div((:l + 40), 44) into :w;
m = 3 + :w;
-- Cálculo de d (L + 28 - 31 * (m div 4))
select r_div from Fu_Div((:m + 44), 44) into :w;
d = (:l + 28) - 31 * :w;
-- Finalmente acha DE (Como o domingo de Páscoa)
if (:d < 10) then
de = cast(substring(cast(:wdat as varchar(10)) from 1 for 5) ||
'0' || cast(:m as char(1)) || '-0' || cast(:d as char(1)) as date);
else
de = cast(substring(cast(:wdat as varchar(10)) from 1 for 5) ||
'0' || cast(:m as char(1)) || '-' || cast(:d as char(2)) as date);
-- Páscoa
dp = :de;
w = extract(weekday from :de);
while (:w > 1) do begin
de = :de + 1;
w = extract(weekday from :de);
end
-- Sexta-Feira Santa
ds = :de - 2;
-- Corpus Christi
cc = :ds + 62;
-- Carnaval
de = :de - 47;
if (:wdat = :de) then -- È Carnaval
wtip = 'C';
else if (:wdat = :ds) then -- É Sexta-Feira Santa
wtip = 'S';
else if (:wdat = :dp) then -- É Páscoa
wtip = 'P';
else if (:wdat = :cc) then -- É Corpus Christi
wtip = 'T';
suspend;
end
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AS Informática
Anderson Miranda Barrozo
(22) 8115-8761
MSN: andersonpaduarj em hotmail.com
Mais detalhes sobre a lista de discussão lista