Fórum Selecionar todos os registros do mês anterior #275671
05/04/2005
0
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
Curtir tópico
+ 0Posts
05/04/2005
Ariovaldo
Gostei + 0
05/04/2005
Essistemas
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;
Gostei + 0
06/04/2005
Raserafim
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
Gostei + 0
06/04/2005
Raserafim
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
Gostei + 0
06/04/2005
Gandalf.nho
Gostei + 0
06/04/2005
Rssampaio
Eu consegui resolve isso com o código passado pelo raserafim q funcionou bem.
T+
Gostei + 0
06/04/2005
Emerson Nascimento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)