1) Como posso usar index on em rede?
Será que posso fazer isso:
Perguntar se o arquivo está aberto com FILE,
e caso não esteja, abrir? Ele aceita isso? Em caso de FLOCK() não prejudica o trabalho de outros que já tiverem conectado ao servidor.
E no caso de um primeiro usuário já o tiver aberto, quando o outro usuário abrir, o seu terminal acessará o NTX.
2) É necessário ter SET INDEX TO para usar SEEK?
Obrigado.
Uma rotina de indexação em rede nunca deve ser executada sem antes todos os outros usuarios não tenham saido do sistema ou de alguma tela de manipulação de banco de dados.
Primeiro antes de indexar voce deve testar se cada arquivo realmente esta liberado, abrindo-os em modo exclusivo, se voce verificar que todos estão liberados executa a rotina de indexação de uma só vez. pois muitas vezes pode acontecer de todo mundo ter saido do sistema, mas o cache do windows ter prendido algum arquivo.
Para que voce faça uma indexação regura sua rotina deverá ser assim:
// Critica arquivo 1
abre arquivo 1
if conseguiu
vai para arquivo 2
else
tenta por um tempo
if conseguiu
vai para arquivo 2
else
apresenta mensagem 'Arquivo 1 travado em estacao'
retorna
endif
endif
// Critica arquivo 2
abre arquivo 2
if conseguiu
vai para arquivo 3
...
if AbriuTodos
grava arquivo texto de nome index.log com qualquer coisa
roda a rotina de indexacao...
apaga arquivo texto de nome index.log
endif
Porque usar o arquivo index.log?
Será somente um artificio para que os usuarios ao tentarem abrir qualquer tela em seu sistema, uma função de verificação não permtira prosseguir.
Ou seja voce devera incluir a chamada a função que verifica a existencia do arquivo index.log e não existir deixa passar.
A função é simples
function Indexando()
return iif(file("index.log", .t., .f.)
Em todas as entradas de telas voce coloca o código abaixo:
If Indexando()
? 'Aguarde. indexação em curso...'
inkey(5)
return .t.
endif
Uma rotina de indexação em rede nunca deve ser executada sem antes todos os outros usuarios não tenham saido do sistema ou de alguma tela de manipulação de banco de dados.
Primeiro antes de indexar voce deve testar se cada arquivo realmente esta liberado, abrindo-os em modo exclusivo, se voce verificar que todos estão liberados executa a rotina de indexação de uma só vez. pois muitas vezes pode acontecer de todo mundo ter saido do sistema, mas o cache do windows ter prendido algum arquivo.
Para que voce faça uma indexação regura sua rotina deverá ser assim:
// Critica arquivo 1
abre arquivo 1
if conseguiu
vai para arquivo 2
else
tenta por um tempo
if conseguiu
vai para arquivo 2
else
apresenta mensagem 'Arquivo 1 travado em estacao'
retorna
endif
endif
// Critica arquivo 2
abre arquivo 2
if conseguiu
vai para arquivo 3
...
if AbriuTodos
grava arquivo texto de nome index.log com qualquer coisa
roda a rotina de indexacao...
apaga arquivo texto de nome index.log
endif
Porque usar o arquivo index.log?
Será somente um artificio para que os usuarios ao tentarem abrir qualquer tela em seu sistema, uma função de verificação não permtira prosseguir.
Ou seja voce devera incluir a chamada a função que verifica a existencia do arquivo index.log e não existir deixa passar.
A função é simples
function Indexando()
return iif(file("index.log", .t., .f.)
Em todas as entradas de telas voce coloca o código abaixo:
If Indexando()
? 'Aguarde. indexação em curso...'
inkey(5)
return .t.
endif
Ficou legal?
Então mãos a obra.
@braços :?)
Amigo, valeu mesmo. :xau
Mas, ainda estou com dúvida! :-O
Veja:
Como todos os usuários em seus terminais podem ter acesso ao .NTX (arquivo indexado) sem problemas?
Os arquivos .NTX são abertos em conjunto com o .DBF vinculado, portanto se voce criou 10 .NTXs para o seu .DBF, sempre, sempre abra os 10 para fazer qualquer coisa, pois se voce arquivo apenas 9 no momento de incluir por uma maquina e alguem abrir o 10cimo para excluir, pronto, corrompeu tudo e voce tera de reorganizar.
Sugiro voce fazer uma pesquisa aqui no forum com os termos, CDX, DBFCDX, e passar a usar o .CDX, exemplo:
Com .NTX voce:
1 Tem um .DBF e 15 indices por .DBF
2.Voce abre um .DBF e 15 .NTX, ou seja, abre dezesseis arquivos.
Com .CDX voce:
1 Tem um .DBF e 15 indices por .DBF, sendo que cada .CDX terá até 15 indices, ou seja, voce poderá ter mais de 200 indices por .DBF.
2.Voce abre um .DBF e um .CDX, ou seja, abre apenas 2 arquivos.
Sabendo-se que o limite do DOS é de 255 arquivos com .NTX voce não poderá abrir muitos arquivos e com .CDX voce terá mais ponteiros livres.
Para indexar com .NTX:
USE arquivo
INDEX ON chave1 TO arquivo1
INDEX ON chave2 TO arquivo2
...
INDEX ON chave15 TO arquivo15
USE arquivo INDEX arquivo1, arquivo2, ..., arquivo15
Para indexar com .CDX:
USE arquivo
INDEX ON chave1 TAG arquivo1 TO arquivo
INDEX ON chave2 TAG arquivo2 TO arquivo
...
INDEX ON chave15 TAG arquivo15 TO arquivo
USE arquivo INDEX arquivo
Para usar .CDX em seus programas acrescente no inicio .PRG principal
REQUEST DBFCDX
RddSetDefault( "DBFCDX" ) ou RddSetDriver( "DBFCDX" )
Boa Noite.
Complementando usando indices compostos cdx ou nsx, qdo vc precisar criar outras chaves de ordenação não precisa ficar indo nos demais prgs e adicionando no set index to ou index o novo indice...como no caso do ntx.
set index to ind1,ind2,ind3
Vc somente altera o prg q faz a indexação ou reorganização dos dbfs, incluir a nova chave e reindexa.
Além de vc ganhar com a estabilidade e performance q esses indices proporcionam vc perderá menos tempo qto tiver q fazer alguma manutenção em sua base de dados qto a criação de novas ordenações.
Os arquivos .NTX são abertos em conjunto com o .DBF vinculado, portanto se voce criou 10 .NTXs para o seu .DBF, sempre, sempre abra os 10 para fazer qualquer coisa, pois se voce arquivo apenas 9 no momento de incluir por uma maquina e alguem abrir o 10cimo para excluir, pronto, corrompeu tudo e voce tera de reorganizar.
Sugiro voce fazer uma pesquisa aqui no forum com os termos, CDX, DBFCDX, e passar a usar o .CDX, exemplo:
Com .NTX voce:
1 Tem um .DBF e 15 indices por .DBF
2.Voce abre um .DBF e 15 .NTX, ou seja, abre dezesseis arquivos.
Com .CDX voce:
1 Tem um .DBF e 15 indices por .DBF, sendo que cada .CDX terá até 15 indices, ou seja, voce poderá ter mais de 200 indices por .DBF.
2.Voce abre um .DBF e um .CDX, ou seja, abre apenas 2 arquivos.
Sabendo-se que o limite do DOS é de 255 arquivos com .NTX voce não poderá abrir muitos arquivos e com .CDX voce terá mais ponteiros livres.
Para indexar com .NTX:
USE arquivo
INDEX ON chave1 TO arquivo1
INDEX ON chave2 TO arquivo2
...
INDEX ON chave15 TO arquivo15
USE arquivo INDEX arquivo1, arquivo2, ..., arquivo15
Para indexar com .CDX:
USE arquivo
INDEX ON chave1 TAG arquivo1 TO arquivo
INDEX ON chave2 TAG arquivo2 TO arquivo
...
INDEX ON chave15 TAG arquivo15 TO arquivo
USE arquivo INDEX arquivo
Para usar .CDX em seus programas acrescente no inicio .PRG principal
REQUEST DBFCDX
RddSetDefault( "DBFCDX" ) ou RddSetDriver( "DBFCDX" )
@braços :?)
Eu poderia colocar assim?
use registro alias reg index on gegis shared new
E, aí, quando todos os terminais entrarem no programa, teriam acesso ao NTX?