Criando Indíces

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Boa Tarde,

Pessoal estou com uma dúvida.
Estou criando um indice na minha aplicação e acontece que quando uso

Código: Selecionar todos

USE ARQUIVODBF
INDEX ON DATA TO ARQUIVO1NTX
Ele cria o indice, porém com um tamanho de 1,254kb.
Se eu fizer o mesmo no dbu ele cria com tamanho 2,412kb.
Porque tanta diferença?
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
gilsonpaulo
Usuário Nível 3
Usuário Nível 3
Mensagens: 135
Registrado em: 02 Fev 2008 11:30
Localização: Quatro Barras

Criando Indíces

Mensagem por gilsonpaulo »

Ola.


Faça assim com ntx

Código: Selecionar todos

use arquivodbf
index on dtos(data) to inddata
Faça assim se for usar cdx

Código: Selecionar todos

use arquivodbf
index on dtos(data) tag data to arquivodbf
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á

Criando Indíces

Mensagem por Pablo César »

Oi Raquel, como o colega disse está correto indexar com a função DTOS() essa é a forma correta de indexar datas, pois deixa no seguinte formato: AAAAMMDD e para o seek você também terá que transformar: SEEK DTOS(dData). Quanto ao tamanho não sei ao certo o porque de tanta diferença. Seria porque está indexando com 4 digitos o ano ?. Teria que analisar o arquivo de indices. Mas mude para DTOS.
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.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Ok, obrigada pela ajuda. Em relação a usar Dtos() para datas eu sei. Porém a data no banco está como character. Então fiz apenas um teste (exemplo). Mas crio o indice com DTOS(CTOD(data)).
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
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á

Criando Indíces

Mensagem por Pablo César »

Ahhh DATA é do tipo caracter ? Talvez seja melhor mudá-la para tipo date mesmo. Por dessa forma deixaria de converter duas vezes.
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.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Bom dia,

Eu não acredito que venho ao fórum com mais um problema de indice...Depois de estudar tanto e resolver problemas mais complexos, estou com uma dúvida pode-se dizer simples...

É o seguinte, fiz um programinha teste, para trabalhar com indices.
Mas não tá funcionando de jeito nenhum, não sei onde estou errando.
Pq em outros com a mesma estrutura funciona.

Código: Selecionar todos

cls
@ 1,2 sAY "Criando IndiceS..."

USE CADNF NEW EXCLUSIVE
INDEX ON NF TO CADNF3
SET INDEX TO CADNF3

CLS
@ 1,2 sAY "IndiceS CriadoS!"

pFORN  := 0
pLABOL := 0
pNF       := SPACE(6)

DO WHILE .T.
  IF LASTKEY()=27
    CLS;EXIT
  ENDIF

@ 4,4 SAY "NF:                 " GET pNF 
@ 5,4 SAY "LABOL:           " GET pLABOL
@ 6,4 SAY "FORNECEDOR: " GET pFORN
READ 
     SELE CADNF
     GO TOP     
     DBSEEK(pNF,.T.)
     IF !FOUND()
         ALERT("Não Encontrou!")
     ELSE
       DO WHILE pNF = NF .AND.  !EOF() 
           ALERT("Encontrou : " +STR(LABOL,5))
        ENDDO 
     ENDIF
ENDDO
1º Erro, ele só encontra 1 registro, mas tenho 2. Quero q exiba os dois. O programa trava... while infinito? Não entendi. Uso sem a condição ( pNF = NF ) tbm.
2º Erro, se criar o índice assim:

Código: Selecionar todos

INDEX ON NF+STR(FORNECEDOR,5) TO CADNF3 
e buscar assim:

Código: Selecionar todos

DBSEEK(pNF+STR(FORNECEDOR,5),.T.)
ele diz que não possui nf. Se adicionar o fabricante tbm não encontra.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
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á

Criando Indíces

Mensagem por Pablo César »

Raquel faltou disponibilizar a estrutura do bd em questão. Pode utilizar este aplicativo que ajudará a poder listar e colar a estrutura para a próxima.
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
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á

Criando Indíces

Mensagem por Pablo César »

Como faltou listar a estrutura do seu bd, vou supor a seguinte estrutura então:

Código: Selecionar todos

+---------- CADNF.DBF ----------+
| Nr  Nome          Tipo Tam Dec|
+-------------------------------+
| 1  "NF"          ,"N",006,000 |
| 2  "FORNECEDOR"  ,"N",005,000 |
| 3  "LABOL"       ,"N",005,000 |
+------- Nr Registros 4 --------+
Então como vê considerei o NF como numérico e indexei com STRZERO porque na minha opinião é mais seguro que utilizar o STR.

Código: Selecionar todos

cls
@ 1,2 sAY "Criando IndiceS..."

USE CADNF NEW EXCLUSIVE
INDEX ON STRZERO(NF,6,0) TO CADNF3
SET INDEX TO CADNF3

CLS
@ 1,2 sAY "IndiceS CriadoS!"

pFORN  := 0
pLABOL := 0
// pNF    := SPACE(6)
pNF    := 0

DO WHILE .T.

   @ 4,4 SAY "NF:        " GET pNF
   @ 5,4 SAY "LABOL:     " GET pLABOL
   @ 6,4 SAY "FORNECEDOR:" GET pFORN
   READ
   IF LASTKEY()=27
      CLS;EXIT
   ENDIF
   SELE CADNF
   // GO TOP
   DBSEEK(STRZERO(pNF,6,0),.T.)
   IF !FOUND()
      ALERT("Nao Encontrou!")
   ELSE
      cMostra:=""
      nQuantos:=0
      DO WHILE pNF = NF
         // .AND.  !EOF()
         cMostra:=cMostra+str(LABOL,5,0)+";"
         nQuantos++
         skip
      ENDDO
      ALERT("Encontrou : " +STR(nQuantos)+";"+cMostra)
   ENDIF
ENDDO
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.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Desculpa,

No banco tenho:
----------
-CADNF-
----------
NF - caracter
FORNECEDOR - numeric
LABOL - numeric (fabricante)
VALOR - numeric
etc... que não irei utilizar
Tenho 2 notas assim:
nf for fabr
000543 25 17
000543 25 125

quero que exiba as duas.
Da forma que está acima (post anterior), só me exibe o fabricante 17.

Obs.: Adicionei o comando "skip" e funcionou.
Agora o problema está quando quero criar um indice composto. Ex:
NF+FABRICANTE ou NF+FORNECEDOR...
Ele não acha...
Editado pela última vez por raquelreis em 02 Jan 2012 13:00, em um total de 1 vez.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
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á

Criando Indíces

Mensagem por Pablo César »

Imaginei que o NF fosse caracter. Mas deixa te perguntar, pelo visto o NF é só números ou pode conter algum caracter alfa ? Pois eu mudei a vriável PNF de caracter para numérica, isso facilita para o usuário e é mais seguro (menos perda de tempo ao errar na digitação). E mantive o seu índice. O que tem que verificar, se o NF é armazenado SEMPRE números prenchidos de zeros. Daí o STRZERO irá funcionar que uma beleza ! Veja como ficou:

Código: Selecionar todos

cls
@ 1,2 sAY "Criando IndiceS..."

USE CADNF NEW EXCLUSIVE
INDEX ON NF TO CADNF3
SET INDEX TO CADNF3

CLS
@ 1,2 sAY "IndiceS CriadoS!"

pFORN  := 0
pLABOL := 0
// pNF    := SPACE(6)
pNF    := 0

DO WHILE .T.

   @ 4,4 SAY "NF:        " GET pNF
   @ 5,4 SAY "LABOL:     " GET pLABOL
   @ 6,4 SAY "FORNECEDOR:" GET pFORN
   READ
   IF LASTKEY()=27
      CLS;EXIT
   ENDIF
   SELE CADNF
   // GO TOP
   DBSEEK(STRZERO(pNF,6,0),.T.)
   IF !FOUND()
      ALERT("Nao Encontrou!")
   ELSE
      cMostra:=""
      nQuantos:=0
      DO WHILE STRZERO(pNF,6,0) = NF
         // .AND.  !EOF()
         cMostra:=cMostra+str(LABOL,5,0)+";"
         nQuantos++
         skip
      ENDDO
      ALERT("Encontrou : " +STR(nQuantos)+";"+cMostra)
   ENDIF
ENDDO
A exibição dos registros, deixei por conta do ALERT, mas se quiser listar ou até mesmo colocá-lo numa matriz para depois exibi-los num TBROWSE de vetores, iria ficar jóia. Veja se resolve pra você. Tiver dúvidas pode perguntar.
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
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á

Criando Indíces

Mensagem por Pablo César »

Agora o problema está quando quero criar um indice composto. Ex:
NF+FABRICANTE ou NF+FORNECEDOR...
Ele não acha...
Mas você iria procurar pelo número da NF ou pelo fornecedor ou fabricante ? O que eu quero dizer é se você vai procurar a NF tal do fornecedor tal ? Ou vai simplesmente procurar todas as NF de tal fornecedor ?
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
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á

Criando Indíces

Mensagem por Pablo César »

Bom, suponhamos que você quer achar as NF de tal fornecedor e tal fabricante. Veja como ficou implementandouma função de procura no VALID de cada GET:

Código: Selecionar todos

cls
@ 1,2 sAY "Criando IndiceS..."

USE CADNF NEW EXCLUSIVE
INDEX ON NF TO CADNF3
INDEX ON NF+Strzero(labol,5,0) TO CADNF4
INDEX ON NF+Strzero(fornecedor,5,0) TO CADNF5
SET INDEX TO CADNF3,CADNF4,CADNF5

CLS
@ 1,2 sAY "IndiceS CriadoS!"

pFORN  := 0
pLABOL := 0
// pNF    := SPACE(6)
pNF    := 0

DO WHILE .T.
   @ 4,4 SAY "NF:        " GET pNF Valid Procura(1,Strzero(pNF,6,0))
   @ 5,4 SAY "LABOL:     " GET pLABOL Valid Procura(2,Strzero(pNF,6,0),Strzero(pLABOL,5,0))
   @ 6,4 SAY "FORNECEDOR:" GET pFORN Valid Procura(3,Strzero(pNF,6,0),Strzero(pFORN,5,0))
   READ
   IF LASTKEY()=27
      CLS;EXIT
   ENDIF
ENDDO

Function Procura(nCamp,cNF,cOque)
SELE CADNF
Set Order to nCamp
Do Case
   Case nCamp=1
        DBSEEK(cNF,.T.)
   Case nCamp=2
        DBSEEK(cNF+cOque,.T.)
   Case nCamp=3
        DBSEEK(cNF+cOque,.T.)
EndCase
IF !FOUND()
   ALERT("Nao Encontrou!")
   lRet:=.F.
ELSE
   cMostra:=""
   nQuantos:=0
   DO WHILE STRZERO(pNF,6,0) = NF
      // .AND.  !EOF()
      Do Case
         Case nCamp=1
              cMostra:=cMostra+str(LABOL,5,0)+";"
              nQuantos++
         Case nCamp=2
              If LABOL=Val(cOque)
                 cMostra:=cMostra+str(LABOL,5,0)+";"
                 nQuantos++
              Endif
         Case nCamp=3
              If FORNECEDOR=Val(cOque)
                 cMostra:=cMostra+str(FORNECEDOR,5,0)+";"
                 nQuantos++
              Endif
      EndCase
      skip
   ENDDO
   If nQuantos>0
      lRet:=.T.
      ALERT("Encontrou : " +STR(nQuantos)+";"+cMostra)
   Else
      lRet:=.F.
   Endif
ENDIF
Return lRet
O código não é que tenha que ser assim, eu apenas ilustrei um exemplo de cada. Só faltou você responder se a procura é por NF ou por todas as NF de tal forncedor ou tal fabricante.
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.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Boa Tarde,
desculpe a demora...
É o seguinte, tenho um relatório que mostra os valores das notas fiscais no período por fornecedor.
Ex: o usuário digita o fornecedor, e faço uma busca por todas as notas no período( datas ) e pelo fornecedor solicitado.
Porém ocorreu um probleminha. Tenho uma nota com a mesma numeração, o que permitido, pois posso ter diversos fabricantes. No meu relatório ele soma as notas fiscais como se fossem uma única. Mas são de fabricantes diferentes. Ex:
No banco tenho (01/11/2011 a 30/11/2011):
nf.....fornecedor...fabricante...valor
543... ...25............17.........120,00 (certo)
543......25...........125..........300,00 (certo)
no relatório está sendo feito assim (01/11/2011 a 30/11/2011):
nf.....fornecedor...fabricante...valor
543......25...........17..........420,00 (errado)

Pensei em fazer um índice que procuresse NF+FABRICANTE, assim não iria somar. Mas se tiver outra solução, agradeço.
Pablo César escreveu:Só faltou você responder se a procura é por NF ou por todas as NF de tal forncedor ou tal fabricante.
Todas as NF de um determinado FORNECEDOR dentro de um PERÍODO.
Pablo César escreveu:Imaginei que o NF fosse caracter. Mas deixa te perguntar, pelo visto o NF é só números oupode conter algum caracter alfa ?
NF no banco é caracter. Mas sempre utilizo numeros.

Tenho outros exemplos em que uso NF+FORNCEDOR e funciona, mas nesse relatório está complicado. Por isso, fiz um programinha teste, apenas para escrever a lógica e como fazer o índice e depois implementar o código...
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Criando Indíces

Mensagem por anacatacombs »

Tentou fazer um indice de NF+FORNECEDOR+FABRICANTE?
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

anacatacombs escreveu:Tentou fazer um indice de NF+FORNECEDOR+FABRICANTE?
Sim, NF+FORNECEDOR+FABRICANTE e NF+FABRICANTE+FORNECEDOR
Mas, não retorna valores.
Se eu criar os índices separados, FORNECEDOR, retorna...
FABRICANTE, retorna... NF, retorna...
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Responder