Clipper On Line • Ver Tópico - Migrar de NTX para CDX. Como proceder ????
Página 1 de 3

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mai 2008 10:10
por SandroBelarmino
Olá galera do Clipper On Line, tenho uma aplicação rodando com alguns DBF's um pouco grande, e estou tendo muito problema com os índices NTX, e sei que o CDX é mais seguro e tambem mais rápido. Estou usando Clipper 5.3 e Blinker 7.0 e gostaria de saber se a mudança para o CDX é muito complexa. Algumas dúvidas que tenho:
1-O que eu preciso mudar no codigo do programa e no arquivos lnk que linka o programa?
2-Eu uso para um mesmo dbf vários indices, que pode ser por codigo, nome, grupo etc, portanto para um arquivo de cliente por exemplo eu posso ter vários NTX e dentro do programa eu uso o SET ORDER TO para fazer as consultas, e sei que no CDX eu posso ter só 1 arquivo com várias chaves nele, porem eu poderia continuar usando o SET ORDER TO normalmente ou teria que mudar isso tambem? Ou será que eu posso continuar a criar 1 arquivo CDX para cada chave que uso? Qual seria a diferença entre essas 2 maneiras?
Sabendo que posso contar com a costumeira atenção de todos, já agradeço.
Muito Obrigado e um forte abraço a todos.
Sandro

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mai 2008 10:34
por Toledo
Sandro, veja abaixo uma dica que está no meu site:

O RDD DBFCDX

Esse RDD permite a criação e manutenção de arquivos de dados e índices do FoxPro2.

Principais características:

Os índices .CDX do FoxPro são bem menores do que os .NTX criados pelo Clipper.

Cria índices condicionais através das cláusulas FOR, WHILE, REST e NEXT.

Cria arquivos de índices compostos que contém até 99 subíndices ou TAGS em um único arquivo reduzindo, assim, o número de arquivos abertos em nível do DOS.

Como o Clipper permite apenas 15 arquivos associados e abertos com a área atual, o uso dos arquivos CDX permite a abertura de mais arquivos de índices sem sobrecarregar o número de arquivos que o DOS manipula.

Para que o RDD DBFCDX funcione corretamente, devem ser seguidos os seguintes passos:

1 - Acrescente as linhas abaixo no início do seu programa principal:

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")

2 - Para criar os arquivos de índices, você deve usar o seguinte comando:

SELECT 1
USE CLIENTES
INDEX ON codigo TAG indice1 TO cliente1
INDEX ON nome TAG indice2 TO cliente1

Observe que cada campo chave tem um TAG diferente (indice1 e indice2), mas todos estão sendo direcionados para um mesmo arquivo (cliente1), com isto será criado um arquivo de índice chamado CLIENTE1.CDX, com dois subíndices, um indexado pelo código do cliente e outro pelo nome do cliente.

3 - Para mudar a ordem em um arquivo de índice CDX, você deve proceder da seguinte forma:

ORDSETFOCUS("INDICE2")

Com este comando você vai selecionar o subíndice "INDICE2", que está indexado pelo campo nome do cliente.

ORDSETFOCUS("INDICE1")

Retorna ao subíndice principal, que está indexado pelo campo código do cliente.

Se o comando ORDSETFOCUS( ) não for especificado, a ordem será sempre a do primeiro subíndice criado, neste caso será o indice1, pelo código.

4 - Para linkar um programa com o RDD DBFCDX, deve ser acrescentada a LIB DBFCDX durante o processo de linkagem:

RTLINK FI teste LIB DBFCDX

5 - Os comandos abaixos continuam sendo usados da mesma forma:

SET INDEX TO - Abre um arquivo de índice.
CLOSE ALL - Fecha todos os arquivos de dados e índices associados.

Abraços,

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mai 2008 10:48
por SandroBelarmino
Bom dia Toledo,
Antes de mais nada, muito obrigado pela ajuda, só gostaria de esclarecer 1 dúvidas:
- Eu usando o índice composto em 1 único arquivo cdx para vários subindices eu teria que alterar em todos os meus códigos onde eu uso o set order to para ORDSETFOCUS() correto? como são vários programas com muitas linhas de código, tambem daria certo se eu criasse 1 arquivo CDX para cada chave de pesquisa?

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mai 2008 11:52
por Toledo
Sandro, você pode continuar usando o SET ORDER TO sem problema algum.

O ORDSETFOCUS() e SET ORDER TO é a mesma coisa.

Exemplo:
SELECT 1
USE CLIENTES
IF !FILE("CLIENTE1.CDX")
  INDEX ON codigo TAG indice1 TO cliente1
  INDEX ON nome TAG indice2 TO cliente1
ENDIF
SET INDEX TO CLIENTE1

SET ORDER TO 2  //muda para o índice ordenado pelo nome


Abraços,

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mai 2008 21:40
por rochinha
Amiguinhos

Só um alerta,

Para que voce tenha exito nesta empreitada, caso tenha problemas, os quais não lembro para citar, sugiro, criar as estruturas ja usando o RDD CDX e importar os dados de seus arquivos.

Lembro que antes de optar por usar CDX usei por muito tempo a SUBNTX, pois CDX nos brinda com uma fantastica caracteristica de filtragem diretamente nos indices, enquanto que no NTX a filtragem só ocorre no DBF e portanto usava a SUBNTX.

Ao passar a usar CDX somente tive de desfazer dos parametros SET INDEX TO blablabla1, ..., blablabla15 acho até que nem é preciso usar SET INDEX ou USE ... INDEX, pois se o indice possuir o mesmo nome do DBF o CDX se encarrega de abri-lo, mas para não perder o costume e cair na preguiça da digitação use o trivial.

Em relaçao as estruturas dos arquivos criados com NTX e CDX, existe, uma pequenina inconveniencia que poderá fazer seu programa dar pau no comando USE, portanto, crie as estruturas em CDX e importe.

Boa sorte.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 08 Mai 2008 11:37
por SandroBelarmino
Rochinha, antes de mais nada obrigado pela ajuda.

Sou totalmente leigo em relação ao CDX, então me desculpe se estiver fazendo alguma pergunta um tanto quanto 'besta' , mas como eu faço para criar as estruturas em CDX ?
Será que eu posso usar o GDBU para isso ou existe algum outro programa para fazer isso?

Obrigado e forte abraço.

Sandro

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 08 Mai 2008 13:44
por Pablo César
Sobre como criar os arquivos CDX, se você intruiu no seu código para abrir o RDD:

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
DBSETDRIVER("DBFCDX")

Você aqui está já definindo que TODA indexação irá ser mediante o CDX e ao INDEXAR o sistema irá criar sozinho em vez de NTX irá criar os CDXs.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 08 Mai 2008 18:00
por Toledo
Sandro, segue abaixo um DBU que aceita tanto NTX como CDX, então quando você for criar os banco de dados para serem usados com o RDDCDX, escolha a opção FoxPRO na abertura do DBU.

DBU para CDX

Abraços,

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 19 Set 2008 15:15
por SandroBelarmino
Boa tarde galera !!!

Descuple voltar nesse assunto novamente, já estou fazendo alguns testes com o CDX, já coloquei os comandos

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
DBSETDRIVER("DBFCDX")

no programa, já fiz as rotinas de indexação usando o CDX e estou acertando os set order da vida, estou substituindo o campo memo que tenho em um cadastro por outro recurso, etc...

É que vou implantar o programa alterado no meu cliente e não quero correr o risco de ter alguma surpresa e deixar meu cliente parado, e estou com uma pulga atrás da orelha:
O amigo Rochinha disse:
rochinha escreveu:Só um alerta,
Para que voce tenha exito nesta empreitada, caso tenha problemas, os quais não lembro para citar, sugiro, criar as estruturas ja usando o RDD CDX e importar os dados de seus arquivos.


Minha pergunta é: basta eu simplesmente alterar o programa para o RDD CDX e criar os novos indices CDX com os meus DBF's que já tenho no sistema, ou eu preciso recriar todos os arquivos DBF com esse RDD e depois importar dos arquivos antigos ???

Novamente, desculpem minha ignorância e meu medo, mas é que nunca usei esse RDD e quando for implantar no cliente, ele precisa continuar rodando com o programa sem termos surpresas, pois não teremos tempo pra ficar procurando respostas e tentar ficar solucionando supostos problemas que possam ocorrer.

Valeu pela força.

Forte abraço.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 19 Set 2008 22:48
por Toledo
Alessandro, o interessante seria recriar todos os arquivos novamente, principalmente aqueles em que existe campos memos, com o pradão CDX os arquivos DBT mudam para FPT.

Dê uma olhada nesta mensagem:
viewtopic.php?p=19134#p19134

Abraços,

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 19 Set 2008 23:56
por Pablo César
Toledo escreveu:Alessandro, o interessante seria recriar todos os arquivos novamente, principalmente aqueles em que existe campos memos, com o pradão CDX os arquivos DBT mudam para FPT.
Ops, pelo que eu entendí o Alessandro vai substituir todos os campos do tipo MEMO para outro recurso. Imagino que ele venha adotar aquele que eu tenho indicado em outros tópicos. Pois eu sempre fui em contra desse tipo de campo (dá muito fragmentação e muita dor de cabeça porque demanda muita manutenção nos DBFs), já não é assim com a criação de arquivos textos compondo os nomes de arquivos com uma sigla+código_cliente (por exemplo).

Alessandro, se você está recioso em migrar para CDXs, aconselho você primeiramente finalizar essa mudança dos campos memos e usando NTXs como vinha usando. Logo que estiver funcionando bem a questão de leitura/gravação dos campos em arquivo texto, você faz uma cópia para outra pasta e adota a utilização do CDXs. Daí vai para o seu cliente com as duas cópias (duas versões) do seu sistema e deixe rodar com CDXs, até você perceber que está tudo beleza. Se ficou alguma coisa a resolver, daí é só substituir seu sistema com a versão NTX. Belé ?

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 22 Set 2008 13:26
por SandroBelarmino
Valeu pela força galera !!!

Já estou testando as mudanças aqui.

Pablo, em relação aos campos memos, eu usava no cadastro de clientes, porém eu fiz o seguinte, criei um dbf com 2 campos, o codigo do cliente e um campo texto C 78,0. Então, cada linha que havia no campo memo eu gero um registro nesse arquivo. Só deu um certo trampo pra fazer a rotina de digitação desse campo, pois tive que deixá-lo aberto com se fosse um texto, igual ao memoedit() mas no final das contas deu tudo certo, e com a vantagem do usuário nao precisar tecla CTRL+C para gravar o texto digitado, o que já vinha sido motivo de várias reclamações pois o cidadão digitava um livro no campo e dava esc para sair da tela de digitação, e nisso, bye bye texto.

Enfim, obrigado pela força em mais essa empreitada, e agora é aguardar pra quando eu colocar em produção pra valer essas mudaças.

Forte abraço e sucesso a todos !!! :-)

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 22 Set 2008 15:46
por sygecom
Sandro,
Sobre uma das suas duvidas.
Você não prescisa recriar os DBF pode usar os mesmo que usa com NTX.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 22 Set 2008 16:05
por Pablo César
Você não prescisa recriar os DBF pode usar os mesmo que usa com NTX.
Acho que você não entendeu Leonardo (não leu por completo a indicação toda). Ele comentou que precisou criar um DBF para poder substituir o campo do tipo MEMO que possuia. Mas por outro lado, eu também tenho a dizer que não havia necessidade de criar outro dbf para esse fim. Bastava fazer uma vinculação de registro com o nome do arquivo texto a ser gerado. Por exempo: se eu tenho um cadastro de clientes, que possui código do cliente e o usuário/operador quiser fazer uma observação como é feito no campo MEMO, sito é, atarvés do MEMOEDIT. Bastava só chamar uma função que abrisse o nome de cada arquivo com a numenclatura de cada código de cliente.

Agora se seus usuários tinha dificuldade na finalização da edição do texto, porque esqueciam de gravar ou porque tinham que pressinar Ctrl W, bastava fazer um SETKEY ESC para a função GRAVAR ou até então poderia também fazer que logo que fechasse o MEMOEDIT verificasse se a variável de retorno do MEMOEDIT estivera diferente do arquivo, daí poderia também pergunta se deseja gravar. Para mim este procedimento é uma mão na roda. E desculpem mas todo este assunto NÃO tem a ver como CDX e sim com campos MEMOS, falei disto porque o colega mencionou um dos seu problemas. E o qual eu acho que seria bom tratar antes de fazer a migração de NTX para CDX.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 22 Set 2008 21:59
por sygecom
Veja a duvida do Colega abaixo.
SandroBelarmino escreveu:Minha pergunta é: basta eu simplesmente alterar o programa para o RDD CDX e criar os novos indices CDX com os meus DBF's que já tenho no sistema, ou eu preciso recriar todos os arquivos DBF com esse RDD e depois importar dos arquivos antigos ???

Sobre os campo MEMO já tinha sido respondido. No caso seria somente recriar os que cotem campo MEMO e recriar os indice e correr pra galera.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 23 Set 2008 07:44
por SandroBelarmino
Bom dia galera !!!!
Toda parte de indexação dos arquivos já está pronto e funcionando legal, já estou finalizando e testando as rotinas de cadastros, pois como eu usava NTX eu abria vários indices no set index, e as vezes, na ordem que ficasse mais comodo dentro da rotina que iria usar, por exemplo, no cadastro de clientes, eu tinha ind1,ind2,ind3,ind4 e dependendo da rotina que ia usar, no set index eu nao abria obrigatóriamente nessa ordem, e até as vezes abria somente o indice que eu iria usar, por isso estou tendo que fazer esses ajustes, tanto na abertura do indice, pois agora estou abrindo somente um CDX com várias TAGs e tambem estou tendo que ajustar os set order nas rotinas, por isso está levando um bom tempo.
Mas como eu disse a parte do cadastro já está pronto e estou finalizando os testes, agora já vou partir pra parte de movimentação no módulo de Pedido/Faturamento e depois fazer os módulos restantes.
Estou postando essa mensagem para dar uma posição de como está o andamento, pois afinal de contas, esse trabalho está andando graças a ajuda de todos voces !!! :{

Grato a todos pela atenção, e podem ter certeza, que assim que o sistema todo estiver rodando no cliente, posto outra mensagem dizendo como foi o resultado de tudo isso.

Forte abraço e sucesso a todos. :)Pos

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 23 Set 2008 10:35
por SandroBelarmino
Em tempo,

Uma coisa que percebi na indexação do arquivos é que, se eu primeiro abrir o dbf e verificar se nao ocorreu nenhum erro (neterr()) pra depois apagar o cdx, eu não consigo apagar o cdx, pois quando eu abro o dbf, automaticamente o cdx já é aberto pois tem o mesmo nome do dbf, entao ao fazer o index to meu cdx vai aumentando de tamanho. O que eu fiz foi na rotina de indexação, primeiro tentar apagar o cdx e se obtver êxito, ai sim eu abro o dbf e faço a indexação. :-´

Até mais.

Arquivos de Indices

MensagemEnviado: 23 Set 2008 10:51
por Pablo César
Sandro,

Alegro-me que seu sistema esteja tomando outro rumo, motivado pelo CDX. Só gostaria de esclarecer um ponto muito importante que você mencionou:
até as vezes abria somente o indice que eu iria usar
A nível de esclarecimento, espero que ja seja conhecimento de todos. Quando temos vários arquivos de índices, é fundamental para sua atualização que vocês abra TODOS os índices do DBF que irás usar em modo ESCRITO. Modo escrito, me refiro sempre que seu sistema venha a fazer qualquer atualização no DBF. Seja inserir novo registro, alterar registro ou atés mesmo deletar. Pois se você não for abrir todos os índices de tal DBF, estes irão ficar DESATUALIZADOS. Desculpem fazer ênfase das palavras, mas é um assunto relevante que precisa ser considerado.

Se você em determinado módulo (não que eu esteja afirmando que você faz, Sandro) você abrir um DBF com alguns (não TODOS) indices e fizeres um replace no DBF, os outros índices desse DBF irão ficar desatualizados e você terá que forçar uma re-indexação, o que esta prática causa um certo trastorno, principalmente se o sistema estiver em rede.

Este conceito, serve tanto para NTXs como para CDXs. Não cometa esse erro.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 23 Set 2008 11:41
por SandroBelarmino
Pablo,
Agradeço a ajuda, e tenha certeza que a preocupação é muito válida, pois eu quando comecei no clipper cometi muito esse erro, de abrir somente os ntx que iria usar em pesquisa e fazer atualização de dbf, deixando assim outros indices desatualizados. Porém, em nossos programas hoje, qdo eu disse que as vezes abria somente alguns ntx, isso é somente quando nao vou fazer atualização no dbf, ou seja, somente em consultas, relatorios, etc...

Abraço.

Sandro

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 23 Set 2008 12:33
por sygecom
Olá Pablo,
Esse tipo de preocupação que vc citou em CDX passa ser desnecessario, sendo que quando vc abre um DBF e tiver usar o SET AUTOPEN ON ele abre o CDX automatico junto com o DBF não prescisando esquentar a cabeça se esta abrindo ou não o indice, e se tiver usando o SEU AUTOOPEN OFF , assim mesmo vc vai abrir um unico INDICE que onde se encontra todas as TAG ou seja, é um unico indice com varios indice dentro, sendo assim todos sempre vão esta Atualizados, trabalhar com CDX é tudo de bom.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 23 Set 2008 15:12
por Pablo César
Obrigado Leonardo pelo seu esclarecimento. Então o CDX cuida automaticamente que sejam aberto todos os indices correspondente ao DBF. Sendo assim o conceito é o mesmo, cuidar que os indices todos sejam atualizados. Legal o esclarecimento.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 30 Nov 2009 01:18
por lugab
Pessoal, eu Converti meus DBFs pelo Xharbour, para migrar de NTX para CDX.

Agora eu preciso substituir meu DBASE3 (que não serve mais) , por um DBASE(n) que abra e manipule esses DBFs convertidos.

Alguém disponibiliza uma cópia para mim ?

Grato,

Gabriel

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 30 Nov 2009 07:37
por alaminojunior
Pablo César escreveu:Então o CDX cuida automaticamente que sejam aberto todos os indices correspondente ao DBF

Lembrando....desde que o arquivo de índice tenha o mesmo nome do arquivo de dados.

Gabriel, procure na net sobre OurXdbu. É muito interessante.

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 30 Nov 2009 08:35
por Dr.Microso
Gabriel, salve!

Creio que os utilitários abaixo irão lhe atender com sobra no contexto de sua necessidade...
Os 2 primeiros são versões diferentes que correspondem a indicação do Alamino...

ourXdbu-1.5.2.0 http://www.4shared.com/file/149006629/b8400632/ourXdbu-1520.html?s=1
ourXdbu-1.1.0.0 http://www.4shared.com/file/149005655/ec027330/ourXdbu-1100.html
WinDBU.exe http://www.4shared.com/file/148701843/22f46615/WinDBU.html
Prometheus 2000 http://www.4shared.com/file/148703167/b277338a/Prometheus_2000__dbwIde__DBU_e.html

Um abraço!

Re: Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 30 Nov 2009 18:13
por lugab
Grato, Alamino e Dr.Microsol..

gabriel

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 11 Nov 2011 11:25
por Netavin
Caro Pablo.
Estou usando os mesmos DBF´s. Porém, os índices "CDX" não estão sendo criados e sim os "NTX".

Netavin

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 11 Nov 2011 12:56
por SandroBelarmino
Netavin escreveu:Caro Pablo.
Estou usando os mesmos DBF´s. Porém, os índices "CDX" não estão sendo criados e sim os "NTX".

Netavin


Como está sua rotina de Indexação? Coloque ao menos uma linha de como você está criando os índices.

E veja nessa resposta desse mesmo tópico que você precisa acrescentar 2 comandos no início do programa informando o RDD que vai usar.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 21 Nov 2011 14:38
por billy1943
Para quem quiser acrescer mais algum conhecimento sobre o assunto, outro tópico postado foi:

http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=11848

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 27 Fev 2014 16:34
por Clash
Amigos e Prof. Toledo, é muito bom ver essa comunidade tão viva. Passo tempo sem acessar, mas quando me deparo com certos obstáculos aqui é a salvação.
Migrei há muito tempo meu sistema principal para índices .CDX - sucesso total: memoria, agilidade, velocidade e principalmente recursos de filtragem pelos índices.
Bom... me ajudem com o seguinte cenário: --Uma Rotina de Contas a Receber--
-Em um modulo de Baixa(Quitação de Documentos), solicito o Código do Cliente (ou através de busca por nome, encontra o código).
-Criei uma cópia do arquivo do ct.receber (receber.dbf => ctrecsep.dbf) onde abro em modo exclusivo e executo Zap.
-Através do filtro .CDX executo Do While !Eof() e vou Adicionando (Append Blank) os registros no arquivo ctrecsep.dbf.
-Beleza até aí então. O operador de caixa executa a baixa informando valor e data pagos. Tranquilo.
-Na saída da rotina leio do inicio ao fim o arquivo ctrecsep.dbf e faço busca através do número do documento no arquivo principal (receber.dbf) executando REPLACE dos dados de registros que foram alterados, com o devido travamento de registros RLOCK(). Até aí tudo bem também.
-Acontece que após isso tudo executo: DBCOMMITALL(), DBCLOSEALL().
-Não é toda vez, mas as vezes na após isso apresenta um erro: DBFCDX 1210, as vezes no DBCOMMITALL, as vezes no DBCLOSEALL. Pesquisei sobre o erro no NortonGuide e informa que os Arquivos de índices e os arquivos de banco de dados estão fora de sincronia.
Já rodei meus .prg e nada que possa estar pela rede "desincronizando" isso.
Help.... Ajuda aí! Obrigado a todos.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 27 Fev 2014 18:46
por rochinha
Amiguinho,

Cada programador tem uma mentalidade em relação a formação de seu banco de dados e das rotinas de manutenção. Pelo que vejo voce criou esta metodologia de forma a suprir os problemas causados pelo mau uso dos registros pelos usuários.

Em meu sistema tenho vários campos para a data do registro(data, areceber, recebido,previsao), campo de valor principal, valor pago, juros, descontos, extras e campo flag para quitado ou não.

Minha sugestão é voce não usar outra tabela e sim permitir a manutenção direta no arquivo principal e se tiver de fazer retificação ficará mais facil limpar alguns campos e o registro volta ao normal.

A opção para restaurar este registro quitado erroneamente seria extorno e ela se encarregaria de limpar os campos que são usados no preenchimento da quitação.

Agora em relação ao problema relatado o que pode ocorrer é:

No momento que sua rotina esta executando a leitura, ao passar por um certo registro, que esteja travado em outra maquina, ao travar o registro, na verdade destrava o mesmo na outra maquina e sua rotina falha neste momento.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 28 Fev 2014 13:47
por Clash
Primeiramente, muito obrigado pela atenção Rochinha.
Eu utilizava o filtro no arquivo principal RECEBER.DBF pelos índices .CDX, mas algo estava travando o sistema, foi ai que tive a intenção de contornar esse e futuros problemas criando a cópia do arquivo (CTRECSEP). Ganhei até agilidade, mas surgiu o erro mencionado. Não tinha analisado a possibilidade que você citou.
No momento que sua rotina esta executando a leitura, ao passar por um certo registro, que esteja travado em outra maquina, ao travar o registro, na verdade destrava o mesmo na outra maquina e sua rotina falha neste momento.

Mas obrigado por ressaltar. Uma pergunta: Se eu criar um índice temporário, para filtrar os documentos do cliente selecionado, depois me desfazer deste arq.temp, afetará (erro) o índice principal?
Exemplo:
RECEBER -> receber.cdx
** Select 0
** Use RECEBER Shared New Alias RECEBER
** Index on VENCIMENTO TAG VENCTO to &tLocal\CTRECSEP For COD_CLIE = nCodClie
.. operações
.. operações
.. Na Saida simplesmente retornar ao Receber.Cdx

Funcionaria ? Obrigado desde já.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 28 Fev 2014 14:44
por Clash
Rochinha...

Estive analisando sua explicação e repensei... veja... não faz sentido ser problema de travamento de registro.
Pois se antes de executar o REPLACE eu texto com:
Select 0
Use RECEBER Shared New Alias RECEBER
Set Index to RECEBER
Go Top
*
Select 0
Use CTRECSEP Exclusiv New Alias SEPARADO
Index on VENCIMENTO TAG VENCTO TO CTRECSEP
Set Index to CTRECSEP
Go Top
*
... rotinas
...
... rotinas
...
//Na saída do modulo executo
*
Select CTRECSEP
Go Top
Do While !Eof()
     nNroDoc = DOCUMENTO
     Select RECEBER
     Seek nNroDoc
     If Found()
        Do While .t.
             If RLOCK()
                Replace DATAPAGO   with SEPARADO->DATAPAGO
                Replace VALORPAGO with SEPARADO->VALORPAGO
                Replace QUITADO     with  SEPARADO->QUITADO
                Exit
              Else
                Mensagem("Registro não disponível. Tentando novamente...",2)
             EndIF
        EndDo
      Else
           Mensagem("Documento não encontrado.",2)
     EndIf
     Select SEPARADO
     Skip
EndDo
DBCommitAll()
DBCloseAll()


Então, se o registro estivesse ocupado em outro terminal, ele ficaria tentando a liberação do mesmo para executar os Replace´s, nesta forma, como posso estar violando a sincronização (Base com Índices) se apenas executo Replace em campos que não indexados?
(Ta osso, hehehe)
Obrigado.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 01 Mar 2014 02:41
por rochinha
Amiguinho,

Após o inicio do uso de indices em tabelas voce fica proibido de NÃO USÁ-LOS caso queira manter a ordem.

Supondo que voce criou o indice IDPEDIDO para manter em ordem os numeros de pedidos e vez ou outra voce cria um indice temporário para filtragem e manutenção, os dois indices devem ser ativados:
...
USE pedidos SHARED NEW
SET INDEX TO pedidos // Indice que mantem ordem pelo campo IDPEDIDO
...
// Filtragem temporária
INDEX ON dataped FOR idcliente = 123 TO pedicli
SET INDEX TO pedidos,pedicli // Novo indice sendo vinculado
SET ORDER TO pedicli // Ativa pela ordem do indice temporário
...
// Faz sua rotina
...
SET INDEX TO pedidos // Religa indice inicial
SET ORDER TO pedidos // Ativa pela ordem do indice padrão


O exemplo acima l]ilustra muito bem como isto ocorre no padrão NTX, o qual os indices são separados podendo ser ligados num máximo de 15 indices por tabela.

O grande problema do caso acima é a constante criação de temporários e o acréscimo de linhas de programação.

Mas voce pode agilizar todo o trabalho, inclusive o de indexação, já que para indexar os arquivos devem estar bloqueados e isto é um problema.

Na sua rotina de indexação voce executa apenas uma vez:
...
USE pedidos SHARED NEW
INDEX ON pedidos TO pedidos
INDEX ON dtos(dataped)+strzero(idcliente,5) TO pedicli
...


Em sua rotina padrão voce:
...
USE pedidos SHARED NEW
SET INDEX TO pedidos,pedicli
...


Para agilizar o seu código já que voce usa .CDX voce não precisará mais criar arquivos temporário bastando apenas utilizar uma função especifica do RDD para este fim.
// Ordenado por IDPEDIDO
SELECT pedidos
// Pego o codigo de um cliente
nIDCLIENTE := PEDIDOS->IDCLIENTE
...
// Defino o periodo de filtragem
dDataIni := ctod("01/01/2014")
dDataFim := date()
...
SELECT pedicli
SET ORDER TO pedicli // Ordem pelo campo dataped + codigo do cliente
OrdScope(0, dtos(dDataIni)+strzero(nIDCLIENTE,5) )
OrdScope(1, dtos(dDataFim)+strzero(nIDCLIENTE,5) )
dbGoTop()
...


Não importa a quantidade de dados de sua tabela, a filtragem do ORDSCOPE() será instantânea.

Supondo que dentro da filtragem acima voce queira saber informações sobre um determinado item, exemplo:

Nas compras de Janeiro e fevereiro do cliente 123, qual a quantidade de itens do produto ABC123 ele levou?

Bastaria um SET FILTER:
// Ordenado por IDPEDIDO
SELECT pedidos
// Pego o codigo de um cliente
nIDCLIENTE := PEDIDOS->IDCLIENTE
...
// Defino o periodo de filtragem
dDataIni := ctod("01/01/2014")
dDataFim := date()
...
SELECT pedicli
SET ORDER TO pedicli // Ordem pelo campo dataped + codigo do cliente
OrdScope(0, dtos(dDataIni)+strzero(nIDCLIENTE,5) )
OrdScope(1, dtos(dDataFim)+strzero(nIDCLIENTE,5) )
// dbGoTop()
...
SET FILTER TO iditem = "ABC123"
dbGoTop()
...


Acho que agora voce tem conteúdo para uma série de melhorias.

Lembre-se o ORDSCOPE() trabalha muito bem se o filtro for compatível com a chave do indice.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 03 Mar 2014 22:34
por sygecom
rochinha escreveu:Lembre-se o ORDSCOPE() trabalha muito bem se o filtro for compatível com a chave do indice.

Com CDX tem também OrdWildSeek() que também tem resultados muito rápido.
http://www.pctoledo.com.br/forum/fileba ... t=c&page=1
viewtopic.php?f=4&t=13117&p=75513&hilit=OrdWildSeek#p75513

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mar 2014 18:03
por Clash
Rochinha, primeiramente, muitíssimo obrigado mesmo. Além de uma explicação clara e objetiva, realmente abriu meus horizontes...
Acho que agora voce tem conteúdo para uma série de melhorias.
Lembre-se o ORDSCOPE() trabalha muito bem se o filtro for compatível com a chave do indice


Já havia lido algo sobre "set scope" quando trabalhava com .NTX ainda, mas após migrar pro .CDX com indices sob clausulas, não mais pesquisei. Havia também um certo receio sobre lentidão, após muitos registros inseridos.
Mas confiei em sua explicação. Vou tentar hoje mesmo algumas modificações, primeiramente consertar essa rotina do Ct.Receber que não funciona bem ainda (Me tirando o sossego literalmente).
Gostaria de te pedir mais uma ajuda, se possível. Na verdade alguns esclarecimentos.
Na minha rotina, preciso "filtrar" todos os documentos do CLIENTE = 123, cujo o campo PAGO seja diferente de "Q" (quitado), para me trazer os registros abertos e pagos parcialmente (Campo PAGO = "P"). Então a operadora do financeiro irá executar a baixa destes documentos, parcial ou integral, onde meu sistema preencherá os campos, PAGO com Q ou P e VALORPAGO.
Minha tabela RECEBER está indexada da seguinte maneira:
Use RECEBER Exclusive NEW
If !NETERR()
   Pack
   Index on NOTA                             TAG NOTA       to RECEBER
   Index on DOCUMENTO                        TAG DOCUMENTO  to RECEBER
   Index on COD_CLIE                         TAG COD_CLIE   to RECEBER
   Index on DESCEND(DATA)                    TAG DATAINV    to RECEBER
EndIf
.
.
Na abertura da Tabela, apenas:
Select 0
Use RECEBER Shared New Alias RECEBER
Set Index to RECEBER
Go Top
.
.


Como poderia fazer a "filtragem" usando OrdScope, para trazer apenas os registros do Cliente = 123 .and. PAGO <> "Q", lembrando que nesta "filtragem" vou executar um Replace "Q" no campo Pago no final da rotina? Principalmente na questão ressaltada por você do filtro ser compatível com os indices.

Agradeço desde já, me desculpe se estou pedindo demais. Mas após sua explicação, que ainda sou muito cru na utilização de indices.

Obrigado mesmo e abraço a todos da comunidade.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mar 2014 18:06
por Clash
E muito obrigado, sygecom, pela dica, vou estudá-la também.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mar 2014 18:16
por Clash
Rochinha, desculpe as várias solicitações.
Tentei usar o OrdScope, mas na "linkedição" recebi uma mensagem do Blinker:
Blinker : 1115 : SCA008.OBJ : 'ORDSCOPE' : unresolved external

Preciso adicionar alguma biblioteca ao meu sistema além do .CDX ?
Uso Clipper 5.2e com Blinker 6.0

Obrigado.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mar 2014 18:41
por Clash
Rochinha, pesquisando no forum, percebi que na verdade OrdScope pertence ao Clipper 5.3

Poderia me orientar o que necessito instalar para migrar bem meu sistema Clipper 5.2e e Blinker 6 ?

Obrigado.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 05 Mar 2014 23:28
por rochinha
Amiguinho,

Já não me lembro muito bem, mas acho que sim, que OrdScope e CDX eram padrões da ersão 5.3 mesmo.

Para o Clipper 5.2 usar CDX era necessário agregar a biblioteca SIX2 para agregar o RDD para CDX e ela possue várias funções que depois foram agregados ao Clipper 5.2

Em 5.2 usei muito a biblioteca SUBNTX que ao contrario do INDEX ON que trabalha sobre a base de dados, criava um novo indice usando dados diretamente do NTX.

Abaixo transcrevo trecho de 2006 onde explano sobre estas caracteristicas:

Com Clipper 5.2 eu usei por muito tempo para minhas filtragens a SUBNTX. Ela trabalha sobre o indice atual, recebe os parametro passados por voce e faz a criação do novo indice retirando o que voce quer diretamente do indice. Pelos testes que fiz com ela em um .DBF com 100.000 registros, eu precisava filtrar 3 registros. Com SET FILTER demorou muito e com a SUBNTX levou menos de 2 segundos.

Usando INDEX ON também demorava demais até criar o indice.

Nos dois casos era necessário criar um arquivo extra e seta-lo junto aos indices abertos para que as modificações fossem inclusas em todos os indices.

Para isto era necessario sacar da funcao ordListAdd() para acrescentar o indice.

Para tal criei meu proprio comando que era basicamente assim:

SET SUBFILTER TO <xpr> [ON ORDER <SubOrder>] => ;
ordSetFocus( <SubOrder> ) ;;
M->SUBARQ := '_'+substr(ordName(),1,2)+substr(strtran(time(),":",""),4,3)+".NTX" ;;
SubNtx( ordBagName(), M->SUBARQ, <xpr> ) ;;
ordListAdd( M->SUBARQ ) ;;
ordSetFocus( M->SUBARQ )

Onde:

1- Eu setava o foco para SubOrder previamente aberta pelo USE...INDEX...
2 - Em M->SUBARQ dava um nome temporario para o novo indice
3 - Com SUBNTX gerava a filtragem dos registros
4 - Com ordListAdd() adicionava o novo indice no final da lista de indices
5 - Com ordSetFocus() fixava o foco no novo indice.

Ao final era necessário desvincular o indice da lista e resetar a lista para o original.

Ainda com Clipper 5.2 era possivel usar umas funções existentes no SIX2 que permitiam filtragem sobre indices de forma tão rápida quanto o SYBNTX que tinha o seguinte comando:

#command SET FILTER TO <x> SCOPED ;
=> if ( Empty(<(x)>) ) ;
; Sx_ClrScope( 0 ) ;
; Sx_ClrScope( 1 ) ;
; else ;
; Sx_SetScope( 0, <x> ) ;
; Sx_SetScope( 1, <x> ) ;
; end

Que funcionava mais ou menos assim:

USE ...
SET INDEX TO ...
SET ORDER TO ...
SET FILTER TO condicao SCOPED

Se voce apenas quizer usar esta função da SIX2 sem acrescenta-la como RDD basta acrescentar esta .LIB ao final da linha LIB de seu .LNK e usar diretamente as funções:

...
dbSetOrder( ... )
Sx_SetScope( 0, condicao )
Sx_SetScope( 1, condicao )
...

Ja no Clipper 5.3 o trabalho de filtragens com ESCOPO já é padrão usando-se para isto as a função OrdScope()
...
dbSetOrder( ... )
OrdScope( 0, condicao )
OrdScope( 1, condicao )
...


A biblioteca SUBNTX está disponivel na área de downloads do forum e serve para voce agregar ao seu sistema somente se ele usa NTX. A SIX2 pode ser agregada ao seu sistema e voce passará a criar indices em padrão diferente do NTX.

No seu caso, como voce cria um indice usando o codigo do cliente(COD_CLIE) voce pode usar OrdScope() para filtrar todos os registros do cliente e usar um SET FILTER padrão depois, a velocidade não será deteriorada pelo SET FILTER porque o resultado do OrdScope() é enorme.

Passar de 5.2e para 5.3 não será indolor, terá uns probleminhas referentes a sintaxe de pouquissimos comandos, mas não vale a pena. Vale mais a pena voce agregar a SIX2 ou SUBNTX e obter melhorias visiveis em termos de filtragens.

Voce também poderá verificar o tópico Super seleção de dados com ordenação dos registros. Basta excluir a linha #include "fivewin.ch"

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 06 Mar 2014 22:04
por Clash
Olá amigo Rochinha,

Novamente obrigado por enorme atenção. Fiquei MUITO impressionado com sua citação:
Nos dois casos era necessário criar um arquivo extra e seta-lo junto aos indices abertos para que as modificações fossem inclusas em todos os indices.

Uso índices temporários há muito tempo e nunca, jamais havia analisado o correto uso como vocês descreveu. Acredito porque a maioria dos clientes eram 2 a 3 terminais, agora implantei em um comércio com 8 terminais de venda e 6 administrativos, onde começaram os problemas de rede, o que me obrigou a melhorar o código.
Mas ontem mesmo, devido a grande necessidade de resolver o problema, porque o sistema estava em plena utilização com geração de erros, meu tempo estava curto, me interessei demais por sua explicação do OrdScope(), resolvi buscar o Clipper 5.3b usando a própria Blinker 6.0.
Não precisei alterar nada no código além dos novos índices de acordo com minha necessidade de filtragem e o .LNK, que ainda não analisei se está corretamente configurado, peguei de uma tutorial aqui do site.
Funcionou perfeito! Impressionante a velocidade, a integridade dos dados, parabéns parceiro, sua ajuda foi eficaz.
Mas agora lendo suas citações sobre o Clipper 5.2e e as bibliotecas SUBNTX e SIX2, vi quanta coisa poderia ter ganhado em meu sistema lido mais, pesquisado mais sobre isso.
Eu não usava o Set Filter nunca, por lentidão, mas agora ficou perfeito:
-Programa o OrdScope() no indice correto:
*Indice:
   Index on DTOC(VENCIMENTO)+STR(COD_CLIE,5,0) TAG CLI_VCTO   to RECEBER
*
*Código Baixa Ct.Receber:
*
Select RECEBER
If Empty(dDtaIni) .and. Empty(dDtaFim)
   ORDSETFOCUS("COD_CLIE")
   OrdScope(0, nCodClie )
   OrdScope(1, nCodClie )
Else
   ORDSETFOCUS("CLI_VCTO")
   OrdScope(0, DTOC(dDtaIni)+str(nCodClie,5,0) )
   If Empty(dDtaFim)
      OrdScope(1, DTOC(dDtaIni)+str(nCodClie,5,0) )
    Else
      OrdScope(1, DTOC(dDtaFim)+str(nCodClie,5,0) )
   EndIf
EndIf
*
*Agora uso o Set Filter para separar os Quitados.
*
Go Top
Set Filter to PAGO <> "Q"
Sum All VALOR to nAberto
Go Top
*
*..
*Rotinas
*..

Obrigado mesmo pelas dicas e conselhos Rochinha, mas agora vou tentar usufruir mais do Clipper 5.3.
Segue o minha configuração do .LNK, talvez você tenha sugestões.
Abraço.
BLINKER INCREMENTAL OFF
BLINKER CACHE EMS 75%,50%
BLINKER CACHE XMS 75%,50%
BLINKER LINK EMS ON
BLINKER LINK XMS ON
BLINKER EXECUTABLE NODELETE
BLINKER EXEC CLIPPER //DYNF:8 //F:254
BLINKER EXEC COMP 1
BLINKER EXEC EXTE
BLINKER MEMO PACK 20
BLINKER INCR PAD 256
BLINKER OVER PAGE ON
BLINKER OVER OPSI 60
BEGINAREA
FILE SCA
FILE SCA001
..
..
FILE SCA99RED
ENDAREA
Libr BLXCLP53,Dbfcdx,_dbfcdx

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 07 Mar 2014 02:27
por rochinha
Amiguinho,

Em time que tá ganhando não se mexe, mas se é possivel melhorar o ataque, melhore.

Com os novos jogadores em campo voce ganha agilidade, rapidez e segurança.

A regra é clara e o que importa é o resultado.

Migrar de NTX para CDX. Como proceder ????

MensagemEnviado: 27 Mar 2014 12:43
por Clash
Valeu demais pelo incentivo.

Desculpe na demora pelo agradecimento, mas foram muitos resultados extraordinários obtidos com a migração para o Clip53, uso de ordscope e o melhor tratamento do indices.

Obrigado MESMO!