Página 1 de 1

dúvida com SET INDEX TO

Enviado: 02 Out 2014 18:59
por porter
ola pessoal, uma dúvida, quando seleciono um indice pelo ORDSETFOCUS("indice1") criado, não será mais necessario usar o SET INDEX TO indice1, indice2 para deixar todos os indices abertos como se fazia no Clipper ?

SELECT 1
USE MERCADORIAS
INDEX ON codigo TAG indice1 TO mercadoria1
INDEX ON nome TAG indice2 TO mercadoria1

Para mudar a ordem em um arquivo de índice CDX:


ORDSETFOCUS("INDICE2")

Com esse comando todos os indices já serão abertos, sem precisar usar o SET INDEX TO indice1, indice2, etc

windows, xHarbour.

dúvida com SET INDEX TO

Enviado: 02 Out 2014 19:54
por acelconsultoria
Olá, Porter.

É assim mesmo. Isso ocorre, porque os índices CDX, depois de criados pelo INDEX ON, são abertos automaticamente após o comando USE. Com isso, só é necessário você apontar a tag desejada, através do comando SET ORDER TO ou da função ORDSETFOCUS().

Tem esse tópico aqui abordando e explicando a situação com mais detalhes:
https://pctoledo.org/forum/viewto ... f=4&t=7399

E caso queria desabilitar a abertura automática dos índices, então você deve colocar no início do seu programa:

Código: Selecionar todos

SET AUTOPEN OFF
Espero ter ajudado !!! Abraços.

dúvida com SET INDEX TO

Enviado: 02 Out 2014 23:13
por alxsts
Olá!

No RDD CDX, se, e somente se, o nome do arquivo estrutural de índices (o arquivo .CDX único que contém todas as tags de índices), também conhecido como Order Bag, tiver o mesmo nome do arquivo .DBF e a opção SET AUTOPEN estiver ON, então, o comando USE detectará isto e abrirá o arquivo de índices automaticamente. Opcionalmente, se a opção SET AUTORDER for especificada, poderá ser especificada uma ordem inicial.

dúvida com SET INDEX TO

Enviado: 02 Out 2014 23:24
por rochinha
Amiguinhos,

Porter

No código abaixo você usa a todo momento este modo de abertura?

Código: Selecionar todos

SELECT 1
USE MERCADORIAS
INDEX ON codigo TAG indice1 TO mercadoria1
INDEX ON nome TAG indice2 TO mercadoria1
Em primeiro lugar você não deveria usar este método sempre ao abrir a tabela, pois o INDEX ON deve ser usado esporádicamente ou programáticamente.

Um .DBF precisa de arquivos acessórios .NTX ou .CDX mas estes não precisam ser criados a todo momento.

Você tem um arquivo MERCADORIAS, pode muito bem criar o indice-bag MERCADORIAS e quando o número de tags internas ultrapassarem 15 você pode criar mais um indice-bag, e então usar:

Código: Selecionar todos

SELECT 1
USE MERCADORIAS
SET INDEX TO mercadorias, mercadoria1
...
SET ORDER TO mercadoria1
...
SET ORDER TO mercadorias
Se você só tem 1 índice por tabela pode usar o comando Auto Open para abri-los automáticamente.

Em tempo, vale dizer que a anos não uso o comando USE a não ser que eu queira abrir um arquivo em modo exclusivo.

Código: Selecionar todos

#command OPEN <(db)>                                                    ;
             [VIA <rdd>]                                                ;
             [ALIAS <a>]                                                ;
             [<new: NEW>]                                               ;
             [<ex: EXCLUSIVE>]                                          ;
             [<sh: SHARED>]                                             ;
             [<ro: READONLY>]                                           ;
             [INDEX <(index1)> [, <(indexn)>]]                          ;
       => iif( Select( <(db)> )==0, iif( !File( <(db)>+".CDX" ), ( Mensagem( "Arquivo "+<(db)>+" esta sem indices. Abrindo sem indices. Reorganiza primeiro" ), dbNetUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ) ), ( dbNetUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ), dbSetIndex( <(db)> ) ) ), ( dbSelectArea( <(db)> ) ) )
A diferença deste comando no meu caso é abrir o .CDX de mesmo nome da tabela e evitar erro de abertura quando o mesmo já está aberto. O diferencial é, que se a tabela já estiver aberta e for dado um comando OPEN na mesma, será setada a área onde a tabela esta aberta atualmente.