Página 1 de 1

FILTRAR ANIVERSARIANTES NUM BANCO

Enviado: 24 Mai 2006 18:36
por MICROLIVE
GALERA, PRECISO IMPRIMIR ETIQUETAS DE ANIVERSARIANTES PARA MALA DIRETA E NAO CONSIGO FILTRAR, USEI A SEGUINTE ROTINA PARA PEGAR OS ANIVERSARIANTES DE UM MESMO MES, MAS MESES DIFERENTES NAO ROLA...

V_DAT_INI := DATE()
V_DAT_FIN := DATE()

@ MIDROW , 7 SAY "Periodo Inicial :" GET V_DAT_INI
@ MIDROW+1, 7 SAY "Periodo Final :" GET V_DAT_FIN
READ

V_MES_INI := SUBSTR(DTOC(V_DAT_INI),4,2)
V_MES_FIN := SUBSTR(DTOC(V_DAT_FIN),4,2)

IF SUBSTR(DTOC(CLIENTEDB->NASCIDO),4,2) >= V_MES_INI .AND. SUBSTR(DTOC(CLIENTEDB->NASCIDO),4,2) <= V_MES_FIN

@ PROW()+1, 0 SAY CLIENTEDB->CODICLIE
@ PROW() , 9 SAY CLIENTEDB->NOME
@ PROW() , 51 SAY SUBSTR(CLIENTEDB->TELEFONE,1,20)
@ PROW() , 73 SAY CLIENTEDB->NOMCONV

ENDIF

PRECISEI IMPRIMIR DO MES DE JUNHO/06 E SAIU LEGAL

@ MIDROW , 7 SAY "Periodo Inicial :" GET V_DAT_INI ( 01/06/2006 )
@ MIDROW+1, 7 SAY "Periodo Final :" GET V_DAT_FIN ( 30/06/2006 )

MAS SE COLOCAR 31/05/2006 A 01/06/2006 DA ERRO
TENTEI FILTRAR PELO DIA MAS ENFIM... NAO CONSEGUI...

PESQUISEI AS FUNCOES DE DATA NO NG E NAO ACHEI NENHUMA QUE ME AJUDASSE...

AGUARDO CONTATOS !!!

Enviado: 25 Mai 2006 12:24
por alaminojunior
Olá meu caro, só um detalhe

V_MES_INI := SUBSTR(DTOC(V_DAT_INI),4,2)
V_MES_FIN := SUBSTR(DTOC(V_DAT_FIN),4,2)

tente assim

V_MES_INI := SUBSTR(DTOC(V_DAT_INI),5,2)
V_MES_FIN := SUBSTR(DTOC(V_DAT_FIN),5,2)

o caracter separador "/" tambem conta

tente aí

Nao resolve...

Enviado: 26 Mai 2006 18:19
por MICROLIVE
O filtro para o mesmo mes funciona legal, o problema é se colocar por exemplo 15/05/2006 a 12/06/2006 entende ?

Enviado: 26 Mai 2006 22:15
por evaldo
Informe o Mes inicial: get nMesI PICTURE "99" VALID nMesI >= 1 .AND. nMes <= 12
Informe o Mes final: get nMesF PICTURE "99" VALID nMesI >= 1 .AND. nMes <= 12

Use a funcao MONTH().
O Filtro vai ficar assim:
MONTH(CLIENTEDB->NASCIDO) >= nMesI .AND. MONTH(CLIENTEDB->NASCIDO) <= nMesF

Ok

Enviado: 29 Mai 2006 14:32
por Eolo
Microlive,

Aqui está uma solução que funciona com meses e/ou anos diferentes nas datas inicial e final, e que considera set date brit e set cent on (ddmmaaaa), year(final)-year(inicio)=0 ou 1, e qualquer intervalo de pesquisa, desde que "inicio<=final".

As linhas indicadas com (a) são a correção de datas de nascimento (29/fev) de anos bissextos.


*...
use nomes
priv nasc1, nasc2
if year(inicio)=year(final) // por ex, pesquisa de 15/05/2006 a 12/06/2006
__whil !eof()
____nasc1=left(dtoc(nascido),6)+strzero(year(inicio),4,0)
____nasc1=iif(empty(ctod(nasc1)),ctod("28"+substr(nasc1),3,8),ctod(nasc1)) // (a)
____if nasc1>=inicio .and. nasc1<=final
______* manda imprimir
____endi
____skip
__endd
else // por ex, pesquisa de 15/12/2005 a 12/01/2006
__whil !eof()
____nasc1=left(dtoc(nascido),6)+strzero(year(inicio),4,0)
____nasc1=iif(empty(ctod(nasc1)),ctod("28"+substr(nasc1),3,8),ctod(nasc1)) // (a)
____nasc2=left(dtoc(nascido),6)+strzero(year(final),4,0)
____nasc2=iif(empty(ctod(nasc2)),ctod("28"+substr(nasc2),3,8),ctod(nasc2)) // (a)
____if nasc1>=inicio .or. nasc2<=final
______* manda imprimir
____endi
____skip
__endd
endi
use
retu



Demonstrando:

ANOS IGUAIS, DATAS DIFERENTES: pesquisa de 15/05/2006 a 12/06/2006
Ex (a) nascido=31/01/1975 -> nasc1=31/01/2006
-----> if 31/01/2006>=15/05/2006 .and. 31/01/2006<=12/06/2006 (.F. e .T.) -> não imprime
Ex (b) nascido=01/06/1950 -> nasc1=01/06/2006
-----> if 01/06/2006>=15/05/2006 .and. 01/06/2006<=12/06/2006 (.T. e .T.) -> imprime!

ANOS DIFERENTES, DATAS DIFERENTES: pesquisa de 15/12/2005 a 12/01/2006
Ex (a) nascido=31/01/1975 -> nasc1=31/01/2005 -> nasc2=31/01/2006
-----> if 31/01/2005>=15/12/2005 .or. 31/01/2006<=12/01/2006 (.F. ou .F.) -> não imprime
Ex (b) nascido=19/12/1950 -> nasc1=19/12/2005 -> nasc2=19/12/2006
-----> if 19/12/2005>=15/12/2005 .or. 19/12/2006<=12/01/2006 (.T. ou .F.) -> imprime!

DATAS IGUAIS: pesquisa de 15/05/2006 a 15/05/2006
Ex (a) nascido=31/01/1975 -> nasc1=31/01/2006
-----> if 31/01/2006>=15/05/2006 .and. 31/01/2006<=15/05/2006 (.F. e .T.) -> não imprime
Ex (b) nascido=15/05/1950 -> nasc1=15/05/2006
-----> if 15/05/2006>=15/05/2006 .and. 15/05/2006<=15/05/2006 (.T. e .T.) -> imprime!


Eolo

Enviado: 29 Mai 2006 15:01
por alaminojunior
Caro amigo MicroLive, na minha mensagem mais acima, falei besteira, desculpe !
Mas, tenho tambem uma rotina para mostrar os aniversariantes do mes, veja só:

Function Aniver
Local Tela:=savescreen(00,00,29,79),com:="Notepad Lista.Tmp"
_Mes:= 0
GF(15,20,19,59,1,9)
@ 16,22 say "Entre com mes [00] ou ENTER p/ todos" colo "W/B"
@ 17,38 get _mes pict "@ZE 99" valid(_mes >= 0 .and. _mes <= 12) colo "gr+/n"
set curs on
read
set curs off
Set Printer to Lista.tmp
Set Device to Printer
@ 0, 0 say Replicate("=", 80)
@ 1, 0 say usuario
@ 1, 63 say "Data : " + DToC(Date())
@ 2, 0 say Replicate("=", 80)
@ 3, 0 say "Lista dos Aniversariantes"
@ 3, Pcol()+5 say "Mes.: "+strzero(_mes,2)
@ 4, 0 say Replicate("-", 80)
sele dizimist
OrdSetFocus("indnas")
DbGoTop()
If _mes = 0
Do While !eof()
Imp_Ani()
Skip
Enddo
Else
DbSeek(Strzero(_mes,2))
Do While !eof()
If (Substr(Dtoc(nasc),4,2) = strzero(_mes,2))
Imp_Ani()
Skip
Else
Skip
Endif
Enddo
Endif
Set Device to Screen
cls
Gmode(3)
SetMode(25,80)
SwpRunCmd(com)
Gmode(18)
RestScreen(00,00,29,79,tela)

Function Imp_Ani
@ Prow()+1,00 say Nome
@ Prow()+1 ,00 say Endereco+" "+Dtoc(nasc)
@ Prow()+1,00 say ""

Funciona direitinho, o que vc tem de fazer é:
Modificar o get lá em cima, informar mes inicial e final e depois no laço Do While: If (Substr(Dtoc(nasc),4,2) <= strzero(_mes_fin,2) .and. Substr(Dtoc(nasc),4,2) >= strzero(_mes_ini,2)))
Tenta aí

Enviado: 29 Mai 2006 15:42
por Eolo
Alamino,

O Microlive não quer pegar os aniversários de um mês específico e sim os de um período, o qual pode passar de um mês para o outro. Como ele disse aí em cima: "O filtro para o mesmo mes funciona legal, o problema é se colocar por exemplo 15/05/2006 a 12/06/2006...".

E faz sentido: hoje, 29-maio, ele pode querer só os aniversariantes da semana que vem, de 4 a 10-jun, e não junho inteiro.

Eolo

Enviado: 29 Mai 2006 15:59
por alaminojunior
Tambem dá !
O x da questão é:
1º - As variaveis: Mes_ini:= Substr(dtoc(date(),4,2)
Mes_fin:= Substr(dtoc(date(),4,2)
2º - Indexar assim: Index on Substr(Dtoc(Nasc),4,2) to indice

3º - Antes de imprimir dar um DbSeek(Mes_ini)

4º - Aí sim, começa o Do While !eof()
If mes_ini >= nasc .or. mes_fin <= nasc
imprime
Skip
Else
Skip
Endif
Ok ?

Enviado: 29 Mai 2006 16:28
por Eolo
Não dá certo, e pelo seguinte: se o campo NASCIDO é Data, ele contem "DDMMAAAA", certo?, e se indexar por ele, o ANO (AAAA) vai interferir na indexação. Então um cara nascido em 29-mai-1960 não vai ficar junto (na indexação) de outro nascido em 29-mai-1980... Vão aparecer primeiro os de 1960 (jan/fev/mar...), depois os de 1961, 1962 etc. Também, se vc fizer a pesquisa por "29-mai-2006", pode não aparecer ninguém...

Por isso montei o meu exemplo da forma que está lá.

Agora, se a idéia é rapidez, o ideal era criar um outro campo, só com MM/DD (nessa ordem), copiando os valores parciais do campo NASCIDO, e indexar ele. Quando vc usar o dbseek(left(dtoc(inicial),5)), com a cláusula softseek ligada, ele vai direto no primeiro registro do intervalo desejado (ou o mais próximo dele). Depois, é só mandar sair do While quando MM/DD for maior que left(dtoc(final),5).

Eolo

Enviado: 29 Mai 2006 17:54
por alaminojunior
Desculpe, se voce indexar desta maneira:
Index on Substr(Dtoc(Nasc),1,5)) to indice
ele vai pegar justamente dia e mes ! O que realmente nos interessa ! Não é ?

Enviado: 29 Mai 2006 18:12
por gvc
Se vc colocar na indexação:
right(dtos(nasc), 4)

Assim a data 10/03/2006 vira 0310 ou seja DD/MM/AAAA para MMDD.

Boa sorte.

Enviado: 29 Mai 2006 19:35
por Eolo
Alamino,

Sim, está certo se vc fizer
index on substr(Dtoc(Nasc),1,5)) -> 03/10/1970 -> 03/10
(isto se SET DATE BRIT)
e mandar procurar por dia/mês

Mas, no post anterior, vc colocou
Index on Substr(Dtoc(Nasc),4,2), portanto só o mês...
(idem SET DATE BRIT)


Eu usaria a idéia do GVC,
index on right(dtos(nasc), 4) = 03/10/1970 -> 19701003 -> 1003
e mandaria procurar por 1003.

Não uso DTOC() em índices, só o DTOS(). O DTOC() depende do SET DATE, o DTOS() não.

Eolo

Enviado: 29 Mai 2006 22:01
por alaminojunior
Sim, exatamente, tem de trabalhar de acordo com o SET DATE ...