Página 1 de 2

Alertar aniversario com 02 dias de antecedencia

Enviado: 06 Set 2005 07:47
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 :(

Enviado: 06 Set 2005 08:23
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...

Enviado: 06 Set 2005 13:08
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 

Enviado: 06 Set 2005 17:47
por kiko
valeu pela correçao, wagner

Enviado: 07 Set 2005 09:18
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

Enviado: 07 Set 2005 12:45
por vagucs
pode usar indice ou filtro condicional.

Enviado: 07 Set 2005 16:41
por WCARDOSO
Desculpem por não entender, mas poderiam colocar um exemplo pra mim.
grato

[]´w
Wagner

Enviado: 08 Set 2005 08:23
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

Enviado: 08 Set 2005 10:17
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.

Enviado: 08 Set 2005 10:33
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.

Enviado: 08 Set 2005 11:32
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.

Enviado: 08 Set 2005 11:39
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.

Enviado: 08 Set 2005 12:41
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.

Enviado: 09 Set 2005 10:46
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

Enviado: 09 Set 2005 12:39
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.