CDX x dbsetorder()
Moderador: Moderadores
-
Mário Isa
- Usuário Nível 4

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
CDX x dbsetorder()
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
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
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...
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...
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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
Post, como vc esta criando seus indice....
Obs: Se tiver alguma duvida posso postar uns exemplos para vc.
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Tche, entaum isso jah estava errado no NTX.... ?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.
Igual diria para usar as TAGS....
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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
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
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
- vagucs
- Membro Master

- Mensagens: 1480
- Registrado em: 10 Jul 2004 10:45
- Localização: Ipanema - MG
- Contato:
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?
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?
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.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?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Gilberto M Silva
- Usuário Nível 3

- Mensagens: 230
- Registrado em: 13 Mar 2007 18:00
- Localização: Natal-RN / Parelhas(RN) / Natal(RN)
- Contato:
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?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Tche, a tempo atras jah postei exemplos.....sempre de uma pesquisada no Forum antes de Postar.....segue abaixo exmplos de uso da CDX:Gilberto M Silva escreveu:Caros Colegas, Postem uma função usando CDX, pois estou querendo mudar de NTX para indices CDX.
Obrigado.
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")
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
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
...
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
....
Espero que entenda...os exemplos se tiver alguma duvida posta aqui e resolveremos..
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
O NG da SIX explica bem esse mecânismo de abertura.sygecom escreveu:Obs:Se não me engano se vc usar o DBF com o mesmo Nome do CDX ele se abre automaticamente
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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.Maligno escreveu:O NG da SIX explica bem esse mecânismo de abertura.sygecom escreveu:Obs:Se não me engano se vc usar o DBF com o mesmo Nome do CDX ele se abre automaticamente
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql