Clipper On Line • Ver Tópico - CDX x dbsetorder()

CDX x dbsetorder()

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

CDX x dbsetorder()

Mensagempor Mário Isa » 18 Jul 2007 19:58

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 de usuário

Mário Isa
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 902
Data de registro: 07 Jul 2004 13:54
Cidade/Estado: Ilha Solteira-sp
Curtiu: 5 vezes
Mens.Curtidas: 8 vezes

Mensagempor Eolo » 18 Jul 2007 21:02

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...
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Mensagempor Mário Isa » 18 Jul 2007 21:11

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 de usuário

Mário Isa
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 902
Data de registro: 07 Jul 2004 13:54
Cidade/Estado: Ilha Solteira-sp
Curtiu: 5 vezes
Mens.Curtidas: 8 vezes

Mensagempor Eolo » 18 Jul 2007 21:28

Sim, poste a sua função.
Se alguém tiver o mesmo problema, pode ajudar!
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Mensagempor sygecom » 19 Jul 2007 08:25

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

Mensagempor Eolo » 19 Jul 2007 08:33

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 de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Mensagempor sygecom » 19 Jul 2007 08:44

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

Mensagempor alaminojunior » 19 Jul 2007 16:21

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 de usuário

alaminojunior
Colaborador

Colaborador
 
Mensagens: 1689
Data de registro: 16 Dez 2005 20:26
Cidade/Estado: Ubatuba - SP
Curtiu: 27 vezes
Mens.Curtidas: 11 vezes

Mensagempor vagucs » 20 Jul 2007 10:35

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 de usuário

vagucs
Membro Master

Membro Master
 
Mensagens: 1466
Data de registro: 10 Jul 2004 10:45
Cidade/Estado: Ipanema - MG
Curtiu: 1 vez
Mens.Curtidas: 19 vezes

Mensagempor Maligno » 20 Jul 2007 10:44

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 de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor Gilberto M Silva » 21 Jul 2007 14:26

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 de usuário

Gilberto M Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 230
Data de registro: 13 Mar 2007 18:00
Cidade/Estado: Natal-RN / Parelhas(RN) / Natal(RN)
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Maligno » 21 Jul 2007 15:27

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 de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor sygecom » 21 Jul 2007 16:43

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:
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
RDDSETDEFAULT("_DBFCDX")
DBSETDRIVER("DBFCDX")


Para criar indice:
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:
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:
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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

Mensagempor Maligno » 21 Jul 2007 17:08

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 de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor sygecom » 21 Jul 2007 20:38

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro