Página 1 de 4
Apagar um indice TEMPORARY
Enviado: 25 Jul 2016 15:26
por rubens
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
Apagar um indice TEMPORARY
Enviado: 25 Jul 2016 16:27
por Kapiaba
Tente:
Código: Selecionar todos
SET ORDER TO 0 // (Zero)
SELECT Seubancoanterior
ou
CLOSE( cAlias )
E chame a rotina de Indices do programa.
Abs
Apagar um indice TEMPORARY
Enviado: 25 Jul 2016 18:06
por JoséQuintas
Apagar um indice TEMPORARY
Enviado: 26 Jul 2016 09:00
por rubens
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
Apagar um indice TEMPORARY
Enviado: 26 Jul 2016 09:16
por JoséQuintas
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.
Apagar um indice TEMPORARY
Enviado: 26 Jul 2016 14:26
por rubens
Quintas deixa ver se entendi...
Meu código:
Código: Selecionar todos
#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
Apagar um indice TEMPORARY
Enviado: 26 Jul 2016 14:50
por JoséQuintas
É que o código que passei foi sem o uso de temporary.
Esse temporary é novidade pra mim, vou testar depois.
Apagar um indice TEMPORARY
Enviado: 27 Jul 2016 23:09
por JoséQuintas
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?
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 08:36
por asimoes
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
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 11:35
por rubens
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
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 12:51
por asimoes
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.
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 14:13
por rubens
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 (5.95 KiB) Exibido 4521 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 (6.92 KiB) Exibido 4521 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
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 14:22
por asimoes
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.
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 14:41
por JoséQuintas
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.
Apagar um indice TEMPORARY
Enviado: 28 Jul 2016 14:44
por JoséQuintas
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
Código: Selecionar todos
mTmpFile := MyTempFile()
INDEX ON ... TAG temp TO ( mTmpFile ) ADDITIVE
...
use
fErase( mTmpFile )