como incrementar um mês a data em uma SP??

Firebird

18/04/2006

olá amigos, estou querendo saber como incrementar um mês a data e naum 30 dias como está, isso em uma SP no FB 1.5, no delphi uso a função IncMonth, mais na SP estou perdido..... aí está a SP

if (vFatura =´S´) then
begin
xqp = VPARCELA;
Venc = vvencimento;
while (:xQP <= :vQP ) do
begin
Insert into Fat_Receber (
ID_Fatura,
ID_Cliente,
Emissao,
Valor_Total,
Valor_Parcela,
Vencimento,
QP,
ID_Loja,
ID_Vendedor,
ID_Tipo,
Parcela )
Values(
:vID_Fatura,
:vID_Cliente,
:vEmissao,
:vValor_Total_Fatura,
:vValor_Parcela,
:Venc,
:vQP,
:vID_Loja,
:vID_Vendedor,
:vID_Tipo,
:xQP );
xQP = xQP + 1;
Venc = Venc + 30;
end
end


Camilo

Camilo

Curtidas 0

Respostas

Thomaz_prg

Thomaz_prg

18/04/2006

Me lembro de ter visto algumas UDF´s que faziam isso de forma mais simples (no site da [url=www.firebase.com.br/fb]firebase[/url]) mas dá pra fazer assim:

Primeiro cria-se 4 variáveis:
declare variable dia integer;
declare variable mes integer;
declare variable ano integer;
declare variable ndata varchar(10)


Depois é só separar os campos e fazer a soma, para em seguida, montar novamente a data:
dia = extract( day from CampoData );
mes = extract( month from CampoData );
ano = extract( year from CampoData );

if ( :mes = 12 ) then begin
  ano = :ano + 1;
  mes = 1;
end
else 
  mes = :mes + 1;

if (:mes = 2 and :dia >28) then 
  :dia = 28;

ndata = :dia||´.´||:mes||´.´||:ano;


Então é só montar a data:
Venc = Cast(nData as Date);


A única observação é que, no caso desse código, ele não analisa se é ano bissexto ou não, ou seja, se a data for 29/01/aaaa ao somar o mês, por mais que exista uma data 29/02/aaaa ele irá colocar 28/02/aaaa. É uma pequena falha, mas creio que dê para contornar isso.


GOSTEI 0
Thomaz_prg

Thomaz_prg

18/04/2006

Olá amigo... lembrei qual era a udf... não era do site da firebase não... é na propria lib que acompanha o firebird a fbudf... ela tem a função IncMonth.


GOSTEI 0
Camilo

Camilo

18/04/2006

caro amigo tomaz, obrigado pela atenção jah uso IncMonth no delphi mais no FB naum sei como usar via udf.. se puder me ajudar com um exemplo, fico grato...(Y)


GOSTEI 0
Thomaz_prg

Thomaz_prg

18/04/2006

Antes de Utilizar a UDF, você precisa registrá-la em seu banco de dados. Para isso, abra o banco de dados e execute o script contido em
Arquivos de Programas\Firebird\Firebird_X_X\UDF\fbudf.sql

Para incrementar o mês, basta usar a função AddMonth... dessa forma

NovoValor = AddMonth( SeuCampoOuValor , QuantosMesesIncrementar )

sendo:

NovoValor um timestamp ou date.
SeuCampoOuValor um timestamp ou date
QuantosMesesIncrementar um valor inteiro.

A função irá retornar um valor do tipo TimeStamp, portanto, se for apenas para mostrar esse valor em um select, o melhor é forçar a conversão para o tipo date: cast( AddMonth( p1, p2 ) as Date ).

Desculpe minha falha... coloquei o nome da função (UDF) como sendo IncMonth, mas o nome correto é AddMonth.


GOSTEI 0
Amilton/pr

Amilton/pr

18/04/2006

Desculpe . . . mas como é que adiciona essa UDF ao banco? Pode ser ser feito pelo IbExpert, abrindo o banco e rodando o script? Tem um exemplo . . . achei isso muito interessante


GOSTEI 0
POSTAR