como consultar atraves da data

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Antonio Matheus
Usuário Nível 1
Usuário Nível 1
Mensagens: 28
Registrado em: 13 Jul 2010 23:18
Localização: sao caetano dosul

como consultar atraves da data

Mensagem 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
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: como consultar atraves da data

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

como consultar atraves da data

Mensagem 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.
Um 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.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: como consultar atraves da data

Mensagem 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
"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}
Antonio Matheus
Usuário Nível 1
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

Mensagem 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
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
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: como consultar atraves da data

Mensagem 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,
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
Antonio Matheus
Usuário Nível 1
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

Mensagem 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
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: como consultar atraves da data

Mensagem 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,
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
Antonio Matheus
Usuário Nível 1
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

Mensagem 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
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: como consultar atraves da data

Mensagem 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,
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
Antonio Matheus
Usuário Nível 1
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

Mensagem 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
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Re: como consultar atraves da data

Mensagem 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 ?
Antonio Matheus
Usuário Nível 1
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

Mensagem 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
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

como consultar atraves da data

Mensagem 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.
Keel
[]'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
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

como consultar atraves da data

Mensagem 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 )
[]´s
Alexandre Santos (AlxSts)
Responder