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