Entrar num Consenso - Lista de Aniversariantes

Delphi

26/08/2009

Bom dia galera do fórum

Devido a 2 dias fazendo pesquisas aqui no fórum não consegui achar uma rotina ou idéia clara sobre o assunto.
A maioria do pessoal precisa fazer relatório de aniversariantes do mês. Acontece que parte do código pego aqui no fórum, tem seus problemas. Gostaria de propor a comunidade colocar aqui um código realmente funcional para que todos possam utilizar.

Posso citar um padrão.

Banco de dados Firebird.
Estrutura.
CodCliente Integer
Endereço Varchar(50)
DtNascimento Date

Simples...

Agora vem o form

Para um relatório não há necessidade de informar o campo ano do nascimento, então ficaria 2 maskedits com o nome DtInicial e DtFinal, recebendo apenas o dia e mês.


Agora o código correto para compartilhar com a comunidade...

...
...
...
...


Fiz um sistema que lista os aniversariantes do dia, informando neste molde citado acima

Dm.dst_Ficha.Close;
Dm.dst_Ficha.CommandText := ´SELECT * FROM Fichas Where (Extract(Month From DtNascimento) + (Extract(Day From DtNascimento) / 100.00)) between (:Mes1 + (:Dia1 / 100.00)) and ´ +
´(:Mes2 + (:Dia2 / 100.0))´;
// Recebe os parametros.
Dm.dst_Ficha.ParamByName(´DIA1´).AsInteger := StrToInt(Copy(edtDataInicial.Text,1,2));
Dm.dst_Ficha.ParambyName(´MES1´).AsInteger := StrToInt(Copy(edtDataInicial.Text,4,5));
Dm.dst_Ficha.ParambyName(´DIA2´).AsInteger := StrToInt(Copy(edtDataFinal.Text,1,2));
Dm.dst_Ficha.ParambyName(´MES2´).AsInteger := StrToInt(Copy(edtDataFinal.Text,4,5));



Aparetemente funciona, mas não é possivel colocar a listagem em ordem, sai tudo bagunçado. [b:d9fd7686c9]Seria interessante também colocar a listagem numa ordem correta para o usuario final.[/b:d9fd7686c9]

O problema é que aparentemente informando 01/07 a 31/07 o sistema lista aniversariantes do mês de agosto. Muito estranho.
[color=red:d9fd7686c9][b:d9fd7686c9]Se for apenas informado o dia: 01/07 a 01/07 da certo, intervalos que são o problema. Então seria uma rotina a ser desenvolvida, que realmente funciona-se com dia, período entre meses 01/07 a 30/08 ou dentro do próprio mês.
[/b:d9fd7686c9][/color:d9fd7686c9]


Então, resumindo, gostaria aqui de deixar esta mensagem para estimular a galera a realmente desenvolver o código correto, há muitas linhas de código sobre o assunto no fórum, mas infelizmente são informações pouco claras para o usuário leigo e as vezes não ajudam em nada, infelizmente.

Não quero crucificar ninguem, pq também tenho dificuldades e nada melhor do que recorrer ao fórum, e solicitar informações. Informações esta clara e objetiva.

Grato a todos.


Valnei

Valnei

Curtidas 0

Respostas

Facc

Facc

26/08/2009

tente dessa forma

Select <campos> from <tabela>
where extract (day from <campo_data>) = <seu parametro>
   and extract (month from <campo_data>) = <seu parametro>


faço dessa forma, e sempre funcionou pra mim.


GOSTEI 0
Elip2008

Elip2008

26/08/2009

brother eu utilizo assim:

select * from aniversariantes
where
day(dataNascimento) between :diaInicial and :diaFinal and
month(dataNascimento) between :mesIncicial and :mesFinal


GOSTEI 0
Valnei

Valnei

26/08/2009

Caro amigo

Grato pela dica, ajudou bastante, mas tive que fazer alguns ajustes.

Veja como ficou...

Dm.dst_Ficha.CommandText := ´select * from fichas where (Extract(day from dtnascimento)) between :dia1 and :dia2 and (Extract(month from dtNascimento)) between :mes1 and :mes2´;

Ai funfou, mas gostaria que a comunidade discutice mais e posta-se exemplos mais completos...


Grato a todos e esperamos que o código final seja finalizado e disponibilizado para a comunidade.

Abraços
Valnei


GOSTEI 0
Facc

