Entrar num Consenso - Lista de Aniversariantes
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.
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
Curtidas 0
Respostas
Facc
26/08/2009
tente dessa forma
faço dessa forma, e sempre funcionou pra mim.
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
26/08/2009
brother eu utilizo assim:
select * from aniversariantes
where
day(dataNascimento) between :diaInicial and :diaFinal and
month(dataNascimento) between :mesIncicial and :mesFinal
select * from aniversariantes
where
day(dataNascimento) between :diaInicial and :diaFinal and
month(dataNascimento) between :mesIncicial and :mesFinal
GOSTEI 0
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
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
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
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
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
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
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
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
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
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
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?
Mas coomo farei para ele simular o efeito de se fechar e se esconder nos cantos da tela?
GOSTEI 0
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
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.
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
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
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
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.
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