FILTRAR ANIVERSARIANTES NUM BANCO
Moderador: Moderadores
FILTRAR ANIVERSARIANTES NUM BANCO
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 !!!
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 !!!
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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í
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í
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
Nao resolve...
O filtro para o mesmo mes funciona legal, o problema é se colocar por exemplo 15/05/2006 a 12/06/2006 entende ?
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
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
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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í
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í
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
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
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
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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 ?
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 ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
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
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
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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 é ?
Index on Substr(Dtoc(Nasc),1,5)) to indice
ele vai pegar justamente dia e mes ! O que realmente nos interessa ! Não é ?
Editado pela última vez por alaminojunior em 29 Mai 2006 18:29, em um total de 1 vez.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
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
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
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP

