Clipper On Line • Ver Tópico - Trocar de NTX pra CDX

Trocar de NTX pra CDX

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 16:54

Trocar de NTX pra CDX é relativamente simples.
As alterações dependem dos fontes.
Tem muita gente que faz coisa ERRADA, e nem sabe disso.
E importante, talvez, alterar uma coisa de cada vez, pra não ficar com o aplicativo parado a semana inteira, por exemplo.

Então vamos lá:

Qual a diferença básica do índice CDX?

CDX é um conjunto de índices que ficam dentro de um único arquivo CDX.
Você pode ter até 50 ordens diferentes, num único arquivo CDX.
Também é compactado, em rede é muito mais rápido que NTX, o índice pode ser acessado pelo nome, etc. etc. etc.
Como é tudo dentro de um mesmo arquivo, é lógico, cada ordem tem um nome interno, chamado TAG
E evita erros de programadores !!!! que causam índice corrompido !!!!

Só tem vantagens.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 16:58

Antes de começar, qual o erro comum dos programadores com NTX?

USE VENDAS
INDEX ON produto TO PRODUTO_VENDA
INDEX ON data     TO DATA_VENDA
INDEX ON nota   TO NOTA_VENDA

....
USE VENDAS
SET INDEX TO DATA_VENDA


É comum abrir só o índice que precisa.
ISSO É ERRADO.

USE VENDAS
SET INDEX TO PRODUTO_VENDA, DATA_VENDA, NOTA_VENDA
...
USE VENDAS
SET INDEX TO DATA_VENDA, PRODUTO_VENDA, NOTA_VENDA


É comum também abrir em ordem diferente.
ISSO É ERRADO

Porque isso tudo é errado?

Ao alterar o conteúdo do DBF, os índices são atualizados.
Lógico... se não estiver aberto, não vai ser atualizado.

O programa segue a ordem dos índices pra fazer as atualizações.
Por mais rápido que seja, uma ordem diferente de outro terminal vai causar atualização fora de ordem.
Um terminal pode interpretar isso como índice corrompido, porque um está diferente do outro

Como no CDX fica tudo junto, SEMPRE vai abrir todos os índices, e SEMPRE na mesma ordem.
Só isso já reduz muitos problemas de índice corrompido.

Dependendo do tamanho do aplicativo, pode ser mais interessante primeiro corrigir essa parte, antes de partir para o CDX.
Se o aplicativo funcionava do jeito errado, então vai continuar funcionando se alterar para o jeito certo.

Fazendo do jeito certo, provavelmente vai estar usando SET ORDER TO 1, SET ORDER TO 2, SET ORDER TO 3, etc.
ISSO TAMBÉM FUNCIONA NO CDX.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 17:18

Um problema em alterar aplicativo existente é que nem sempre dá tempo de alterar tudo de uma vez.
A boa notícia é que dá pra fazer por etapas, um pouco de cada vez.
A má notícia, é que num determinado momento, é tudo de uma vez, e depende dos fontes pra facilitar.

Uma coisa que uso há muito tempo é uma rotina pra abrir arquivos.
Ao invés de colocar em todo fonte

USE cliente
SET INDEX TO cliente1, cliente2, cliente3
USE produto
SET INDEX TO produto1, produto2, produto3


Dá pra simplificar usando uma função;

IF ! AbreArquivos( "cliente", "produto" )
   RETURN
ENDIF


E na função, abre os arquivos e índices.
Isso também ajuda a abrir sempre todos os índices, e na ordem certa.
Também ajuda a colocar mais checagens/testes pra ver se deu problema na abertura.

Uma função do Harbour pode facilitar isso.

FUNCTION AbreArquivos( ... )

   LOCAL cDBF, lTudoCerto := .T.

   aList := hb_AParams()
   FOR EACH cDBF IN aList
      lTudoCerto := AbreUmDBF( cDBF )
      IF ! lTudoCerto
         EXIT
      ENDIF
   NEXT
   IF ! lTudoCerto
      CLOSE DATABASES
      Mensagem( "Não conseguiu abrir todos" )
   ENDIF
   RETURN lTudoCerto


Função relativamente simples, recebe uma lista, e testa se conseguiu abrir cada um.
Uma coisa interessante é: se não conseguiu, já fecha tudo, já que não adianta com arquivo faltando.

Agora a função pra abrir um arquivo....
Essa cada um vai ajustar para as rotinas que tem hoje.
É só um exemplo.

FUNCTION AbreUmArquivo( cDBF )

   cDBF := Lower( cDBF )
   DO CASE
   CASE cDBF == "cliente"
      USE cliente
      SET INDEX TO cliente1, cliente2, cliente3
   CASE cDBF == "produto"
      USE produto
      SET INDEX TO produto1, produto2, produto3
   OTHERWISE
     RETURN .F.
   ENDCASE

RETURN .T.


Acima só uma rotina básica como exemplo.
O único teste é ver se o nome está na lista.
Pode acrescentar teste se arquivo existe, se índice existe, se deu problema de abertura, etc.

Facilita porque depois, pra trocar pra CDX, basta alterar essa rotina.

Nota: Lógico, tem gente que já usa esquema desse tipo há muito tempo, mas tem gente que ainda não.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 17:33

Criação de índice:

O NTX é identificado pelo nome físico do arquivo em disco.
O CDX tem o nome físico em disco, mas também tem um nome interno pra cada indice.

Vamos aproveitar essa vantagem.

Em NTX:

USE VENDAS
INDEX ON COD_CLI + DTOS( DAT_EMI ) TO VEND_CLI
INDEX ON COD_PRO + DTOS( DAT_EMI ) TO VEND_PRO
INDEX ON DTOS( DAT_EMI ) + COD_CLI TO VEND_DATA


Em NTX os índices vão se chamar VEND_CLI.NTX, VEND_PRO.NTX e VEND_DATA.NTX
Vai acessar cada um por SET ORDER TO 1, SET ORDER TO 2, SET ORDER TO 3

Em CDX:
USE VENDAS
INDEX ON COD_CLI + DTOS( DAT_EMI ) TAG CLIENTE
INDEX ON COD_PRO + DTOS( DAT_EMI ) TAG PRODUTO
INDEX ON DTOS( DAT_EMI ) + COD_CLI TAG DATA


Em CDX, o índice pode se chamar VENDAS.CDX
Se é só um índice, pra que ficar inventando nome diferente?
Os nomes INTERNOS dos índices vão ser CLIENTE, PRODUTO, DATA, tudo nome simples, pra que complicar?
A não ser que precise deixar o nome anterior, pra facilitar pelos fontes.... aí pode usar o nome que usava pra NTX
Vai poder acessar de duas formas: SET ORDER TO 1, SET ORDER TO 2, SET ORDER TO 3
ou... pela tag...: OrdSetFocus( "cliente" ), OrdSetFocus( "produto" ), OrdSetFocus( "data" )
Vantagem: não importa a ordem dos índices, vai pegar pelo nome.
Muito bom pra adicionar/remover índices sem ter que mexer nos fontes.

Mas... pode acontecer do aplicativo ser gigante, e não poder alterar todos os fontes de uma vez, pode ser que demore semanas....
Tem o plano B...
INDEX ON COD_CLI + DTOS( DAT_EMI ) TAG CLIENTE TO VEND_CLI
INDEX ON COD_PRO + DTOS( DAT_EMI ) TAG PRODUTO TO VEND_PRO
INDEX ON DTOS( DAT_EMI ) + COD_CLI TAG DATA TO VEND_DATA


Neste caso, igual NTX, vai criar os arquivos VEND_CLI.CDX, VEND_PRO.CDX, VEND_DATA.CDX
Faça isso como forma temporária, se precisar compatibilidade com os fontes.
Vai funcionar SET ORDER TO 1, 2, 3 ou OrdSetFocus( "CLIENTE" ) etc. do mesmo jeito, não importa que são arquivos separados.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 17:39

Na criação de índices é assim, no uso é.... igual NTX, mas só um CDX.

Em NTX:

USE VENDAS
SET INDEX TO VEND_CLI, VEND_PRO, VEND_DATA


Em CDX:

USE VENDAS
SET INDEX TO VENDAS


Existe a opção de abertura automática.
Bastaria USE VENDAS e nada mais, que o índice abre automático.
Isso é ruim no caso de índice corrompido, porque pode nunca mais conseguir abrir o DBF se não existir um índice criado e funcionando.
Acho melhor abrir primeiro o DBF, e depois os índices.

Convém destacar uma coisa: o conteúdo do CDX NÃO é apagado.

USE VENDAS
INDEX ON COD_CLI TAG CLIENTES
INDEX ON COD_CLI TAG CLIENTES
USE VENDAS
INDEX ON COD_CLI TAG CLIENTES
INDEX ON COD_CLI TAG CLIENTES


No caso de fazer isso, serão criados QUATRO índices dentro do CDX.
Não dá problema na execução, mas o CDX vai ficando cada vez maior, enchendo de lixo.
Então... numa reindexação, é recomendado primeiro apagar o CDX, e depois criar do zero.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Trocar de NTX pra CDX

Mensagempor JoséQuintas » 19 Ago 2020 17:50

Acho que é isso.

Cada um pode seguir uma ordem diferente pra fazer a migração, conforme os próprios fontes.

Se usa SET ORDER ou SET INDEX, se abre tudo de uma vez, ou um arquivo por vez, etc.

O CDX pode ter mais recursos, que não tem no NTX, mas isso não é importante na migração.
Limite máximo do CDX: 50 índices POR arquivo CDX, se precisar de mais que isso, é criar mais arquivos CDX.

Esqueci de dizer:
Um arquivo CDX conta como sendo um único arquivo, mesmo que tenha 50 índices dentro.
Para o Clipper... com limite de 250 arquivos... reduzir arquivos de índice com CDX era outro ponto forte.
Para o Windows... melhor também... menos arquivos, menos trabalho pro Windows controlar.

Nota:
Hoje entrou em contato um usuário que está começando a fazer a migração.
Aproveitei pra deixar aqui, assim ajuda mais pessoas.

À primeira vista, transformar vários índices em um só, ainda é confuso.
Aqueles erros comuns ainda existem, e abrir arquivo em tudo que é fonte ainda existe também.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14679
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 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