Índice

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Suporte Soft
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 28 Mar 2011 00:36
Localização: Goiás

Índice

Mensagem por Suporte Soft »

Pessoal boa tarde!

Ainda tenho alguns problemas com quebra de índices, já sei que não é energia, então suponho que seja algum código que esteja fazendo isso.

Por favor me ajudem.

Uso uma rotina para abrir os DBF que verifica automaticamente se o DBF possuí índice e o abre juntamente.

Após incluir, alterar ou excluir um registro eu sempre uso um alias->(DbCommit())

uso índices temporários também... acho que o problema pode estar aqui.... mas ainda não o identifiquei. Nesse caso crio um .CDX temporário e após o uso sempre excluo o mesmo.

Se alguém tiver idéia de onde possa estar o problema por favor entrem em contato.

Obrigado.

Suporte Soft
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Índice

Mensagem por sygecom »

Sem postar codigo fica dificil, como esta usando para criar indice, alterar registros, indice temporario, e etc.....
Suporte Soft
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 28 Mar 2011 00:36
Localização: Goiás

Re: Índice

Mensagem por Suporte Soft »

Segue algumas partes do código:

Criando o índice:

Código: Selecionar todos

   If ! File("FLUXO.DBF")
      MsgBox1("Arquivo nÆo encontrado!")
      Return .T.
   EndIf
   nOpc := 0
   Do While nOpc <> 2
      Use fluxo Alias fluxo Exclusive
      If NetErr()
         nOpc := MsgBox2({"Arquivo em uso por outro usu rio!","Solicite que fechem o sistema."},,,"&Repetir","&Cancelar")
         If nOpc == 1
            Loop
         Else
            nOpc := 2
         EndIf
      Else
         Pack
         If File("FLUXO.CDX")
            FErase("FLUXO.CDX")
         EndIf
         Close fluxo
         Use fluxo Alias fluxo Exclusive
         nOpc := 2
      EndIf
   EndDo
   If Alias() == "FLUXO"
      aTelaInd := SavEnv()
      Win(11,20,18,58,"Aguarde! Reindexando Arquivo")
      Index On LANCA Tag fluxo1 To fluxo Eval BarProgress("FLUXO","FLUXO1") Every 50
      Index On Dtos(DATAENTRA) + TIPOCAD + Str(CODIGO,6) + Str(LOJA,6) Tag fluxo2 To fluxo Eval BarProgress("FLUXO","FLUXO2") Every 50
      Close fluxo
   EndIf
   RstEnv(aTela)
Alterando registro:

Código: Selecionar todos

      nSalCliF := MsgBox2("Confirma altera‡Æo?")
      If nSalCliF == 1
         Repla fluxo->TIPOCAD    With cTipoCad
      EndIf
      fluxo->(Destrava())  // DbUnlock
      fluxo->(DbCommit())
Índices Temporários:

Código: Selecionar todos

      cIndTemp1 := "indtemp"
      If (cTipoMov == "T" , cIndice := cIndice, cIndice := cIndice + "fluxo->tipomov  == cTipoMov .And. ")
      If (cPosicao == "T" , cIndice := cIndice, cIndice := cIndice + "fluxo->posicao  == cPosicao .And. ")
      cIndice := cIndice + "fluxo->dataentra >= dDataIni .And. fluxo->dataentra <= dDataFin .And. "
      nTamIndice := Len(cIndice)
      If Subs(cIndice,nTamIndice-6,7) == " .And. "
         cIndice := Subs(cIndice,1,nTamIndice-7)
      EndIf
      sele fluxo
      fluxo->(DbGoTop())
      If Empty(cIndice)
         fluxo->(OrdSetFocus(1))
      Else
         Index On fluxo->DATAENTRA To &cIndTemp1 For &cIndice
      EndIf
Grato
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Índice

Mensagem por Pablo César »

Antes de mais nada, quero desejá-lhe as nossas boas vinda ao fórum, em nome de todos !

Uma pergunta à margem disto: você utiliza campos memos ?
Uma observação sobre seu 1º código, na linha 16, pack ? NMMO essa prática não é correta, nessa situação.
A criação de arquivo de índices, não precisa estar em todo momento de abertura de arquivos. Inclusive, teoricamente, você não consegue deletar o arquivo de índice quando ele estiver aberto. Veja a linha 18 que utiliza o FErase antes do "close".
Eu faria uma opção de menu "Manutenção" para recriar os arquivos de índices quando estes dão problemas. Aliás também pode ser feito um modificação no ERRORSYS.PRG em que trata essa questão de REINDEXAÇÃO quando dá mensagem de problemas de índices, assim dispararia posteriormente a rotina de indexação. Mas esta eu faria em modo exclusivo.

O quê o Destrava() faz ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Re: Índice

Mensagem por Clipper »

Complementando a postagem do Pablo.

1 - No caso do CDX é recomendável (para não dizer obigatório) a exclusão do arquivo de indice, e aí sim criar um outro, ou então usar o coamndo REINDEX.
2 - Segundo o NG do RDD CDX, você pode utilizar REINDEX ao invés de PACK para eliminar os registros deletados.

NG do Clipper escreveu:If you rebuild your indexes on a regular basis, you should either delete your (.cdx) files before rebuilding the tags or use the REINDEX command
to rebuild them instead.
NG do Clipper escreveu:You can use the REINDEX command to "pack" the index file. REINDEX rebuilds each tag, eliminating any unused space in the file.
Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Índice

Mensagem por alxsts »

Olá!

Creio ter havido um mal entendido nestas traduções.
O comando PACK elimina registros marcados para deleção do arquivo de dados .DBF, ao passo que REINDEX reorganiza os índices, fazendo um pack no arquivo de índice apenas. Ou seja, não inclui no índice os registros do .DBF marcados para deleção, alem de reorganizar o espaço interno do arquivo de índices .
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Re: Índice

Mensagem por Clipper »

Correto Alexandre

Realmente é como você observou.

Corrigindo.

O comando REINDEX faz um "pack" no arquivo de indice, porém o arquivo DBF continuará a conter os arquivos marcados para deleção.

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Suporte Soft
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 28 Mar 2011 00:36
Localização: Goiás

Re: Índice

Mensagem por Suporte Soft »

Pessoal obrigado pelas postagens até o momento....

Estou fazendo as devidas correções no meu código.

As principais

1. Fechar o arquivo DBF antes de apagar o .CDX;
2. Removendo a cláusula Eval do Index. Por via das dúvidas melhor deixar sem a atualizar a janela apenas quando for executar a outra tag.

Outro detalhe abordado:
Eu uso camo MEMO em alguns arquivos, isso gera problemas nos índices? é aconselhável usar ou não?

O comando Pack eu utilizo para eliminar os registros deletados e manter o DBF melhor organizado.... O que vocês sugerem, deixar como está ou eliminar também?

Obrigado.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Índice

Mensagem por sygecom »

Suporte Soft escreveu: Eu uso camo MEMO em alguns arquivos, isso gera problemas nos índices? é aconselhável usar ou não?
Eu cheguei a usar por pouco tempo no Clipper, mas o grande Problema se dava quando tinha dois campo MEMO para uma mesma tabela, isso dava problema nos DBF e indice.
O comando Pack eu utilizo para eliminar os registros deletados e manter o DBF melhor organizado.... O que vocês sugerem, deixar como está ou eliminar também?
Eu sempre usei dessa forma no clipper, ainda tenho sistema no clipper rodando até hoje e utilizo do PACK para eliminar registros marcados para deletar, isso até hoje não me trouxe problema algum, no meu ponto de vista você pode manter sim isso como está.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Índice

Mensagem por gvc »

[Suporte Soft]
Se vc fecha o arquivo CDX "oficial", altera os registros enquanto usa os temporários e nessa alteração muda algum campo que compõe uma chave de indice, o seu arquivo "oficial" estará corrompido.
Veja na documentação do CDX como criar temporário no próprio arquivo. Eu ainda não usei isso mas lembro que alguns colegas daqui já usaram.

[Clipper]
O "pack" que o NG fala é para diminuir o espaço do arquivo CDX no disco. Como o NTX, o CDX usa paginação para montar as "arvores". Balancear as "arvores" é provavelmente a pior parte do algoritmo. Com o REINDEX as "arvores" são remontadas, permitindo uma melhor distribuição e até a diminuição de nós/paginação.

Putz! Daqui a pouco vamos começar a falar do algoritmo mesmo. Eh.Eh.Eh.

Tá! O que eu fiz para resolver alguns dos problemas de indice.

- O sistema abre e fecha os arquivos que necessita para executar um módulo do sistema. Assim o usuário que ficar no menu não tem nenhum arquivo aberto sem necessidade. E como o sistema fecha todos os arquivos, não deve ficar informação na memória.

- Uma função apenas para abrir os arquivos. Assim eu sei aonde esta a abertura dos arquivos e evito surpresas no meio do sistema.

- Bloqueio do X (fechar) da janela windows. Assim o usuário não sai do sistema fechando a janela. Diminuiu bastante a quebra de indice.

- Coloque uma "armadilha" para verificar que entra no sistema e não sai normalmente. Os usuários aqui juravam que estavam fazendo a saida correta, mas quando eu mandei a lista foi um "velório".

- Cuidado especial ao usar arquivos temporários. Só uso quando é para pesquisa ou relatórios. Se for para alterar alguma coisa no DBF, procuro usar sempre no "oficial".

- Apesar de alguns amigos aqui dizerem que não tem problemas, eu sempre tive com o CDX das versões 5.2x. Na documentação do clipper e parece que do NG tb falam que é para usar a versão 5.3x quando for trabalhar com CDX.
Só para constar: Não dúvido dos amigos que conseguiram usar CDX no 5.2x, mas a experiência foi horrível.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Suporte Soft
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 28 Mar 2011 00:36
Localização: Goiás

Re: Índice

Mensagem por Suporte Soft »

Blz...

Apenas mais duas perguntinhas agora...

onde eu encontro a documentação do CDX e...

Consultando aqui no site alguns colegas alegam que usar o DbCommit() diminui a quebra de índice e aumenta a eficiência do programa.

Neste tópico o colega Eric.Developer disse que de forma geral nunca é preciso usar.

e ai?
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Re: Índice

Mensagem por Clipper »

Prezado colega

Essa questão do DBCOMMIT é meio polêmica mesmo. Eu uso sempre, para garantir que nada se perca em caso de pane ou de algum usuário desleixado.
O que eu não gosto e nunca uso é o DBCOMMITALL().
Mas cada caso é um caso e depende também do funcionamento interno do programa. Exemplos :
Após a inclusão dos dados o banco de dados é fechado. Então não faz sentido usar o DBCOMMIT() pois ao fechar o BD o buffer será descarregado e o BD será gravado.
Em um sistema onde há grande relacionamento de arquivos, é importante que haja concomitância na gravação, então eu usaria. Mas como eu disse cada caso é um caso.

Um pequeno manual do RDD CDX http://www.ousob.com/ng/cldriv/ng1b9d1.php

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Responder