PESQUISAR EM UM DBF INDICE CDX
Enviado: 15 Jul 2022 10:23
Bom dia!
Muitas vezes no início, cheguei a achar que era um Bug no Harbour, pois acontecia a mesa coisa comigo.... depois entendi que a cada replace o registro pulava de posição deixando o loop bem louco....
A questão é que quando você atualiza um campo ele pode mudar de posição o registro corrente, podendo inclusive se transformar no último registro e já sair do loop pelo eolf() (no caso se você colocar no início do campo uma palavra com a letra "Z" por exemplo...)
Minha sugestão é que você mude o SetOrder para um campo que não seja o que você ira efetuar os replaces, dai nesse caso não haverá problema pois ele ira obedecer o loop certinho do início ao fim sem que haja mudança de posição dos registros no índice ativo (pois vc estará efetuando alterações em campos que não estão no SetOrder ativo)
Por exemplo, se você for efetuar um replace no campo "NOME então coloque o SetOrder (OrdSetFocus) para o campo "CODIGO" (ou outro qualquer)...
Dependendo o caso, se no index do campo que vc escolher o SetOrder houver cláusulas de indexação(como FOR ou outra cláusula qualquer) você ainda pode indexar esse arquivo já indexado para outro campo temporariamente usando o USECURRENT
No caso do uso da cláusula USECURRENT, ele manterá as condições da primeira indexação original porém apresentará uma nova ordem, no caso agora pelo campo CODIGO.
E aproveitando, acredito que deveria tirar o DbCommit() de dentro do Loop e colocar ele somente no final de todos os replaces, vai economizar bastante tempo.
Muitas vezes no início, cheguei a achar que era um Bug no Harbour, pois acontecia a mesa coisa comigo.... depois entendi que a cada replace o registro pulava de posição deixando o loop bem louco....
A questão é que quando você atualiza um campo ele pode mudar de posição o registro corrente, podendo inclusive se transformar no último registro e já sair do loop pelo eolf() (no caso se você colocar no início do campo uma palavra com a letra "Z" por exemplo...)
Minha sugestão é que você mude o SetOrder para um campo que não seja o que você ira efetuar os replaces, dai nesse caso não haverá problema pois ele ira obedecer o loop certinho do início ao fim sem que haja mudança de posição dos registros no índice ativo (pois vc estará efetuando alterações em campos que não estão no SetOrder ativo)
Por exemplo, se você for efetuar um replace no campo "NOME então coloque o SetOrder (OrdSetFocus) para o campo "CODIGO" (ou outro qualquer)...
Dependendo o caso, se no index do campo que vc escolher o SetOrder houver cláusulas de indexação(como FOR ou outra cláusula qualquer) você ainda pode indexar esse arquivo já indexado para outro campo temporariamente usando o USECURRENT
Código: Selecionar todos
use arquivo index arquivo
ORDSETFOCUS(2) <-- Essa ordem seria o campo "NOME' por exemplo e com cláusulas na indexação.
INDEX ON CODIGO TAG COD_TEMP USECURRENT TEMPORARY <-- Criara um índice temporário na memória
ou
INDEX ON CODIGO TAG TAG_TEMP TO IND_TEMP USECURRENT <-- Criará o índice IND_TEMP
E aproveitando, acredito que deveria tirar o DbCommit() de dentro do Loop e colocar ele somente no final de todos os replaces, vai economizar bastante tempo.