Clipper On Line • Ver Tópico - Migrar de NTX para CDX. Como proceder ????

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

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

Moderador: Moderadores

 

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

Mensagempor Clash » 28 Fev 2014 13:47

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor Clash » 28 Fev 2014 14:44

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor rochinha » 01 Mar 2014 02:41

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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4548
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 808 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor sygecom » 03 Mar 2014 22:34

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
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: 7020
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

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

Mensagempor Clash » 05 Mar 2014 18:03

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor Clash » 05 Mar 2014 18:06

E muito obrigado, sygecom, pela dica, vou estudá-la também.
Avatar de usuário

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor Clash » 05 Mar 2014 18:16

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor Clash » 05 Mar 2014 18:41

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor rochinha » 05 Mar 2014 23:28

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"
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4548
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 808 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor Clash » 06 Mar 2014 22:04

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

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

Mensagempor rochinha » 07 Mar 2014 02:27

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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4548
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 808 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor Clash » 27 Mar 2014 12:43

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

Clash
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 11 Set 2004 11:14
Cidade/Estado: Divinópolis (MG)
Curtiu: 46 vezes
Mens.Curtidas: 2 vezes

Anterior



Retornar para Banco de Dados

Quem está online

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