GARANTIR DESCONTO

Fórum Selecionar todos os registros do mês anterior #275671

05/04/2005

0

Olá galera! Estou com o seguinte problema:

Eu queria faz um select q traga todos os registros em relação ao período do mês anterior.

Ex: o usuario iria gerar parcelas no dia 05/04/2005 com relação os contratos que estão ativos no mês anterior, ou seja, todos os contratos ativos entre 01/03/2005 a 31/03/2005. No BD existe a Tabela de Contrato e de Parcelas.

Obs: Estou usando D7 com firebird.


Rssampaio

Rssampaio

Responder

Posts

05/04/2005

Ariovaldo

Não sou a melhor pessoa para responder isso, mas eu tentaria usar a Function Extract Month e subtrairia 1 e passava como parametro e faria um tratamento especial para o mês de Janeiro POis 1-1 = 0 e não 12


Responder

Gostei + 0

05/04/2005

Essistemas

Eu uso esta rotina ve se te ajuda
Var
Data : String ;
Hoje : String ;
Janeiro,Dezembro,Mes,Ano : String ;
Anterior,AnoAnterior : Integer ;
Anobis: Real;
Begin

Hoje := DateTostr(now) ;
Mes := Copy(Hoje,4,2) ;
if RdUltimo.Checked Then
begin
Anterior :=StrtoInt( Mes )-1 ;
Mes :=IntTostr( Anterior ) ;
if Anterior = 0 Then
Mes :=´12´ ;
if Anterior = 1 Then
Mes := ´01´ ;
if Anterior = 2 Then
Mes := ´02´ ;
if Anterior = 3 Then
Mes := ´03´ ;
if Anterior = 4 Then
Mes := ´04´ ;
if Anterior = 5 Then
Mes := ´05´ ;
if Anterior = 6 Then
Mes := ´06´ ;
if Anterior = 7 Then
Mes := ´07´ ;
if Anterior = 8 Then
Mes := ´08´ ;
if Anterior = 9 Then
Mes := ´09´ ;
end
else
Anterior :=StrtoInt( Mes ) ;
Janeiro := ´01/01´+Copy(Hoje,6,5);
Ano :=Copy (Hoje,7,6);
if ( RdUltimo.Checked ) and ( Mes =´12´ ) Then
begin
AnoAnterior:=StrToint(Ano)-1 ;
Ano:=IntTostr( AnoAnterior );
end;
With ObjVendas.Tb_Vendas,sql do
Begin
Clear ;
Add(´Select Data,Sum(Valor)Total From MoviCaixa´) ;
Add(´Where (Data) >=:VData1 and (Data)<=:VData2´);
Add(´And Tipo = :VTipo´) ;
ParamByname(´VData1´ ).AsString:= ´01/´+Mes+´/´+Ano ;
ParamByname(´VTipo´).AsString:=´C´ ;
if (Anterior= 4) or (Anterior= 6)
or(Anterior= 9)or (Anterior= 11) Then
ParamByname(´VData2´).AsString:=´30/´+Mes+´/´+Ano
else
ParamByname(´VData2´).AsString:=´31/´+Mes+´/´+Ano ;
if Anterior = 2 Then
begin
Dezembro := ´31/12´+´/´+Ano ;
AnoBis := StrToDate(Dezembro)-StrToDate(Janeiro);
if AnoBis=365 then
begin
ParamByname(´VData2´).AsString:=´29/´+Mes+´/´+Ano ;
end
else
begin
ParamByname(´VData2´).AsString:=´28/´+Mes+´/´+Ano ;
end;
end;
Add(´Group by Data´);
Active:=True ;
end;


Responder

Gostei + 0

06/04/2005

Raserafim

rssampaio, para fazer isso diretamente no código SQL (que é o mais aconselhável), o ideal seria se o firebird tivesse funções como DATEPART e DATEADD, e que tem no SQL, mas não achei no firebird. Mas fiz umas ´gambiarras´ aqui que dá certo:
select CAMPODATA
from TESTE
where cast(substring(CAMPODATA from 6 for 2) as integer) = cast(substring(current_date from 6 for 2) as integer) - 1


fiz o teste aqui como o CAMPODATA sendo do tipo DATE.
pelo que entendi vc quer pegar a data atual e diminuir um mês, pegando assim todos os registros do mês anterior ao mês atual. Se for assim é o que está acima. Caso vc queira fornecer uma data ao invés de pegar a data atual automaticamente, passe como parâmetro:
select CAMPODATA
from TESTE
where cast(substring(CAMPODATA from 6 for 2) as integer) = cast(substring(:data from 6 for 2) as integer) - 1



Responder

Gostei + 0

06/04/2005

Raserafim

olha só, encontrei o que eu precisava. agora ficou mais ´elegante´.
falei do DATEPART do SQL e achei um correspondente do firebird: o EXTRACT. não achei nada ainda como o DATEADD, mas com o extract dá pra fazer muita coisa.
o código agora pode ficar assim:

select CAMPODATA
from TESTE
where extract(month from CAMPODATA) = extract(month from current_date) - 1


e caso vc queira passar o parâmetro:

select CAMPODATA
from TESTE
where extract(month from CAMPODATA) = extract(month from :data) - 1



Responder

Gostei + 0

06/04/2005

Gandalf.nho

Outra sugestão seria usar UDF para fazer isso. Uma boa sugestão é a biblioteca [url=http://rfunc.sourceforge.net/]rFunc[/url] que possui umas funções muito boas.


Responder

Gostei + 0

06/04/2005

Rssampaio

Obrigado! ae a todos q me me ajudaram, Valeu!
Eu consegui resolve isso com o código passado pelo raserafim q funcionou bem.

T+


Responder

Gostei + 0

06/04/2005

Emerson Nascimento

só uma observação: não esqueça de referenciar o ano, senão serão trazidos registros de todos os anos.


Responder

Gostei + 0

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

Aceitar