como incrementar um mês a data em uma SP??
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
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
Curtidas 0
Respostas
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:
Depois é só separar os campos e fazer a soma, para em seguida, montar novamente a data:
Então é só montar a data:
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.
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
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
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
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.
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
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