Página 1 de 5

CDX x dbsetorder()

Enviado: 18 Jul 2007 19:58
por Mário Isa
Amigos,Boa Noite!
Mudei para CDX e ocorre o seguinte:
Se tenho
use algumacoisa index algumacoisa.cdx,algumacoisa2.cdx

se faço
dbsetorder(3)

dá erro pois não existe o 3º .CDX indexado

Nota: Não estou utilizando TAGs.

Quando era NTX ele simplesmente ignorava e não trocava a ordem.
Mas quando agora é CDX ele dá erro de SETFOCUS..... algo assim.

Tem como alterar isso? Para fazer com que ele (o drive DBFCDX) ignore o fato de não existir a ordem desejada ?

Abraços
Mário

Enviado: 18 Jul 2007 21:02
por Eolo
Mário,

Não consigo entender por que razão vc teria, dentro do seu programa, uma linha setando o índice 3 como controlador se vc não criou esse índice 3 antes... Vc pode esclarecer?


De qq forma, eu faço dum jeito que pode ser uma solução pra vc. Um exemplo resumido:

a) uma matriz ARQUIVOS com os nomes dos DBF
01CLIENT
02VENDAS

b) uma matriz INDICES com as chaves dos NTX a criar para cada DBF:
0101nome+strzero(cpf)
0102cidade+nome
0201datav
0202nome+dtos(datav)
0203strzero(valorv,12,2)+nome

Aí eu uso essas matrizes para abrir os arquivos: eu sei que o arquivo CLIENT vai abrir 2 índices (client01 e client02.ntx) e o arquivo VENDAS.dbf vai abrir 3 índices (vendas01, vendas02 e vendas03.ntx).

Então, no seu caso, antes de rodar o DBSETORDER(3), eu procuraria - nessas martrizes - o índice 3 para o DBF aberto na área de trabalho em uso. Se achasse (caso do VENDAS), setaria a nova ordem. Se não achasse (caso do CLIENT), daria um alerta ou algo do tipo, sem causar erro de execução...

Enviado: 18 Jul 2007 21:11
por Mário Isa
Obrigado pela ajuda!
De qualquer forma já tive que fazer uma outra dbsetorder só prá mim.
Ficou assim:
MapSetorder(2)
Map = Mário Antônio Pereira, sacou ?
Aí já resolvi, mesmo que temporariamente, meus problemas.
Obrigado.
Mário

Se precisar da função, fala que eu a remeto para os do fórum.

Enviado: 18 Jul 2007 21:28
por Eolo
Sim, poste a sua função.
Se alguém tiver o mesmo problema, pode ajudar!

Enviado: 19 Jul 2007 08:25
por sygecom
Mario, se vc usar as TAGS vc não prescissa alterar os SET ORDER TO....eu mudei do NTX para o CDX ...usando as TAGS e continuei usando os SET ORDER TO...

Post, como vc esta criando seus indice....

Obs: Se tiver alguma duvida posso postar uns exemplos para vc.

Abraços
Leonardo Machado

Enviado: 19 Jul 2007 08:33
por Eolo
Leonardo,
Parece que o problema do Mário não é saber como usar TAGs e/ou o SET ORDER. O que ele diz no primeiro post é outra coisa: ele faz DBSETORDER(3) / SET ORDER TO 3 para um índice/TAG 3 que não existe, não foi criado... e ele quer controlar o runtime error que dá no CDX e não dava no NTX.

Enviado: 19 Jul 2007 08:44
por sygecom
Eolo escreveu:Leonardo,
Parece que o problema do Mário não é saber como usar TAGs e/ou o SET ORDER. O que ele diz no primeiro post é outra coisa: ele faz DBSETORDER(3) / SET ORDER TO 3 para um índice/TAG 3 que não existe, não foi criado... e ele quer controlar o runtime error que dá no CDX e não dava no NTX.
Tche, entaum isso jah estava errado no NTX.... ?

Igual diria para usar as TAGS....

Abraços
Leonardo Machado

Enviado: 19 Jul 2007 16:21
por alaminojunior
só para ilustrar

no sistema ntx:
todos os indices referentes ao suposto dbf são armazenados em arquivos fisicos diferentes. Ex. por codigo: codigo.ntx, por nome: nome.ntx, são dois arquivos distintos, então alternar de um para o outro usa-se Set Order to
Detalhe
Ao abrir os dbf´s verifique se os indices existem ou recrie-os
Ex.
use animais shared // abre o banco
if !file("codigo.ntx") // verifica se existe
index on codigo to codigo // reindexa
endif
set index to codigo, nome // abre os indices

no sistema CDX
todos os indices referentes ao dbf, ficam armazenados no mesmo arquivo fisico.
para alternar entreum e outro use OrdSetFocus("codigo")
fica assim
use animais shared
if !file("animais.cdx") // verifica se existe
index on codigo tag codigo to animais
index on nome tag nome to animais // reindexa
endif
DbSetIndex("animais") // abre os indices
Não esqueça de deletar o animais.cdx antes de reindexar, senão elevai crescendo, crescendo...
Espero ter ajudado

Enviado: 20 Jul 2007 10:35
por vagucs
OBSERVAÇÃO MUITO IMPORTANTE

A DBSETORDER recebe 1 parametro que para setar a ordem atual na área de trabalho.

Em alguns indices, como o NTX vc tem variaos arquivos sem TAGs, para setar o indice você precisa indicar o numero do arquivo em questão.

DBSETORDER(1) ou DBSETORDER(10) etc...

No caso de CDX com TAG, vc tem que especificar um STRING contanto o NOME da TAG, supondo que fosse a TAG 1 na clausula USE entao seria.

DBSETORDER("1")

Ou a TAG WAGNER por exemplo

DBSETORDER("WAGNER")

Entenderam a diferença, nao faz sentido nenhum usar mais de um arquivo com CDX.

Mas nao sei, acho que funcionaria, pela LOGICA

REPITO: LOGICA

Eu poderia usar o DBSETORDER para alternar o arquivo CDX na area de trabalho setando ele com um valor numero e na sequencia setando pelo nome da TAG no arquivo setado. Nunca testei assim, isso seria para usar mais de um indice CDX, o que nao acho correto.

Alguem poderia testar para nos?

Enviado: 20 Jul 2007 10:44
por Maligno
vagucs escreveu:Eu poderia usar o DBSETORDER para alternar o arquivo CDX na area de trabalho setando ele com um valor numero e na sequencia setando pelo nome da TAG no arquivo setado. Nunca testei assim, isso seria para usar mais de um indice CDX, o que nao acho correto.

Alguem poderia testar para nos?
Poxa, mas eu faço assim todo santo dia. Uso NSX, mas operacionalmente é idêntico ao CDX. Tanto posso comutar para outra tag pelo número de ordem quanto pelo nome da tag. Aliás, uso a segunda forma, que é mais imune a erros.

Enviado: 21 Jul 2007 14:26
por Gilberto M Silva
Caros Colegas, Postem uma função usando CDX, pois estou querendo mudar de NTX para indices CDX.
Obrigado.

Enviado: 21 Jul 2007 15:27
por Maligno
Já deu uma olhada no demo da biblioteca SIX? Acredito que ali já esteja tudo bem explicado. Ou já viu e ficou alguma dúvida?

Enviado: 21 Jul 2007 16:43
por sygecom
Gilberto M Silva escreveu:Caros Colegas, Postem uma função usando CDX, pois estou querendo mudar de NTX para indices CDX.
Obrigado.
Tche, a tempo atras jah postei exemplos.....sempre de uma pesquisada no Forum antes de Postar.....segue abaixo exmplos de uso da CDX:

Antes de mais nd vou lhe dar o exemplo de como eu faço..eu uso o clipper 5.3...apesar de todo mundo dizer pra usar o clippper 5.2 mais ninguem sabe dizer um real motivo de pq usar uma versão anterior..mas isso não vem a caso.

Link as LIB abaixo no seu script:
DBFCDX.LIB
_DBFCDX.LIB


Coloque essas 4 linhas no incio so seu sistema:

Código: Selecionar todos

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
RDDSETDEFAULT("_DBFCDX")
DBSETDRIVER("DBFCDX")
Para criar indice:

Código: Selecionar todos

use AGENDA alias AGENDA excl new
if !neterr()
   DELETE FILE AGENDA.CDX
   index on NOME TAG 1 to AGENDA   EVAL Progress() every lastrec()/100
   index on COD   TAG 2 to AGENDA   EVAL Progress() every lastrec()/100
   index on ENDE  TAG 3 to AGENDA   EVAL Progress() every lastrec()/100
   index on CIDADE TAG 4 to AGENDA EVAL Progress() every lastrec()/100
   index on DATA   TAG 5 to AGENDA EVAL Progress() every lastrec()/100
   use
ELSE
   EMUSO()  // ROTINA PARA AVISO DE USO DO DBF
ENDIF
Exemplo de Abertura e uso do mesmo:

Código: Selecionar todos

USE AGENDA ALIAS AGENDA shared  //abrindo DBF
SET INDEX TO AGENDA                   // abrindo indice

XCOD=0
SELE AGENDA
SET ORDER TO 2 //SELECIONEI A ORDEM (COD)
SEEK XCOD
IF FOUND()
    BLA,BLA,BLA.....
ENDIF
...
Exemplo de como usar o ORDSCOPE() no CDX:

Código: Selecionar todos

XDATA1=DATE()
XDATA2=DATE()-60  // A 60 DIAS ATRAS

SELE AGENDA
SET ORDER TO 5
ORDScope(0, XDATA1)
ORDScope(1, XDATA2)
Goto top
....
Obs:Se não me engano se vc usar o DBF com o mesmo Nome do CDX ele se abre automaticamente, referente ao ORDSCOPE() esse é muito bom e veloz...faz o trabalho do SET FILTER TO mas em uma velocidade muito boa...alias...se vc quiser tb. pode usar em conjunto...o ORDSCOPE mais o SET FILTER TO.

Espero que entenda...os exemplos se tiver alguma duvida posta aqui e resolveremos..

Abraços
Leonardo Machado

Enviado: 21 Jul 2007 17:08
por Maligno
sygecom escreveu:Obs:Se não me engano se vc usar o DBF com o mesmo Nome do CDX ele se abre automaticamente
O NG da SIX explica bem esse mecânismo de abertura.

Enviado: 21 Jul 2007 20:38
por sygecom
Maligno escreveu:
sygecom escreveu:Obs:Se não me engano se vc usar o DBF com o mesmo Nome do CDX ele se abre automaticamente
O NG da SIX explica bem esse mecânismo de abertura.
Me refiro ao CDX do proprio CLIPPER, e alias se amanha depois pensando em um futuro, e o colega quiser migrar para xharbour sem dor de cabeça....vai poder usar na o CDX sem ter que alterar nd.....jah com a six...ele vai ter problemas.

Abraços
Leonardo Machado