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???
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...
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
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.
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.
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.
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.