Clipper On Line • Ver Tópico - Apagar um indice TEMPORARY

Apagar um indice TEMPORARY

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Apagar um indice TEMPORARY

Mensagempor rubens » 25 Jul 2016 15:26

Olá...

Tô estudando o uso de arquivos e índices na memória... Tô preso no seguinte:

Arquivo dbf no disco
Clientes.dbf
Indice CDX
Clientes.CDX
Tags
Codigo
Nome
CPF

Preciso criar um índice TEMPORARY por data de nascimento
Como eu crio esse Indice sem perder as tags anteriores? Vou ter que usar OrdKeyAdd() ou basta simplesmente criar a tag com index on .... TEMPORARY?
Depois que eu criar e usá-lo como faço para apagar?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Apagar um indice TEMPORARY

Mensagempor Kapiaba » 25 Jul 2016 16:27

Tente:

SET ORDER TO 0 // (Zero)

SELECT Seubancoanterior

ou

CLOSE( cAlias )

E chame a rotina de Indices do programa.


Abs
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 25 Jul 2016 18:06

CDX?
Faço assim:

INDEX ON ... TO arqtemp TAG ( "temp" ) ADDITIVE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Apagar um indice TEMPORARY

Mensagempor rubens » 26 Jul 2016 09:00

Bom dia...

Tentei do jeito que o Quintas passou e funcionou era isso, mais simples do que eu tava imaginando... e para apagar é só fechar o arquivo... o temporário apaga sozinho...

Obrigado
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 26 Jul 2016 09:16

e para apagar é só fechar o arquivo... o temporário apaga sozinho...


Ele é criado num CDX separado. Só vai ser usado se o CDX temporário for aberto.
Mas se não for apagado, vai continuar no disco.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Apagar um indice TEMPORARY

Mensagempor rubens » 26 Jul 2016 14:26

Quintas deixa ver se entendi...

Meu código:
#include "hbgtinfo.ch"
REQUEST DBFCDX
REQUEST HB_GT_WVT_DEFAULT

FUNCTION MAIN
   RDDSETDEFAULT('DBFCDX')
   DBSETDRIVER('DBFCDX')
   
        Set Path to ..\TABELAS
   Set Date Brit
   Set Epoch to Year( Date()-80 )
   Set Cent On
   Set Deleted On
   Set Autopen On
   hb_gtinfo(HB_GTI_MAXIMIZED, .T.)
   
   Use Cliente.DBF    alias Cli New Share
   
   cTEXTO := ''
   FOR X = 1 TO OrdCount()
      DbSetOrder(X)
      cTEXTO += STR(X,2)+'-'+ORDKEY(INDEXORD()) + HB_EOL()
   NEXT
   Alert( cTexto )
   
   DbSetOrder(2)
   DbGoTop()
   Browse()
   
   Index on datref tag data ADDITIVE TEMPORARY
   DbSetOrder(5)
   OrdDestroy( ORDKEY(INDEXORD()) )
   
   cTEXTO := ''
   FOR X = 1 TO OrdCount()
      DbSetOrder(X)
      cTEXTO += STR(X,2)+'-'+ORDKEY(INDEXORD()) + HB_EOL()
   NEXT
   Alert( cTexto )

   DbCloseall()
   
RETURN NIL    

O arquivo de clientes tem quatro tags no CDX
Daí na linha 30 eu crio a tag temporária no indice... Index on datref tag data ADDITIVE TEMPORARY
e na linha 32 apago essa tag com o comando OrdDestroy(ORDKEY(INDEXORD()) ).. ( É esse mesmo o comando? tentei também OrdKeyDel() ) com OrdkeyDel retorna .f. e OrdDestroy retorna .t.
Só que quando uso o ordcount() retorna que ainda existe 5 tags no indice..

Se foi criado com TEMPORARY não deveria ser na memória? A partir do momento que uso o orddestroy nao tinha que apagar essa tag?
Se apago o CDX e uso a rotina de indexação para criar o índice de novo e cria com 4 tags o que é certo...

O que tô fazendo de errado?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 26 Jul 2016 14:50

É que o código que passei foi sem o uso de temporary.
Esse temporary é novidade pra mim, vou testar depois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 27 Jul 2016 23:09

Curiosidade:
Eu crio meus temporários na pasta TEMP do Windows, o que faz com que os arquivos sejam locais e possam ser apagados pelo Windows, caso eu esqueça de apagar.
Como funciona esse TEMPORARY?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Apagar um indice TEMPORARY

Mensagempor asimoes » 28 Jul 2016 08:36

Quintas,

A ideia do temporary é criar um indice em memória, eu até já procurei no meu computador se é criado um arquivo temporário, não achei, eu uso direto este recurso a vantagem é que não fica "lixo" após o uso, quando o dbf é fechado ele some.

eu já fiz um teste com 1 milhão de registro, levou 5 segundos para gerar o índice temporary, claro que isso depende dos recurso que o computador possui, processaador, hd e memória disponível
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Apagar um indice TEMPORARY

Mensagempor rubens » 28 Jul 2016 11:35

Bom dia...

Então Asimoes o problema é que quando tá fechando o DBF o Indice temporário continua no CDX.. Daí quando abre o dbf de novo aquele ultimo indice temporary que foi inserido continua lá...
Ou não é assim que funciona... ?

Vai ser criado um novo CDX na memória ?
Não posso criar a nova tag no CDX já existente com ADDITIVE?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Apagar um indice TEMPORARY

Mensagempor asimoes » 28 Jul 2016 12:51

Rubens,

O indice temporário é eliminado no fechamento da tabela porque ele é temporário.

Supondo que você tenha um dbf com 1 indice cdx com 3 chaves ou tags, quando você abre a tabela e faz um set index to ind.cdx e depois cria outro indice com
index on chave tag teste temporary additive, este indice novo será o 4 indice da tabela enquanto ela estiver aberta, fechou a tabela (dbclosearea()) essa tag desse indice temporário é eliminado.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Apagar um indice TEMPORARY

Mensagempor rubens » 28 Jul 2016 14:13

Então Asimoes...
Acho que tô fazendo certo...

Quando executo o programa que eu postei acima...
Ele abre o arquivo cliente.dbf , como o set autopen está on, ele já abre o cliente.cdx
A partir da linha 20 eu mando listar as tags do indice...
CDXTemp1.png
CDXTemp1.png (5.95 KiB) Visualizado 2805 vezes


Na linha 30 eu crio o índice temporário na memória
E na linha 34 mando listar de novo e beleza o índice temporário foi criado e adicionado..
CDXTemp2.png
CDXTemp2.png (6.92 KiB) Visualizado 2805 vezes


Só que se eu fechar esse programa e executar novamente, quando ele manda listar a primeira vez, já mostra as 5 tags. Daí tentei apagar a tag da ordem 5 com OrdDestroy( ORDKEY(INDEXORD()) )
Também não apagou... Continua lá a 5 tag...
O bicho tá pegando aí, como faço para apagar essa 5ª tag??? Já que deveria ter apagado automaticamente...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Apagar um indice TEMPORARY

Mensagempor asimoes » 28 Jul 2016 14:22

Rubens,

Eu não faço SET OPEN ON, eu sempre faço SET INDEX TO (CDXTABELA)

Quando eu preciso usar temporário principalmente em rotinas de impressão logo após abrir a tabela faço ordListClear() e depois eu crio o índice temporário.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 28 Jul 2016 14:41

Vou testar isso.
Não precisa nada adicional? Lembro que pra usar mem: precisa de alguma referência a mais, pra não ter comportamento diferente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Apagar um indice TEMPORARY

Mensagempor JoséQuintas » 28 Jul 2016 14:44

Convém confirmar se realmente o temporário é liberado.
De repente tá ocupando alguma coisa em algum lugar.
Se ao recarregar o EXE apareceu o índice... em algum lugar ele ficou.... rs

Sendo assim, vou preferir meus temporários.... rs

mTmpFile := MyTempFile()
INDEX ON ... TAG temp TO ( mTmpFile ) ADDITIVE
...
use
fErase( mTmpFile )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro