Relatório de Aniversáriantes Por Período
Olá, pessoal !!, estou precisando da ajuda de vcs, o que esta pegando é o seguinte, eu preciso fazer um relatório de aniversáriantes por período, onde o usuário vai informar o dia/mês inicial e final, ai eu preciso listar todos os aniversáriantes dentro deste período, eu fiz um sql, só que não da certo quando eu coloco dias iguais com meses diferentes como por exemplo 01/02 a 01/03, este SQL que eu fiz, ele retorna somente as pessoas que fazem aniversário no dia 01/02 e 01/03, ele não tras o restante dos dias, ele teria que trazer todos os dias de fevereiro mais o dia 01/03, que seria o intervalo entre as duas datas. Eu estou extraindo o dia e o mês pela data de nascimento, abaixo segue o SQL que eu fiz :
SELECT *
FROM TB_Dizimista D
Where Extract(Month From D.Dizi_Nascimento) between :pa_MesIni And :pa_MesFin
AND Extract(Day From D.Dizi_Nascimento) Between :pa_DiaIni And :pa_DiaFin
AND Comu_Codigo = :pa_Comunidade
ORDER BY D.Dizi_Nascimento_Conjugue,D.Dizi_Nome
-------------------------------------------------------------------------------------
Obrigado Pessoal, abraço ! :? :?
SELECT *
FROM TB_Dizimista D
Where Extract(Month From D.Dizi_Nascimento) between :pa_MesIni And :pa_MesFin
AND Extract(Day From D.Dizi_Nascimento) Between :pa_DiaIni And :pa_DiaFin
AND Comu_Codigo = :pa_Comunidade
ORDER BY D.Dizi_Nascimento_Conjugue,D.Dizi_Nome
-------------------------------------------------------------------------------------
Obrigado Pessoal, abraço ! :? :?
Eliel_martins
Curtidas 0
Respostas
Corcos
17/02/2007
Tenta assim
SELECT * FROM TABELA WHERE
DATA_INI >= :DATA_INI AND
DATA_FIM <= :DATA_FIM
GOSTEI 0
Eliel_martins
17/02/2007
Tenta assim
[quote:770ff7936c]SELECT * FROM TABELA WHERE
DATA_INI >= :DATA_INI AND
DATA_FIM <= :DATA_FIM
[/quote:770ff7936c]É o seguinte, eu estou extraindo o Dia e Mês da data de Nascimento, então por isso não posso usar deste jeito ai não. Também no sistema sí informa o dia e o mês nao tem o ano, o ano não me interessa. Obrigado pela ajuda ai .
GOSTEI 0
Emerson Nascimento
17/02/2007
eu faria assim:
essa instrução irá extrair a data no formato MM.DD e também montará seus parâmetros no mesmo formato. assim a busca se dará de forma correta. não sei se há uma solução melhor, mas sei que essa funciona.
SELECT * FROM TB_Dizimista D Where (Extract(Month From D.Dizi_Nascimento) + (Extract(Day From D.Dizi_Nascimento) / 100.00)) between (:pa_MesIni + (:pa_DiaIni / 100.00)) and (:pa_MesFin + (:pa_DiaFin / 100.0))
essa instrução irá extrair a data no formato MM.DD e também montará seus parâmetros no mesmo formato. assim a busca se dará de forma correta. não sei se há uma solução melhor, mas sei que essa funciona.
GOSTEI 0
Rinez
17/02/2007
Faça assim:
Coloque dois datetimerpicker um com nome inicial e outro com nome final. Coloque um dbgrid e ligue ao seu datasource. Um speedbutton e:
procedure TF_aniversariantes.SpeedButton1Click(Sender: TObject);
var
dia,mes,ano:word;
dia2,mes2,ano2:word;
begin
if inicial.date>final.Date then begin
messagebox(handle,pchar(´Data Inválida´),pchar(´Aviso´),$00000030);
inicial.SetFocus;
exit;
end;
decodedate(inicial.Date,ano,mes,dia);
decodedate(final.Date,ano2,mes2,dia2);
if ano<>ano2 then begin
messagebox(handle,pchar(´Coloque o mesmo ano´),pchar(´Aviso´), $00000030);
inicial.SetFocus;
exit;
end;
cqaniv.Close;
TRY
with qaniv do begin
close;
sql.Clear;
IF MonthOf(INICIAL.date)=MonthOf(final.date) THEN BEGIN
SQL.ADD(´SELECT * FROM TEL where ´);
SQL.ADD(´(extract(month from DATAANIV) BETWEEN :MMES AND :MMES2) AND ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes ´);
SQL.ADD(´and extract(day from DATAANIV) >= :Mdia) AND ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes2 and ´);
SQL.ADD(´extract(day from DATAANIV) <= :Mdia2) order by NOME´);
END ELSE BEGIN
SQL.ADD(´SELECT * FROM TEL where ´);
SQL.ADD(´(extract(month from DATAANIV) BETWEEN :MMES AND :MMES2) or ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes ´);
SQL.ADD(´and extract(day from DATAANIV) >= :Mdia) or ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes2 and ´);
SQL.ADD(´extract(day from DATAANIV) <= :Mdia2) order by NOME´);
END;
Params.ParamByName(´Mmes´).Value := MonthOf(INICIAL.date);
Params.ParamByName(´Mdia´).Value := DayOf(INICIAL.date);
Params.ParamByName(´Mmes2´).Value := MonthOf(final.date);
Params.ParamByName(´Mdia2´).Value := DayOf(final.date);
OPEN;
end;
EXCEPT
ON E: EXCEPTION DO BEGIN
SHOWMESSAGE( ´ERRO LINHA tal´+#13+E.Message);
label6.Caption:=´´;
EXIT;
END; END;
CQANIV.Open;
if cqaniv.RecordCount=0 then
label6.Caption:=´Nada Encontrado´;
if cqaniv.RecordCount=1 then
label6.Caption:=´Encontrado: ´+inttostr(cqaniv.RecordCount)+´ aniversariante.´;
if cqaniv.RecordCount>1 then
label6.Caption:=´Encontrados: ´+inttostr(cqaniv.RecordCount)+´ aniversariantes.´;
end;
Espero ter ajudado
Coloque dois datetimerpicker um com nome inicial e outro com nome final. Coloque um dbgrid e ligue ao seu datasource. Um speedbutton e:
procedure TF_aniversariantes.SpeedButton1Click(Sender: TObject);
var
dia,mes,ano:word;
dia2,mes2,ano2:word;
begin
if inicial.date>final.Date then begin
messagebox(handle,pchar(´Data Inválida´),pchar(´Aviso´),$00000030);
inicial.SetFocus;
exit;
end;
decodedate(inicial.Date,ano,mes,dia);
decodedate(final.Date,ano2,mes2,dia2);
if ano<>ano2 then begin
messagebox(handle,pchar(´Coloque o mesmo ano´),pchar(´Aviso´), $00000030);
inicial.SetFocus;
exit;
end;
cqaniv.Close;
TRY
with qaniv do begin
close;
sql.Clear;
IF MonthOf(INICIAL.date)=MonthOf(final.date) THEN BEGIN
SQL.ADD(´SELECT * FROM TEL where ´);
SQL.ADD(´(extract(month from DATAANIV) BETWEEN :MMES AND :MMES2) AND ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes ´);
SQL.ADD(´and extract(day from DATAANIV) >= :Mdia) AND ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes2 and ´);
SQL.ADD(´extract(day from DATAANIV) <= :Mdia2) order by NOME´);
END ELSE BEGIN
SQL.ADD(´SELECT * FROM TEL where ´);
SQL.ADD(´(extract(month from DATAANIV) BETWEEN :MMES AND :MMES2) or ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes ´);
SQL.ADD(´and extract(day from DATAANIV) >= :Mdia) or ´);
SQL.ADD(´(extract(month from DATAANIV) = :Mmes2 and ´);
SQL.ADD(´extract(day from DATAANIV) <= :Mdia2) order by NOME´);
END;
Params.ParamByName(´Mmes´).Value := MonthOf(INICIAL.date);
Params.ParamByName(´Mdia´).Value := DayOf(INICIAL.date);
Params.ParamByName(´Mmes2´).Value := MonthOf(final.date);
Params.ParamByName(´Mdia2´).Value := DayOf(final.date);
OPEN;
end;
EXCEPT
ON E: EXCEPTION DO BEGIN
SHOWMESSAGE( ´ERRO LINHA tal´+#13+E.Message);
label6.Caption:=´´;
EXIT;
END; END;
CQANIV.Open;
if cqaniv.RecordCount=0 then
label6.Caption:=´Nada Encontrado´;
if cqaniv.RecordCount=1 then
label6.Caption:=´Encontrado: ´+inttostr(cqaniv.RecordCount)+´ aniversariante.´;
if cqaniv.RecordCount>1 then
label6.Caption:=´Encontrados: ´+inttostr(cqaniv.RecordCount)+´ aniversariantes.´;
end;
Espero ter ajudado
GOSTEI 0