Fórum como incrementar um mês a data em uma SP?? #55825

18/04/2006

0

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

Responder

Posts

20/04/2006

Thomaz_prg

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.


Responder

Gostei + 0

21/04/2006

Thomaz_prg

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.


Responder

Gostei + 0

24/04/2006

Camilo

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)


Responder

Gostei + 0

24/04/2006

Thomaz_prg

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.


Responder

Gostei + 0

24/04/2006

Amilton/pr

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar