Página 2 de 2

como consultar atraves da data

Enviado: 13 Out 2011 16:50
por raquelreis
Boa Tarde,
alxsts, segui sua dica. Porém ele não encontra data nenhuma.
No meu banco tenho data de 01/01/2004 a 12/10/2011.
codigo:

Código: Selecionar todos

CLS
SET DATE BRITISH
SET CENTURY ON

SELE 1
USE CADCART ALIAS CADCART
INDEX ON DTOS(CTOD(DATA)) TO CADCART1

DO WHILE .T.
  @ 03,01 TO 20,51 
  pDATA := CTOD(SPACE(10))
  @ 05,05 SAY "Data.....:" GET pDATA
  READ
  
 IF LASTKEY()=27
   CLOSE ALL
   CLS
   RETURN 
 ENDIF
  
  SELE CADCART
  DBSEEK(DTOS(pDATA),.T.)
  IF FOUND()
       @ 07,05 SAY "ENCONTROU"
  ELSE
       @ 07,05 SAY "NAO ENCONTROU" 
  ENDIF

ENDDO

CLOSE ALL
CLS
RETURN

como consultar atraves da data

Enviado: 13 Out 2011 18:04
por anacatacombs
Boa tarde Raquel.
Desculpe me intrometer..
Mas.. você tem uma variavel do tipo Caracter, que grava data, e na hora de criar o indice transformou o caracter em data, e usou o DTOS - que transforma em YYYYMMDD, é isso?
Pq vc está fazendo duas conversões no indice? Ficou meio confuso.
Não seria melhor fazer assim?
exemplo 1:

Código: Selecionar todos

SET DATE BRITISH
SET CENTURY ON
SELE 1
USE CARDCART ALIAS CADCART
INDEX ON Data TO CADCART 1
(...)
pData := SPACE(08) // aqui vai depender de como tá no seu banco de dados.. se tiver com SPACE de 10, precisa ser space de 10 mas o padrão que eu procuro criar é sempre 8
@ 05,05 SAY "Data" GET pData
READ
SELECT CadCart
SET ORDER TO 1
SEEK pData SOFTSEEK
exemplo 2:

Código: Selecionar todos

SET DATE BRITISH
SET CENTURY ON
SELE 1
USE CARDCART ALIAS CADCART
INDEX ON dtos(ctod(Data)) TO CADCART 1
(...)
pData := CTOD("")
@ 05,05 SAY "Data" GET pData
READ
SELECT CadCart
SET ORDER TO 1
SEEK DTOS(pData) SOFTSEEK
Não testei nenhum dos dois códigos, mas imagino que deve funcionar.. o importante é buscar da mesma forma que o índice foi criado,sempre lembrando de comparar o tamanho da variavel de busca(pData) com a variavel do banco de dados (data) .

At.

Ana

como consultar atraves da data

Enviado: 13 Out 2011 19:25
por alxsts
Olá meninas!
anacatacombs escreveu:na hora de criar o indice transformou o caracter em data, e usou o DTOS - que transforma em YYYYMMDD
Ana:
se o índice for criado sobre o campo no formato texto, como no teu primeiro exemplo, as datas não ficarão ordenadas pois o campo será classificado numericamente. Veja exemplo:

Código: Selecionar todos

Antes do Sort   Após o Sort
10/06/1974      09/06/1957
09/06/1957      10/06/1974
31/10/1920      20/12/2011
20/12/2011      31/10/1920
Como em nosso formato de data as grandezas estão em ordem inversa de importância (dia, mes e ano), é preciso ajustar a ordem para ano, mes e dia (DtoS()). Afinal, os anos contem meses que, por sua vez contem dias e não o contrário.

O que pode ser feito, é manter o original da Raquel:

Código: Selecionar todos

SUBSTR(DATA,7,4)+SUBSTR(DATA,4,2)+SUBSTR(DATA,1,2)
Raquel:
não vi erro no código. Não sei porque não funcionou. Faça mais uma revisão, olhe se o índice está certo pelo DBU... Continue postando.

como consultar atraves da data

Enviado: 13 Out 2011 21:52
por anacatacombs
pra variar sentei na janelinha do bonde e ainda quero dar tchauzinho.
Na pressa nem li direito, só achei estranho mesmo, mas tens razão meu caro.

Mas, se ela criasse os dois campos do tipo DATA não teria esse problema de procurar. O problema é que o índice está de um jeito, e ela está procurando de outro, caso contrario o seek retornaria .T.

Manda um ALERT aí pra ver como está o parametro do DBSEEK e um na variavel do banco exatamente como está na criação do indice.

como consultar atraves da data

Enviado: 14 Out 2011 09:56
por raquelreis
Bom dia à todos,

Pessoal agradeço demais a ajuda de vcs.

Segui as dicas de cada um de vocês. alxsts, criei outro indice pelo DBU usando o SUBSTR(DATA,7,4)+SUBSTR(DATA,4,2)+SUBSTR(DATA,1,2) como chave.
Depois usei o LOCATE para procurar, e funcionou. Mas como vc ja sabe, fica bem mais lento que o Seek (DBSEEK).

Código: Selecionar todos

SELE CADCART
SET ORDER TO 6
LOCATE FOR CTOD(DATA) = pDATA
   IF FOUND()
       
             pRESUMOV := CADCART->RESUMO
             pNUMCARTV := CADCART->CARTAO
             IF EMPTY(pRESUMOV)  
                 Mensagem("*** Falta lancar os resumos do cartao: "+STR(pNUMCARTV,3)+" deste caixa ***",2,"S")
                 if Pergunta("Continua assim mesmo ?")
                 else
                     skip
                 endif
                 skip     
             ENDIF
             skip
   ENDIF

O problema agora é a lentidão.
Quando uso o seek dá área não indexada. Indexei o sistema inteiro, recriei o indice, etc.
anacatacombs, antes de postar minha dúvida no fórum já tinha tentando de várias formas, inclusive as suas sujestões e por algum motivo desconhecido dava erro.

Abraço!

como consultar atraves da data

Enviado: 14 Out 2011 15:09
por alxsts
Olá Raquel!

Mande este DBF zipado para o meu endereço de email (alxsts@hotmail.com). Amanhã vou fazer alguns testes. Informe todas as chaves de índice que você utiliza.

como consultar atraves da data

Enviado: 17 Out 2011 10:54
por raquelreis
Pessoal desculpe a demora, mas acredito que resolvi o problema (com a ajuda de todos)
ficou assim:

Código: Selecionar todos

CLS
SET DATE BRITISH
SET CENTURY ON

SELE 1
USE CADCART ALIAS CADCART


DO WHILE .T.
  @ 03,01 TO 20,51 
  pDATA := CTOD("")
  @ 05,05 SAY "Data.....:" GET pDATA
  READ
  
 IF LASTKEY()=27
   CLOSE ALL
   CLS
   RETURN 
 ENDIF
 
 SELE CADCART
 SET INDEX TO CADCART6  //mudei de Set Order to 6
 SEEK SUBSTR(dtoc(pDATA),7,4)+SUBSTR(dtoc(pDATA),4,2)+SUBSTR(dtoc(pDATA),1,2) && Erro com área nao indexada
 IF FOUND()
    pRESUMO := CADCART->RESUMO
    pNUMCART:= CADCART->CARTAO
    IF EMPTY(pRESUMO)
       @ 07,05 SAY "resumo vazio"+STR(pNUMCART,3)
    ENDIF
 ENDIF
ENDDO

CLOSE ALL
CLS
RETURN
Agradeço à todos!

como consultar atraves da data

Enviado: 17 Out 2011 11:39
por alxsts
Olá!

Raquel: testei o código do teu primeiro post com o DBF que você enviou e a busca funciona perfeitamente. Isso acontece porque você cria o índice na hora.

O problemas que você teve foram causados porque você não abria os índices. Neste último post, você está fazendo isso, apesar de estar no local errado (etá dentro do loop DO WHILE...ENDDO).

Como boa prática, sempre que abrir uma tabela, já abra os respectivos índices e depois mude a ordem para a que você necessita para ler os dados.

Código: Selecionar todos

// Habitue-se a fazer #include "Inkey.ch". Esta linha ficaria IF LASTKEY() == K_ESC, mais fácil de entender
#include "Inkey.ch"

// Crie o hábito de sempre declarar sua variáveis. Prefira as dos tipos LOCAL e STATIC
LOCAL pData, pResumo, pNumCart, GetList := {}

CLS
SET DATE BRITISH
SET CENTURY ON

// acostume-se a definir o modo de abertura (SHARED ou EXCLUSIVE). 
// Use a cláusula NEW que sempre abre o arquivo na próxima área livre disponível
SELE 1//
USE CADCART SHARED NEW ALIAS CADCART 

// após abrir o DBF, sempre abra os índices logo em seguida.
CADCART->( DbSetIndex, "cadcart1" )
CADCART->( DbSetIndex, "cadcart2" )
CADCART->( DbSetIndex, "cadcart3" )
CADCART->( DbSetIndex, "cadcart4" )
CADCART->( DbSetIndex, "cadcart5" )
CADCART->( DbSetIndex, "cadcart6" )

// Você pode abrir os índices de todos de uma vez:
// SET INDEX TO cadcart1, cadcart2, cadcart3,cadcart4,cadcart5,cadcart6

// ou pode abrir o DBF e os índices de uma só vez:
// USE CADCART SHARED NEW ALIAS CADCART INDEX  cadcart1, cadcart2, cadcart3,cadcart4,cadcart5,cadcart6

CADCART->( DbSetOrder( 6 ) )

@ 03,01 TO 20,51 

pDATA := CTOD("")
@ 05,05 SAY "Data.....:" GET pDATA
READ

DO WHILE LastKey() != K_ESC
 
// SELE CADCART   ===> desnecessário pois só tem este arquivo aberto...
// SET INDEX TO CADCART6  //mudei de Set Order to 6 ==> os índices já estão abertos

// SEEK SUBSTR(dtoc(pDATA),7,4)+SUBSTR(dtoc(pDATA),4,2)+SUBSTR(dtoc(pDATA),1,2) && Erro com área nao indexada
//IF FOUND()

IF CADCART->( DbSeek( SUBSTR(dtoc(pDATA),7,4)+SUBSTR(dtoc(pDATA),4,2)+SUBSTR(dtoc(pDATA),1,2) ) )
    pRESUMO := CADCART->RESUMO
    pNUMCART:= CADCART->CARTAO
    IF EMPTY(pRESUMO)
       @ 07,05 SAY "resumo vazio"+STR(pNUMCART,3)
    ENDIF
 ENDIF

   @ 05,05 SAY "Data.....:" GET pDATA
   READ

ENDDO

CLOSE ALL
CLS
RETURN

como consultar atraves da data

Enviado: 17 Out 2011 12:55
por raquelreis
Excelentes dica Alxsts,

Sim, não usei o Inkey.ch, pq esse código é apenas uma parte de um código maior, e nesse já tem o Inkey.
Mas muito obrigada por tudo, não sou programadora em clipper. Mas aos poucos estou aprendendo.

At+