Problema com CDX

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

PersioFormigoni
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 06 Jun 2016 10:45
Localização: Guarulhos - SP

Problema com CDX

Mensagem 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
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Problema com CDX

Mensagem 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
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Problema com CDX

Mensagem 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,
Anexos
demo_set_ordem_cdx.zip
(878.89 KiB) Baixado 131 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Problema com CDX

Mensagem 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.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Problema com CDX

Mensagem 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
PersioFormigoni
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 06 Jun 2016 10:45
Localização: Guarulhos - SP

Problema com CDX

Mensagem 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.....
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com CDX

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com CDX

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Problema com CDX

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Problema com CDX

Mensagem 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, ...
     ...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com CDX

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Problema com CDX

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Problema com CDX

Mensagem 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
Responder