Clipper On Line • Ver Tópico - DBPack()???
Mudar para estilo Clássico
Projeto MiniGui - Biblioteca visual para Harbour/xHarbour
Postar uma resposta

DBPack()???

20 Ago 2013 15:04

Pessoal, boa tarde.

Mais uma dúvida meio básica, de antemão peço desculpas mas quando pergunto é porque esgotei todas as fontes de pesquisa:
Gostaria de limpar (com PACK) um DBF que estou usando pra registrar o acesso. Pela lógica, deveria existir um comando DBPack() - pra 'purgar' somente aquele arquivo - mas não o encontrei. O resultado é que quando executo a rotina abaixo dá erro de "uso exclusivo do arquivo" (provavelmente está tentando o PACK num monte de gente lá...)

Alguém se habilita?

Código:
Function Exit()
  CHK -> (OrdSetFocus(2))
  If CHK -> (DBSeek(cUser))
      If BloqueiaRegistroNaRede("CHK")
         CHK -> (DBDelete())
         Pack
      EndIf
      Main.Release
Return Nil



Mais uma vez, muitíssimo obrigado!

DBPack()???

20 Ago 2013 15:12

Amigo, para usar o comando PACK em um ambiente de rede (multiusuário) o banco de dados tem que ser aberto em modo exclusivo (EXCLUSIVE). Caso contrário, é gerado um erro de execução.

Abraços,

DBPack()???

20 Ago 2013 18:24

Olá!

Conforme o Toledo informou, o arquivo que vai sofrer a ação tem que estar aberto em modo exclusivo.
rcb2002 escreveu:Pela lógica, deveria existir um comando DBPack() - pra 'purgar' somente aquele arquivo

Realmente existe a tal função por você imaginada. Chama-se __DbPack() e pode ser usada em expressões com o operador alias (->), como mostrado abaixo:
Código:
Use temp EXCLUSIVE NEW
USE cust  EXCLUSIVE NEW

temp->( __DbPack() )   // O mesmo que emitir o comando PACK

Cust->(  DbEval( { || temp->( DbAppend() ), temp->custId := cust->custId }, { || ! Deleted() } ) )

...

DbCloseAll()
Existe também a função __dbZap(), o mesmo que emitir o comando ZAP. É possível ver que o compilador pré processa estes comandos nas respectivas funções, configurando-se a compilação para gerar o arquivo .ppo (pre processed output).

Lembre-se:
- rotinas de reorganização e indexação de tabelas devem ser executadas em momentos específicos, com o sistema bloqueado para acesso de usuários.
- não faz sentido fazer pack a cada vez que se deleta um registro, a não ser em condições muito específicas.
Postar uma resposta