[firebase-br] Pegar Mes anterior e Posterior

Luciano Carneiro luciano em praticsistemas.com.br
Sex Jun 24 11:39:08 -03 2005


----- Original Message ----- 
From: "Euler Jr." <euler em siginformatica.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, June 24, 2005 11:14 AM
Subject: Re: [firebase-br] Pegar Mes anterior e Posterior


> Criei a SP para esta finalidade. O código está abaixo:
>
> SET TERM # ;
> RECREATE PROCEDURE MES(MESANO CHAR(6)) RETURNS (ANTES CHAR(6),
> DEPOIS CHAR(6)) AS
... etc

Se quiser pode usar estas duas SPs que servem para este propósito:

CREATE PROCEDURE INC_DEC_PERI(
    WPER VARCHAR(7),
    WQTD SMALLINT)
RETURNS (
    R_INC_DEC_PERI VARCHAR(7))
AS
DECLARE VARIABLE WMES SMALLINT;
DECLARE VARIABLE WANO SMALLINT;
begin
wmes = cast(substring(:wper from 1 for 2) as SmallInt) + :wqtd;
wano = cast(substring(:wper from 4 for 4) as SmallInt);

if (:wqtd < 0) then
 begin
  while (:wmes < 1) do begin
   wmes = :wmes + 12;
   wano = :wano - 1;
  end
 end
else begin
 while (:wmes > 12) do begin
  wmes = :wmes - 12;
  wano = :wano + 1;
 end
end

select r_IntZero from IntZero(:wmes, 2) into r_Inc_Dec_peri;
r_Inc_Dec_Peri = :r_inc_dec_peri || '/' || cast(:wano as varchar(4));

Em conjunto com esta

CREATE PROCEDURE INTZERO(
    WINT BIGINT,
    WTAM INTEGER)
RETURNS (
    R_INTZERO VARCHAR(36))
AS
begin
if (:wint is null) then
 select r_replicate from replicate(:wtam, ' ') into r_IntZero;
else
 select r_Sright from S_Right('000000000000000000' || cast(:wint as
varchar(18)), :wtam) into :r_intzero;

suspend;
end

e com + esta

CREATE PROCEDURE REPLICATE(
    WQTD INTEGER,
    WVAR VARCHAR(255))
RETURNS (
    R_REPLICATE VARCHAR(255))
AS
begin
r_replicate = '';

while (:wqtd > 0) do begin
 r_replicate = r_replicate || :wvar;
 wqtd = :wqtd - 1;
end

suspend;
end

e + esta

CREATE PROCEDURE S_RIGHT(
    WVAR VARCHAR(255),
    WQTD INTEGER)
RETURNS (
    R_SRIGHT VARCHAR(255))
AS
DECLARE VARIABLE K INTEGER;
begin
if (:wvar is not null) then begin
 select r_Len from Len(:wvar) into :k;

 if (:wqtd >= :k) then
  r_sright = :wvar;
 else
  select r_Copy from Copy(:wvar, ((:k - :wqtd) + 1), :wqtd) into :r_sright;
end

suspend;
end

e + esta

CREATE PROCEDURE LEN(
    WSTR VARCHAR(2048))
RETURNS (
    R_LEN SMALLINT)
AS
DECLARE VARIABLE L varchar(10);
begin
if (:wstr = 'MithBuster') then
 r_Len = 10;
else begin
 wstr = :wstr || 'MithBuster';
 r_Len = 0;
 l = substring(:wstr from 1 for 10);

 while (:l <> 'MithBuster') do begin
  r_Len = :r_Len + 1;
  wstr = substring(:wstr from 2 for 1023);
  l = substring(:wstr from 1 for 10);
 end
end

suspend;
end

e + esta

CREATE PROCEDURE COPY(
    WVAR VARCHAR(1024),
    WINI INTEGER,
    WTAM INTEGER)
RETURNS (
    R_COPY VARCHAR(1024))
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE J INTEGER;
DECLARE VARIABLE K INTEGER;
begin
select r_Len from Len(:wvar) into :i;
j = 1;
k = 1;
r_copy = '';

while ((:wvar is not null) and (:i > 0) and (j <= :wtam)) do begin
 if (:k >= :wini) then begin
  r_copy = :r_copy || substring(:wvar from 1 for 1);
  j = j + 1;
 end

 wvar = substring(:wvar from 2 for 1023);
 k = :k + 1;
 i = :i - 1;
end

suspend;
end

Luciano C Santos





Mais detalhes sobre a lista de discussão lista