Página 1 de 1
Índice
Enviado: 28 Mar 2011 00:52
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
Re: Índice
Enviado: 28 Mar 2011 07:38
por sygecom
Sem postar codigo fica dificil, como esta usando para criar indice, alterar registros, indice temporario, e etc.....
Re: Índice
Enviado: 28 Mar 2011 09:45
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
Índice
Enviado: 28 Mar 2011 12:11
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 ?
Re: Índice
Enviado: 28 Mar 2011 12:39
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
Re: Índice
Enviado: 28 Mar 2011 14:35
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 .
Re: Índice
Enviado: 28 Mar 2011 14:50
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
Re: Índice
Enviado: 28 Mar 2011 20:22
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.
Re: Índice
Enviado: 28 Mar 2011 20:41
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á.
Re: Índice
Enviado: 29 Mar 2011 09:57
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.
Re: Índice
Enviado: 29 Mar 2011 18:52
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?
Re: Índice
Enviado: 29 Mar 2011 22:45
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