Página 1 de 1
dúvida? index
Enviado: 19 Jan 2006 00:10
por Glauco Cruz Costa
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.
Enviado: 19 Jan 2006 00:30
por rbonotto
Para indexar um arquivo que esta em rede eu testo se este esta aberto:
USE anota EXCLUSIVE
IF NETERR()
sair()
EXIT
END
FLOCK()
PACK
INDEX ON num_ped TO anota1
CLOSE DATABASE
Para ver se posso alterar um dado:
IF FLOCK()
....comando
ELSE
...mensagem de bloqueio
END
Para usar SEEK o arquivo DEVERA estra indexado sim.
Abs,
Enviado: 19 Jan 2006 03:05
por rochinha
Amiguinho
Em primeiro lugar( serve para os dois ).
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 :?)
Enviado: 19 Jan 2006 09:09
por Glauco Cruz Costa
rochinha escreveu:Amiguinho
Em primeiro lugar( serve para os dois ).
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?
Enviado: 19 Jan 2006 15:04
por rochinha
Amiguinho
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 :?)
Enviado: 19 Jan 2006 19:13
por Dudu_XBase
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.
Enviado: 19 Jan 2006 21:29
por Glauco Cruz Costa
rochinha escreveu:Amiguinho
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?
Enviado: 20 Jan 2006 04:35
por rochinha
Amiguinho
Seu comando não procede, tem erro de sintaxe.
Para que todos tenham acesso ao arquivo .NTX basta voce colocar no comando USE a clausula INDEX com nome de seu indice, assim:
USE registro ALIAS reg INDEX gegis SHARED NEW
Quando vc coloca INDEX em um comando USE voce já esta habilitando o indice vinculado ao mesmo, exemplo:
Voce tem o arquivo .DBF chamado CLIENTES e dois indices:
O CLIENTE1 indexado pelo campo CODIGO
O CLIENTE2 indexado pelo campo NOME
Voce ira abrir assim:
USE clientes INDEX cliente1, cliente2
...
Ai voce quer ver todos os registro por ordem de NOME basta fazer assim:
...
SET ORDER to 2 // é o segundo indice( cliente2 )
browse()
Mas voce quer retornar para ordem de CODIGO:
...
SET ORDER to 1 // é o primeiro indice( cliente1 )
browse()
Certo?
Se voce usar este método em seu programa, não importa se o mesmo estiver ou não em rede, todos terão acesso ao .NTX.
@braços :?)