Facc

26/08/2009

O que vc quiz dizer com mais completo?

Caro amigo Grato pela dica, ajudou bastante, mas tive que fazer alguns ajustes. Veja como ficou... Dm.dst_Ficha.CommandText := ´select * from fichas where (Extract(day from dtnascimento)) between :dia1 and :dia2 and (Extract(month from dtNascimento)) between :mes1 and :mes2´; Ai funfou, mas gostaria que a comunidade discutice mais e posta-se exemplos mais completos... Grato a todos e esperamos que o código final seja finalizado e disponibilizado para a comunidade. Abraços Valnei



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/08/2009

Caro amigo Grato pela dica, ajudou bastante, mas tive que fazer alguns ajustes. Veja como ficou... Dm.dst_Ficha.CommandText := ´select * from fichas where (Extract(day from dtnascimento)) between :dia1 and :dia2 and (Extract(month from dtNascimento)) between :mes1 and :mes2´; Ai funfou, mas gostaria que a comunidade discutice mais e posta-se exemplos mais completos... Grato a todos e esperamos que o código final seja finalizado e disponibilizado para a comunidade. Abraços Valnei


acho que essa instrução não funciona...

teste assim:

tendo na tabela as datas:

01/Jan/1975
08/Jan/1975
09/Jan/1975
12/Jan/1975
14/Jan/1975
25/Jan/1975
06/Fev/1975
09/Fev/1975
12/Fev/1975
22/Fev/1975
25/Fev/1975

com o código acima consulte os aniversariantes entre 25/Jan e 09/Fev e veja o que será listado.

para funcionar com aquele primeiro código que você postou, é necessário que o dia SEMPRE seja dividido por 100.00 (cem - ponto - zero, zero )

Dm.dst_Ficha.Close;
Dm.dst_Ficha.CommandText := ´SELECT * FROM Fichas Where (Extract(Month From DtNascimento) + (Extract(Day From DtNascimento) / 100.[size=18:1cd1696583][b:1cd1696583]00[/b:1cd1696583][/size:1cd1696583])) ´+
´between (:Mes1 + (:Dia1 / 100.[size=18:1cd1696583][b:1cd1696583]00[/b:1cd1696583][/size:1cd1696583])) and (:Mes2 + (:Dia2 / 100.[size=18:1cd1696583][b:1cd1696583]00[/b:1cd1696583][/size:1cd1696583]))´;
[b:1cd1696583]note que faltava um zero no último divisor[/b:1cd1696583]

agora faça a mesma consulta - aniversariantes entre 25/Jan e 09/Fev - e veja o resultado.

você pode ordenar o resultado como quiser. basta adicionar o [i:1cd1696583]order by[/i:1cd1696583] ao comando.


GOSTEI 0
Valnei

Valnei

26/08/2009

Caro amigo emerson.en.

Irei fazer o teste, e utilizar o order by...., espero que funcione corretamente como no exemplo citado, que na qual, agradeço e muito.

No código informado (outro - logo abaixo) eu utilizei e funcionou assim meio que no desespero, pois o cliente precisa da listagem por dia: 01/08 a 01/08 e na rotina anterior (tirando esta que na qual vc arrumou agora), não funcionava, então tive que pegar outro código e fazer os testes, por enquanto esta dando para, digamos assim gambiar, mas pretendo fazer testes com a sua nova função e obter os resultados desejados.

Muito grato pela sua ajuda.
Valnei


GOSTEI 0
Valnei

Valnei

26/08/2009

Caro amigo

Na última postagem, faltou o 0 (zero) no último item, refiz, funcionou, mas não consigo colocar em ordem de data de nascimento.

Na listagem sai as datas de aniversários impressas na seguinte ordem, solicitando no select as datas : 01/04 a 04/04 :

01/04/2009
01/04/2009
04/04/2009
01/04/2009
04/04/2009
01/04/2009

Coloquei o order by DtNascimento. Será que estou fazendo algo errado, caro amigo emerson.es.

Poderiam me ajudar a colocá-la em ordem de data de nascimento.

Grato.
Valnei


GOSTEI 0
Valnei

Valnei

26/08/2009

Caro amigo

Na última postagem, faltou o 0 (zero) no último item, refiz, funcionou, mas não consigo colocar em ordem de data de nascimento.

