como consultar atraves da data
Moderador: Moderadores
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
como consultar atraves da data
Boa noite estou fazendo um sistema de cadastro de clientes para um amigo ele quer uma consulta por data de nascimento, como fazer desde ja agradeco a colaboracao
-
anacatacombs
- Membro Master

- Mensagens: 472
- Registrado em: 12 Jul 2005 16:53
- Localização: Cianorte-Paraná
- Contato:
Re: como consultar atraves da data
Meu querido... Seja bem vindo ao fórum...
Você não fui muito especifico com a estrutura do seu sistema, e como você deseja fazer essa consulta... por favor, nos passe mais detalhes a respeito dessa consulta.. seria dentro do próprio cadastro de clientes?
[]'s
Você não fui muito especifico com a estrutura do seu sistema, e como você deseja fazer essa consulta... por favor, nos passe mais detalhes a respeito dessa consulta.. seria dentro do próprio cadastro de clientes?
[]'s
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
como consultar atraves da data
Antonio, é muito bom quando é passado a estrutura do DBF. E o que a Ana refere-se é que você pode procurar uma data específica ou um período de data. E seria bom ter mencionado a versão do Clipper. Mas vamos lá...
Primeiramente, para ambos os casos (Clipper 5.??), você precisará INDEXar o campo data_de_nascimento do seu DBF. E a forma correta seria assim:
INDEX ON DTOS(data_de_nascimento) TO arquivo_ntx // o nome dado "data_de_nascimento" deve ser substituido pelo nome do campo que você deu.
Se a sua pesquisa precisar ser feita, de forma específica:
1. Faça um GET var_data PICTURE "@D" // nome da variável var_data pode ser mudado ao seu critério
READ
2. Após o READ, procure pelo comando SEEK, mas antes transforme a data no padrão "AAAAMMDD" (ano em quatro dígitos, mês e dia), assim:
Agora se a sua pesquisa é por período, pode fazer assim:
1. Faça dois GETs
@ ... GET var_data1 PICTURE "@D"
@ ... GET var_data2 PICTURE"@D"
READ
2. Não conheço uma forma de utilizar o SEEK com indexação em NTX. Então iremos utilizar o LOCATE após o READ
E quando trata-se de datas, é conveniente utilizar o SET DATE BRITISH (que é o semelhante a data como usamos no Brasil) e o SET CENTURY ON para trabalhar o ano com quatro dígitos. Espero ter ajudado. Se houverem dúvidas, poste o seu código que irmemos lhe ajudar.
Primeiramente, para ambos os casos (Clipper 5.??), você precisará INDEXar o campo data_de_nascimento do seu DBF. E a forma correta seria assim:
INDEX ON DTOS(data_de_nascimento) TO arquivo_ntx // o nome dado "data_de_nascimento" deve ser substituido pelo nome do campo que você deu.
Se a sua pesquisa precisar ser feita, de forma específica:
1. Faça um GET var_data PICTURE "@D" // nome da variável var_data pode ser mudado ao seu critério
READ
2. Após o READ, procure pelo comando SEEK, mas antes transforme a data no padrão "AAAAMMDD" (ano em quatro dígitos, mês e dia), assim:
Código: Selecionar todos
SEEK DTOS(var_data)
IF FOUND()
DO WHILE data_de_nascimento=var_data
? nome+" "+data_de_nascimento
SKIP
ENDDO
ENDIF1. Faça dois GETs
@ ... GET var_data1 PICTURE "@D"
@ ... GET var_data2 PICTURE"@D"
READ
2. Não conheço uma forma de utilizar o SEEK com indexação em NTX. Então iremos utilizar o LOCATE após o READ
Código: Selecionar todos
LOCATE FOR data_de_nascimento>=var_data1 .AND. data_de_nascimento<=var_data2
IF FOUND()
DO WHILE data_de_nascimento=var_data
? nome+" "+data_de_nascimento
SKIP
ENDDO
ENDIFUm clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Re: como consultar atraves da data
Acho que estamos esquecendo que indexar pelo campo data não ajuda muito pois o ano é usado para montar a chave e irá atrapalhar na hora de montar o relatório.
Usando o exemplo do [Pablo César] vc pode montar o seguinte:
Usando o exemplo do [Pablo César] vc pode montar o seguinte:
Código: Selecionar todos
index on right(dtos(data_de_nascimento), 4) to arquivo_ntx // organiza por mes e dentro do mes, por dia.
xmes := 0
@ 05,05 say 'Mes:' get xmes picture '99' valid xmes >= 1 .and. xmes <= 12
read
if inkey() = 27
return
end
ymes := strzero(xmes, 2)
dbseek(ymes)
while !eof() .and. month(data_de_nascimento) = xmes
? nome, data_de_nascimento
dbskip()
end
return"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
Re: como consultar atraves da data
Boa noite segue abaixo o codigo para ver a onde eu estou errando desde ja agradeco a colaboracao
Código: Selecionar todos
#INCLUDE "BOX.CH"
CLEAR
SET DATE BRITISH
SET CENTURY ON
SELECT 1
USE CLIENTE
IF !FILE("NASC.NTX")
INDEX ON DANIVER TO NASC
ENDIF
SET INDEX TO NASC
DO WHILE .T.
dAniver:=CTOD(" ")
SET COLOR TO
@00,00,23,79 BOX B_DOUBLE +" "
@02,01 TO 02,78 DOUBLE
@21,01 TO 21,78 DOUBLE
@02,00 SAY CHR(204)
@02,79 SAY CHR(185)
@21,00 SAY CHR(204)
@21,79 SAY CHR(185)
@20,28 SAY "< Tecle ESC para sair ! >"
@22,01 SAY "Digite a data Nascimento....:" GET dAniver PICTURE "@D"
READ
IF LASTKEY()=27
EXIT
ENDIF
GO TOP
SEEK dAniver
IF FOUND()
@03,01 SAY "Codigo............:"+CODIGO
@04,01 SAY "Nome..............:"+NOME
@05,01 SAY "Endereco..........:"+ENDERECO
@06,01 SAY "Bairro............:"+BAIRRO
@07,01 SAY "Cidade............:"+CIDADE
@08,01 SAY "Telefone..........:"+TELEFONE
@09,01 SAY "Celular...........:"+CELULAR
@10,01 SAY "Telefone Comercial:"+TELCOM
@11,01 SAY "Nome Mae..........:"+MAE
@12,01 SAY "Data Cadastro.....:+DTOC(CADASTRO)
@12,01 SAY "Cep...............:"+CEP
ELSE
TONE(300,2)
ALERT("Data Nao Cadastratada !")
ENDIF
IF LASTKEY()=27
EXIT
ENDIF
ENDDO
CLOSE DATABASE
CLEAR
Editado pela última vez por Maligno em 07 Dez 2010 22:13, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: como consultar atraves da data
Antonio, vamos observar o seguinte:
Obs.: delete o arquivo NASC.NTX para que a nova chave seja aceita.
Agora se você quer buscar todos os clientes que fazem aniversário dentro de um mês, independente do dia e do ano em que nasceram, você terá que seguir a sugestão do GVC.
Abraços,
Bom, como o Pablo sugeriu, você tem que usar a função DTOS() para índices com chaves tipo data. Então altere a linha 9 do seu código para: INDEX ON DTOS(DANIVER) TO NASCPablo César escreveu:INDEX ON DTOS(data_de_nascimento) TO arquivo_ntx // o nome dado "data_de_nascimento" deve ser substituido pelo nome do campo que você deu.
Obs.: delete o arquivo NASC.NTX para que a nova chave seja aceita.
Então altere a linha 29 do seu código para: SEEK DTOS(dAniver)Pablo César escreveu:2. Após o READ, procure pelo comando SEEK, mas antes transforme a data no padrão "AAAAMMDD" (ano em quatro dígitos, mês e dia), assim:
SEEK DTOS(var_data)
Esta observação do "GVC" é muito importante, pois da forma como você está fazendo a busca (dia/mes/ano), você tem que informar a data correta de aniversário para fazer a busca. Vamos imaginar que eu estivesse neste seu cadastro, a minha data de aniversário é 29/05/1962. Então da forma como você está fazendo, no campo "Digite a data Nascimento....:" (linha 23 do seu código) você terá que digitar 29/05/1962 para que a busca encontre o meu registro.gvc escreveu:Acho que estamos esquecendo que indexar pelo campo data não ajuda muito pois o ano é usado para montar a chave e irá atrapalhar na hora de montar o relatório.
Agora se você quer buscar todos os clientes que fazem aniversário dentro de um mês, independente do dia e do ano em que nasceram, você terá que seguir a sugestão do GVC.
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
Re: como consultar atraves da data
Desculpe a eu acho que estou sendo um pouco chato, fiz a mudança no campo 9 e no campo 29, porem ele da um erro base/1119 argument error:ctod na linha 40 e estou enviando o banco de dados cliente.dbf, esta consulta e para so data de nascimento, vai ter outras consultas pelo codigo, nome e pelo cep que esta no banco de dados. sem obrigado e desculpe qq coisa o banco de dados é
CLIENTE.DBF
CODIGO C 5
NOME C 50
ENDERECO C 40
BAIRRO C 25
CIDADE C 30
TELEFONE C 11
CELULAR C 11
TELCON C 11
ANIVER D 8
MAE C 50
CADASTRO D 8 // REFENTE A DATA QUE FOI CADASTRADO
CEP C 9
CLIENTE.DBF
CODIGO C 5
NOME C 50
ENDERECO C 40
BAIRRO C 25
CIDADE C 30
TELEFONE C 11
CELULAR C 11
TELCON C 11
ANIVER D 8
MAE C 50
CADASTRO D 8 // REFENTE A DATA QUE FOI CADASTRADO
CEP C 9
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: como consultar atraves da data
Antonio, se você observar esta linha onde está ocorrendo o erro, vai notar que está faltando fechar as aspas antes da função DTOC().Antonio Matheus escreveu:porem ele da um erro base/1119 argument error:ctod na linha 40
Altere a linha 40 para:
@12,01 SAY "Data Cadastro.....: "+DTOC(CADASTRO)
Verifique também se no seu código você está usando mesmo o comando DTOC(). Se estiver usando CTOD(), vai ocorrer este erro mesmo, pois o campo CADASTRO é tipo data e não caracter.
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
Re: como consultar atraves da data
Boe a tarde toledo eu fiz o que voces falou no psot anterior, troquei a linha 40 mas continua dando o mesmo erro, porem eu estava, sera que o problema nao esta no banco de dados cliente desde ja agradeco
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: como consultar atraves da data
Antonio Matheus escreveu:erro base/1119 argument error:ctod na linha 40
Amigo, observe que o erro que está ocorrendo é referente a função CTOD() (caracter para data), então eu pedi para você verificar se no seu código fonte você estava usando a função DTOC() (data para caracter). Você verificou isto?Toledo escreveu:Verifique também se no seu código você está usando mesmo o comando DTOC()
Caso o problema não seja este (a troca de CTOD por DTOC), poste novamente o seu código aqui... copie direto do seu fonte e cole aqui.
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
Re: como consultar atraves da data
Boa tarde toledo e todos, nao consegui fazer a consulta atraves da data estava dando muito conflito com a data de aniversario com data do cadastro, porem consegui fazer uma consulta atraves do codigo e agradeco a cooperacao de voces obrigado
Re: como consultar atraves da data
Data de nascimento é um campo cujo valor pode se repetir no cadastro, pois pode haver mais de uma pessoa com a mesma data de nascimento. Nao seria muito complicado fazer uma pesquisa exata usando esta chave ?
-
Antonio Matheus
- Usuário Nível 1

