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,
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.
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