Apagar um indice TEMPORARY

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

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Apagar um indice TEMPORARY

Mensagem 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
"Eu e minha casa servimos ao Senhor e você ???"
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Apagar um indice TEMPORARY

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem por JoséQuintas »

CDX?
Faço assim:

Código: Selecionar todos

INDEX ON ... TO arqtemp TAG ( "temp" ) ADDITIVE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Apagar um indice TEMPORARY

Mensagem 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
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Apagar um indice TEMPORARY

Mensagem 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
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem por JoséQuintas »

É 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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem 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?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Apagar um indice TEMPORARY

Mensagem 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
►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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Apagar um indice TEMPORARY

Mensagem 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
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Apagar um indice TEMPORARY

Mensagem 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.
►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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Apagar um indice TEMPORARY

Mensagem 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
CDXTemp1.png (5.95 KiB) Exibido 4528 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) Exibido 4528 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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Apagar um indice TEMPORARY

Mensagem 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.
►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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar um indice TEMPORARY

Mensagem 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 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder