Alertar aniversario com 02 dias de antecedencia

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
WCARDOSO
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 08 Jul 2004 10:49

Alertar aniversario com 02 dias de antecedencia

Mensagem por WCARDOSO »

Caro colegas,
Preciso que o sistema avise com 02 dias de antecedencia quem está aniversariando, assim que o usuário antrar numa janela.
Como fazer que ele verifique no campo de data no cadastro de clientes???

Obrigado
[]´w
Wagner
wcardoso@oi.com.br :(
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

faz assim...

Código: Selecionar todos

aManiversario := {}
select Cliente
set order to <ANIVERSARIO>
seek DTOS(<ANIVERSARIO>+2)
do while (<ANIVERSARIO>+2) == (DATE()+2) .and. !eof()
   AADD( aManiversario , <CODIGO DO CLIENTE> )
   skip
enddo
depois disso, vc monta um aChoice com <aManiversario> pra mostrar os aniversarios, ou ainda manda pra impressora ou qualquer coisa do tipo...

isso ai deve resolve o q tu precisa....
falow...
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Código: Selecionar todos

aManiversario := {} 
select Cliente 
set order to <ANIVERSARIO> 
seek <DATA_PROCURA> +2
do while <ANIVERSARIO> == DATA_PROCURA+2 .and. !eof() 
   AADD( aManiversario , <CODIGO DO CLIENTE> ) 
   skip 
enddo 
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

valeu pela correçao, wagner
Avatar do usuário
WCARDOSO
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 08 Jul 2004 10:49

Mensagem por WCARDOSO »

kiko escreveu:valeu pela correçao, wagner
Caros Colegas, não tem como filtar esses aniversários, quer dizer apresentar na tela apenas quem fizer aniversário no dia 09/09.

Obrigado
[]´s
Wagner
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

pode usar indice ou filtro condicional.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
WCARDOSO
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 08 Jul 2004 10:49

Mensagem por WCARDOSO »

Desculpem por não entender, mas poderiam colocar um exemplo pra mim.
grato

[]´w
Wagner
[]´s
Wagner
Visitante

Mensagem por Visitante »

tipo assim:
SET FILTER TO ANIVERSARIO=DATE()+2

ou seja, vai filtrar todos que tiverem aniversário de hoje a 2 dias.

Um Clip Abraço
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

ddmm := ' '
@ 05,05 say 'Entre com o Dia e Mes' get ddmm picture '99/99'
read

list for left(dtoc(nascimento), 5) = ddmm
---------------------------------------------------------------
Lembrando que a data de nascimento e DATE() são data. Assim não adianta compara-las diretamente.
Em LEFT(DTOC(nascimento), 5) vc esta pegando o dia e mes do nascimento.
Em DDMM vc esta entrando com o dia e mes que vc quer verificar se existe alguem aniversariando.
Faça as verificações do Dia/Mes.
No lugar de LIST vc pode carregar um array como nos exemplos anteriores.

Boa sorte.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

O exemplo do amigo GVC apenas exibe na tela.

Use sempre o SET FILTER como citado pelo lizander ou un indice condiciona do tipo

INDEX ON NOME TO NOME.NTX WHEN ANIVERSARIO=DATE()+2
SET INDEX TO NOME.TXT
BROWSE()

Depois vc tem que restaura a lista de indices antiga.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

O LIST foi somente para exemplificar.
Veja na explicação logo abaixo que eu digo para carregar um array como nos outros exemplos.

O indice criado deve usar FOR e não WHEN.

index on nome to nome FOR LEFT(DTOC(NASCIMENTO), 5) = <var dd/mm>

Normalmente nós temos nos cadastros a data de nascimento. Não tem como comparar a data de nascimento com a data de hoje. LEFT(DTOC (NASCIMENTO), 5) retorna o Dia/Mes do nascimento. Assim podemos compara com uma variável para saber se é aniversário da pessoa.

FOR <condição> - Varre o arquivo DBF, colocando no arquivo de indice todos os registros cuja <condição> retorne verdadeiro.

WHEN <condição> - Varre o arquivo DBF a partir da posição atual, colocando no arquivo de indice os registros enquanto a <condição> retorne verdadeiro. Assim se os registro não estiverem

Enquanto um varre o arquivo todo, desde o inicio, o outro pega somente enquanto a condição for verdadeira.

Faça os teste e retorne os resultados, por favor.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Mlizander escreveu:tipo assim:
SET FILTER TO ANIVERSARIO=DATE()+2

ou seja, vai filtrar todos que tiverem aniversário de hoje a 2 dias.

Um Clip Abraço
Para lista de hoje a 2 dias, deveria ser:

SET FILTER TO ANIVERSARIO >= DATE() .and. ANIVERSARIO <= DATE() + 2

Lembrando que no cadastro temos a data de nascimento e não a data de aniversário. Então a comparação não deve se DD/MM entre as duas datas e não DD/MM/AA.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Amigo GVC,

A condição estava mesmo correta.

É um FOR mesmo, é que fiz e nem revisei o topico antes de postar.

Código: Selecionar todos

INDEX ON NOME TO NOME.NTX FOR ANIVERSARIO=DATE()+2 
SET INDEX TO NOME.NTX 
BROWSE()
Isso irá gerar o indice com os registros apenas que satisfaçam a condição.
Sem mais
Wagner Nunes
www.vagucs.com.br
Visitante

Mensagem por Visitante »

Tá certo GVC...

Eu vacilei em esquecer que no BD deve constar realmente a data de nascimento, que jamais será igual a data de hoje + 2.

Mas...
SET FILTER TO ANIVERSARIO >= DATE() .and. ANIVERSARIO <= DATE() + 2

O que isso retornaria?

Não seria mais correto:
SET FILTER TO SUBSTR(DTOS(ANIVERSARIO),5,4) = SUBSTR(DTOS(DATE() +2),5,4)
???

Um Clip Abraço

Liz@nder
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

ANIVERSARIO >= DATE() - todos os registros cujo campo ANIVERSARIO seja maior ou igual ao DATE()

ANIVERSARIO <= DATE() + 2 - todos os registros cujo campo ANIVERSARIO seja menor ou igual ao DATE() + 2

Assim será retornado todos os campos cujo campo ANIVERSARIO esteja entre a data de hoje até 2 dias a frente. Era o que vc queria retornar quando postou:
"SET FILTER TO ANIVERSARIO=DATE()+2
ou seja, vai filtrar todos que tiverem aniversário de hoje a 2 dias. "
o que esta errado, pois somente retorna os registro cujo campo ANIVERSARIO for iguais a data de hoje + 2 dias.
Somente postei para acertar sua lógica. Pode ser que sua declaração esteja errada.

aManiversario := {}
select Cliente // Não é necessário, é so para documentar.
cliente->(dbgotop())
while !cliente->(eof())
if left(dtoc(cliente->nascimento, 5) = left(dtoc(date() + 2), 5)
AADD( aManiversario , <CODIGO DO CLIENTE> )
end
cliente->(dbskip())
end

Antes do dbgotop coloque o arquivo na ordem necessária.
Isto coloca no array aManiversario o código dos clientes que farão anivesário dentro de 2 dias.
Não é necessário criar um indice, nem um filtro para isso.
Espero ter respondido a necessidade do nosso amigo WCARDOSO. Alias, ele não respondeu se já acertou a rotina necessária.
Responder