Página 1 de 1

Problema com CDX

Enviado: 06 Jun 2016 11:05
por PersioFormigoni
Bom dia a todos..

Ja faz algum tempo que utilizo o xHarbour com indices CDX, porem sempre os tratei da mesma forma que os indices NTX.

Resolvi criar vergonha na cara e arrumar tempo para efetuar a alteração para os indices CDX como deve ser para poder aproveitar melhor seus recursos.

Pois bem, estou tendo um problema que basicamente consiste em o DBSETORDER() ou o ser order to ou ordsetfocus() não mudarem o indice, nào retorna nenhum erro, mas também nào muda a classificação do arquivo.

meu codigo esta assim:

Código: Selecionar todos

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
DBSETDRIVER("DBFCDX") 

SET DBFLOCKSCHEME to 3 

use CLIENT exclusiv

ferase("CLIENT.CDX")

index on CODIGO tag CLIENT01 to CLIENT
index on NOME tag CLIENT02 to CLIENT
index on CIDADE tag CLIENT03 to CLIENT

set index to CLIENT
e na hora de mudar a ordem testei tanto:

set order to 2, dbsetorder(2), ordsetfocus(2), mas sempre a classificação permanece a primeira (por código).

Alguma dica?

Obrigado

Problema com CDX

Enviado: 06 Jun 2016 11:54
por Kapiaba

Código: Selecionar todos

   REQUEST DBFCDX
   RDDSETDEFAULT("DBFCDX")
   DBSETDRIVER("DBFCDX")

   SET DBFLOCKSCHEME to 3  //?? NAO VEJO NECESSIDADE... MAS...

   use CLIENT exclusiv NEW

   IF EXIST( "CLIENT.CDX"  )

      ferase("CLIENT.CDX")

   ENDIF

   // OBSERVE AS TAGS CLIENT.CDX e o NOME do BANCO INDEXADO POR NO MAXIMO 50 TAGS
   index on CODIGO tag CLIENT01 to CLIENT
   index on NOME   tag CLIENT02 to CLIENT
   index on CIDADE tag CLIENT03 to CLIENT

   //set index to CLIENT  // ERRADO, NAO SE CHAMA COMO SE FOSSE .NTX

   // PARA CHAMAR AS TAGS DENTRO DE CLIENT.CDX
   SET ORDER TO 01 // CLIENT01  -> TAG 01

   // SET ORDER TO 02 // CLIENT02 -> TAG 02

   // SET ORDER TO 03 // CLIENT03 -> TAG 03

   // E ASSIM SUCESSIVAMENTE.

Abs

Problema com CDX

Enviado: 06 Jun 2016 12:30
por Toledo
Segue um pequeno demo.
Kapiaba escreveu://set index to CLIENT // ERRADO, NAO SE CHAMA COMO SE FOSSE .NTX
Pode ser usado, principalmente se o nome do arquivo CDX for diferente do nome do DBF.

Abraços,

Problema com CDX

Enviado: 06 Jun 2016 12:40
por Kapiaba
Mister Toledo, me expressei errado, o que eu quis dizer, é que a forma que ele estava fazendo estáva errado.

Veja que no seu exemplo,

Código: Selecionar todos

   set index to CLIENTES  
  set order to 1
O senhor usou dois comandos, oq que não há necessidade em xHarbour, bastando chamar a TAG do indice.cdx

SET ORDER TO... em qualquer parte do programa. Posso ter a té 50 Tags que funcionará tranquilo.

Obg. abs.

Problema com CDX

Enviado: 06 Jun 2016 12:50
por Kapiaba
Pode-se também:

Código: Selecionar todos

AZ->( ORDSETFOCUS("RSOCIAL") )
// OU
AZ->( ORDSETFOCUS(3) )
http://linguagemclipper.com.br/cdx.shtml

Muito mais rápido que o SET INDEX

Aqui fica mais claro para sanar qualquer dúvidas:

http://www.oocities.org/oyama_b/clipper009.html

Abs

Problema com CDX

Enviado: 06 Jun 2016 14:07
por PersioFormigoni
obrigado pelas respostas... vou testar...

O exemplo que eu mandei, acabei me expressando mal... e faltando algumas informações... mas ali só quis colocar os comandos que usei na criação dos índices, abertura dele e seleção da ordem desejada... mas estão em diversas localizações dentro de cada programa....


Valeu.....

Problema com CDX

Enviado: 06 Jun 2016 15:19
por JoséQuintas
Lembro de ter visto um post sobre esse problema, que depois foi ajustado.

O melhor mesmo é usar o nome da tag.

Código: Selecionar todos

OrdSetFocus( "client02" )
Dependendo do nome que usar, até melhor pra identificar do que se trata no fonte.

Código: Selecionar todos

OrdSetFocus( "nome" )
OrdSetFocus( "endereco" )
OrdSetFocus( "codigo" )
O nome interno da tag é específico para aquele DBF/CDX.
Pode ter a ordem "NOME" e "CODIGO" em clientes, produtos, fornecedores, etc.

Problema com CDX

Enviado: 06 Jun 2016 15:28
por JoséQuintas
Correção do post do Kapiaba, que disse sobre não usar SET INDEX
E já acrescentando algo mais que uso:

Código: Selecionar todos

SET AUTOOPEN OFF
USE CLIENT
IF .NOT. File( "CLIENT.CDX" )
   INDEX ON field->Codigo TAG codigo
   INDEX ON field->Nome TAG nome
   INDEX ON field->Endereco TAG endereco
ENDIF
SET INDEX TO CLIENT
OrdSetFocus( "codigo" )
Notas:
- field-> é porque usando -w3 -es2 exige declaração de tudo que usar
- Se o nome do CDX é o mesmo do arquivo, não precisa indicar
- AutoOpen é pra abrir índice automático, mas se isso ficar indicado dentro do DBF, atrapalha quando quer arquivo sem índice, ou quando o índice não existir
- Uso OrdSetFocus() porque usava isso na SIXCDX. Nem sei se no Harbour existe outra função pra isso, mas essa continua funcionando nele.

Problema com CDX

Enviado: 06 Jun 2016 17:18
por Jairo Maia
Olá Pessoal,

Usando DbSetOrder() funciona tanto com a ordem como o nome da TAG:

Código: Selecionar todos

REQUEST DBFCDX

Procedure Main()
       
 RddSetDefault( "DBFCDX" )
       
 aEstru:={;
         { "FirstName", "C", 20, 0 },;
         { "LastName" , "C", 20, 0 },;
         { "City"     , "C", 20, 0 };
         }
 DbCreate( "CUSTOMER", aEstru )
       
 USE Customer
       
 For x:= 1 To 10
  Append Blank
  Replace FirstName With "Fisrt Name " + Hb_NToS( 10-x )
  Replace LastName With Hb_NToS( x+20 ) + " Last Name"
  Replace City With "Cidade " + Hb_NToS( x+30 )
 Next

 INDEX ON Upper(FirstName) TAG FName TO Cust01
 INDEX ON Upper(LastName)  TAG LName TO Cust01
 INDEX ON Upper(City)      TAG City  TO Cust01
       
 Clear Screen
       
 DbGoBottom()
 DbSetOrder( 1 )          // usando a Ordem do Indice
 Browse()

 DbGoBottom()
 DbSetOrder( "LName" )    // usando o Nome do Indice
 Browse()

Return Nil

Problema com CDX

Enviado: 06 Jun 2016 21:50
por rochinha
Amiguinhos,

Em se tratando de SET INDEX realmente nem é necessário usá-lo quando o motor for .CDX.

Por padrão o .DBF criado pelo motor .CDX abre automaticamente o .CDX de mesmo nome da base.

Veja que falei "criado", ou seja, se você já tem um .DBf criado com o motor .NTX e simplesmente mudar o motor para .CDX será necessário SET INDEX.

O melhor é você recriar as estruturas usando o novo motor.

Para abrir .DBF e o .CDX automaticamente o comando SET AUTOOPEN ON deve ser usado. Por padrão esta sempre ON.

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" ), ( MsgWait( "Arquivo "+<(db)>+" esta sem indices. Abrindo sem indices. Reorganiza primeiro" ), dbUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ) ), ( dbUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ), dbSetIndex( <(db)> ) ) ), ( dbSelectArea( <(db)> ) ) )
Para facilicar minha vida eu modifiquei meus métodos de abertura para diminuir erros no .NTX e mantive no .CDX.

Código: Selecionar todos

     ...
     OPEN clientes SHARED
     ...
     OPEN clientes SHARED INDEX clientes, cliente2, ...
     ...

Problema com CDX

Enviado: 06 Jun 2016 22:09
por JoséQuintas
Eu sempre usei com autoopen desativado.
Confirmem se no Harbour é diferente (ou no Clipper sem SIXCDX):

Problema 1: se o índice estiver corrompido, a abertura automática gera erro, e nem reindexar vai ser possível.

Problema 2: como ON, cria uma flag no DBF que existe índice. Se apagá-lo, não consegue mais nem abrir o DBF.


Rochinha:
o CH que postou não parece ser do Harbour

Problema com CDX

Enviado: 07 Jun 2016 03:12
por rochinha
Amiguinhos,

JoseQuintas
Rochinha:
o CH que postou não parece ser do Harbour
Não é mesmo. Eu quis explanar sobre aberturas mostrando uma modificação de meu uso.

Problema com CDX

Enviado: 07 Jun 2016 10:40
por Kapiaba

Código: Selecionar todos

// The example demonstrates the effect of SET AUTOPEN with the
// DBFCDX driver.

REQUEST DBFCDX

PROCEDURE Main

   RddSetDefault( "DBFCDX" )

   SET AUTOPEN OFF

   USE Customer

   INDEX ON CustID                    TAG ID   TO Customer
   INDEX ON Upper(LastName+FirstName) TAG Name TO Customer

   USE Customer

   ? OrdCount(), OrdKey()        // result: 0  ""

   SET AUTOPEN ON

   USE Customer

   ? OrdCount(), OrdKey()        // result: 2  ""

   SET AUTORDER TO 1

   USE Customer

   ? OrdCount(), OrdKey()        // result: 2  CUSTID
   ? Ordkey( 2 )                 // result: Upper(LastName+FirstName)

   SET ORDER TO 2  // por nome

   Browse()

   USE

RETURN NIL