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.