Página 1 de 2
como consultar atraves da data
Enviado: 03 Dez 2010 23:45
por Antonio Matheus
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
Re: como consultar atraves da data
Enviado: 04 Dez 2010 00:08
por anacatacombs
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
como consultar atraves da data
Enviado: 06 Dez 2010 09:39
por Pablo César
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:
Código: Selecionar todos
SEEK DTOS(var_data)
IF FOUND()
DO WHILE data_de_nascimento=var_data
? nome+" "+data_de_nascimento
SKIP
ENDDO
ENDIF
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
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
ENDIF
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.
Re: como consultar atraves da data
Enviado: 06 Dez 2010 09:54
por gvc
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:
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
Re: como consultar atraves da data
Enviado: 07 Dez 2010 22:05
por Antonio Matheus
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
Re: como consultar atraves da data
Enviado: 08 Dez 2010 08:18
por Toledo
Antonio, vamos observar o seguinte:
Pablo 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.
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 NASC
Obs.: delete o arquivo NASC.NTX para que a nova chave seja aceita.
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)
Então altere a linha 29 do seu código para: SEEK DTOS(dAniver)
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.
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.
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,
Re: como consultar atraves da data
Enviado: 08 Dez 2010 21:08
por Antonio Matheus
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
Re: como consultar atraves da data
Enviado: 08 Dez 2010 21:31
por Toledo
Antonio Matheus escreveu:porem ele da um erro base/1119 argument error:ctod na linha 40
Antonio, se você observar esta linha onde está ocorrendo o erro, vai notar que está faltando fechar as aspas antes da função DTOC().
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,
Re: como consultar atraves da data
Enviado: 09 Dez 2010 14:11
por Antonio Matheus
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
Re: como consultar atraves da data
Enviado: 09 Dez 2010 20:36
por Toledo
Antonio Matheus escreveu:erro base/1119 argument error:ctod na linha 40
Toledo escreveu:Verifique também se no seu código você está usando mesmo o comando DTOC()
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?
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,
Re: como consultar atraves da data
Enviado: 13 Fev 2011 16:03
por Antonio Matheus
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
Enviado: 22 Fev 2011 23:14
por Eros
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 ?
Re: como consultar atraves da data
Enviado: 23 Fev 2011 14:54
por Antonio Matheus
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
como consultar atraves da data
Enviado: 13 Out 2011 15:18
por raquelreis
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:
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
Tentei indexar o campo como no exemplo:
Pablo César escreveu:INDEX ON DTOS(data_de_nascimento) TO arquivo_ntx
, Mas sempre dá erro de argumento do DTOS.
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.
como consultar atraves da data
Enviado: 13 Out 2011 16:02
por alxsts
Olá!
raquelreis escreveu:Mas sempre dá erro de argumento do DTOS.
A função DtoS() recebe uma data como argumento e você está passando uma
string.
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 )