CDX x dbsetorder()

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

CDX x dbsetorder()

Mensagem 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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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...
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Mensagem 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.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Sim, poste a sua função.
Se alguém tiver o mesmo problema, pode ajudar!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem 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
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem 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?
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'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!
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

Caros Colegas, Postem uma função usando CDX, pois estou querendo mudar de NTX para indices CDX.
Obrigado.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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?
[]'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!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'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!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder