Clipper On Line • Ver Tópico - DBPack()???
DBPack()???
por rcb2002 » 20 Ago 2013 15:04
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á...)
CHK -> (OrdSetFocus(2))
If CHK -> (DBSeek(cUser))
If BloqueiaRegistroNaRede("CHK")
CHK -> (DBDelete())
por Toledo » 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.
por alxsts » 20 Ago 2013 18:24
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:
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() } ) )
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).
- 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.