- Mensagens: 28
- Registrado em: 13 Jul 2010 23:18
- Localização: sao caetano dosul
Re: como consultar atraves da data
Boa tarde Eros realmente estava dando muito problema, porem eu desisti de fazer esta consulta por e fiz por nome,codigo, e eu vou fazer por cep mas obrigado pela dica
-
raquelreis
- Usuário Nível 2

- Mensagens: 87
- Registrado em: 18 Jul 2011 15:29
- Localização: à procura
como consultar atraves da data
Boa Tarde à todos mais uma vez,
Estou com mais um problema em clipper e dessa vez é criar uma consulta pela data, e encontrei esse tópido e já testei de várias maneiras, mas ainda nao consegui.
É o seguinte preciso fazer uma busca no meu banco pela data. Encontro a data e verifico se um campo nesse registro está vazio, se sim mensagem : "está vazio", se não mensagem: "está preenchido". Simples, mas não consigo encontrar a data.
Segue código:
Tentei indexar o campo como no exemplo:
Tenho nesse arquivo o Indice cadcart2.ntx com a chave STR(CARTAO,3)+SUBSTR(DATA,7,4)+SUBSTR(DATA,4,2)+SUBSTR(DATA,1,2), posso usá-lo?
Desde Já agradeço.
Estou com mais um problema em clipper e dessa vez é criar uma consulta pela data, e encontrei esse tópido e já testei de várias maneiras, mas ainda nao consegui.
É o seguinte preciso fazer uma busca no meu banco pela data. Encontro a data e verifico se um campo nesse registro está vazio, se sim mensagem : "está vazio", se não mensagem: "está preenchido". Simples, mas não consigo encontrar a data.
Segue código:
Código: Selecionar todos
pDATA := CTOD("")
@ 15,17 SAY "Data.....:" GET pDATA VALID VDATA52(pDATA)
SELE CADCART
INDEX ON DATA TO CADCART5
SET INDEX TO CADCART5
SEEK DTOS(pDATA)
IF FOUND()
DO WHILE CTOD(CADCART->DATA) = pDATA .AND. !EOF()
IF EMPTY(CADCART->RESUMO)
Mensagem("*** Falta lancar os resumos de cartao deste caixa ***",2,"S")
ENDIF
ENDDO
ENDIF
, Mas sempre dá erro de argumento do DTOS.Pablo César escreveu:INDEX ON DTOS(data_de_nascimento) TO arquivo_ntx
Tenho nesse arquivo o Indice cadcart2.ntx com a chave STR(CARTAO,3)+SUBSTR(DATA,7,4)+SUBSTR(DATA,4,2)+SUBSTR(DATA,1,2), posso usá-lo?
Desde Já agradeço.
Keel
[]'s
_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
[]'s
_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
como consultar atraves da data
Olá!
O problema é que este campo da tabela, apesar de conter um valor data, está como caracter, quando deveria ser do tipo Date.
Para contornar, você pode usar: e pesquisar com DBSeek( ' ' + DtoS( pData ), .T. ). (Esse .T. faz um SOFT SEEK )
A função DtoS() recebe uma data como argumento e você está passando uma string.raquelreis escreveu:Mas sempre dá erro de argumento do DTOS.
O problema é que este campo da tabela, apesar de conter um valor data, está como caracter, quando deveria ser do tipo Date.
Para contornar, você pode usar:
Código: Selecionar todos
INDEX ON STR(CARTAO,3)+Dtos( CtoD( DATA ) )[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
