[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