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:

Código: Selecionar todos

INDEX ON STR(CARTAO,3)+Dtos( CtoD( DATA ) )
e pesquisar com DBSeek( ' ' + DtoS( pData ), .T. ). (Esse .T. faz um SOFT SEEK )