DBPack()???

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

rcb2002
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 19 Jan 2010 23:16
Localização: Salvador

DBPack()???

Mensagem por rcb2002 »

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: Selecionar todos

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!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

DBPack()???

Mensagem por Toledo »

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

DBPack()???

Mensagem por alxsts »

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: Selecionar todos

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.
[]´s
Alexandre Santos (AlxSts)
Responder