Na listagem sai as datas de aniversários impressas na seguinte ordem, solicitando no select as datas : 01/04 a 04/04 :

01/04/2009
01/04/2009
04/04/2009
01/04/2009
04/04/2009
01/04/2009

Coloquei o order by DtNascimento. Será que estou fazendo algo errado, caro amigo emerson.es.

Poderiam me ajudar a colocá-la em ordem de data de nascimento.

Grato.
Valnei


GOSTEI 0
Dogu

Dogu

26/08/2009

Fera de mais, é o componente CategoryPanelGroup da página Additional.

Mas coomo farei para ele simular o efeito de se fechar e se esconder nos cantos da tela?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/08/2009

Caro amigo Na última postagem, faltou o 0 (zero) no último item, refiz, funcionou, mas não consigo colocar em ordem de data de nascimento. Na listagem sai as datas de aniversários impressas na seguinte ordem, solicitando no select as datas : 01/04 a 04/04 : 01/04/2009 01/04/2009 04/04/2009 01/04/2009 04/04/2009 01/04/2009 Coloquei o order by DtNascimento. Será que estou fazendo algo errado, caro amigo emerson.es. Poderiam me ajudar a colocá-la em ordem de data de nascimento. Grato. Valnei

[size=18:ee14687944]
publique a instrução completa, como você executou.[/size:ee14687944]


GOSTEI 0
Valnei

Valnei

26/08/2009

Boa noite


emerson.en, segue a rotina completa.

Estrutura.

Banco de dados Firebird.

Tabela Fichas.

CodCliente Integer
Endereço Varchar(50)
DtNascimento Date



Instrução que executo ao clicar no botão filtro.

Dm.dst_Ficha.Close;
Dm.dst_Ficha.CommandText := ´SELECT * FROM Fichas Where (Extract(Month From DtNascimento) + (Extract(Day From

DtNascimento) / 100.00)) between (:Mes1 + (:Dia1 / 100.00)) and ´ +
´(:Mes2 + (:Dia2 / 100.0)) order by DtNascimento´;

// Recebe os parametros.
Dm.dst_Ficha.ParamByName(´DIA1´).AsInteger := StrToInt(Copy(edtDataInicial.Text,1,2));
Dm.dst_Ficha.ParambyName(´MES1´).AsInteger := StrToInt(Copy(edtDataInicial.Text,4,5));
Dm.dst_Ficha.ParambyName(´DIA2´).AsInteger := StrToInt(Copy(edtDataFinal.Text,1,2));
Dm.dst_Ficha.ParambyName(´MES2´).AsInteger := StrToInt(Copy(edtDataFinal.Text,4,5));

Quero agradecer por enquanto a sua grande ajuda.
Um forte abraço
Valnei

Com estas linhas o resultado é na listagem as seguintes datas de nascimento.

01/04/2009
01/04/2009
04/04/2009
04/04/2009
01/04/2009
04/04/2009
04/04/2009
01/04/2009


Informando no primeiro Edit o intervalo 01/04 e no outro Edit o intervalo: 04/04

Sendo para 01/04 o nome do componente edtDataInicial e edtDataFinal para o dia 04/04.

Valeu.


GOSTEI 0
Valnei

Valnei

26/08/2009

Caros amigos,

Ainda não consegui resolver este problema, então alguém tem alguma rotina de aniversário funcional e que possa ser ordenada por ordem de data.

As vezes o cliente quer somente o dia de hoje, as vezes um período de 1 semana, mas a listagem sai em ordem errada conforme o UP acima.

Grato a todos que puderem dar uma ajuda.

t+
Valnei


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/08/2009

primeiro: falta o ZERO na última divisão.
Dm.dst_Ficha.Close;
Dm.dst_Ficha.CommandText := ´SELECT * FROM Fichas Where (Extract(Month From DtNascimento) + (Extract(Day From

DtNascimento) / 100.00)) between (:Mes1 + (:Dia1 / 100.00)) and ´ +
´(:Mes2 + (:Dia2 / 100.0[b:ee4f3d9db1][size=18:ee4f3d9db1]0[/size:ee4f3d9db1][/b:ee4f3d9db1])) order by DtNascimento´;

segundo: tem que ordenar corretamente. o [i:ee4f3d9db1]order by[/i:ee4f3d9db1] é um comando do banco de dados. se o seu campo é de um tipo data, tem que funcionar.


GOSTEI 0
POSTAR