|
Alternativas para o comando ZeroFile
Versões antigas do DataFlex permitiam a execução
do comando ZeroFile enquanto outros usuários acessavam
o arquivo. Isto não é mais permitido. Por
razões de integridade, a partir da versão
3.1d do DataFlex e em todas as versões do Visual
DataFlex, o arquivo deve estar aberto em modo exclusivo
para executar o comando ZeroFile, caso contrário,
a mensagem de erro "File access violation, file may
be in use ArquivoX" status 4177 será exibida
se o arquivo estiver aberto por outro usuário.
Também não é mais permitida a execução
de um comando ZeroFile dentro de uma transação.
Existem algumas opções para tratar este problema:
Abrir o arquivo em modo exclusivo
A primeira opção é alterar os programas
que usam o comando ZeroFile de forma que o arquivo seja
aberto em modo exclusivo e, caso não seja possível
abrir o arquivo em modo exclusivo, tratar o erro. Por exemplo:
String sResposta 1
On Error GoSub Trata_Erro
Reiniciar:
Open TempCli Mode DF_Exclusive
ZeroFile TempCli
:
Abort
Trata_Erro:
If LastErr eq 4177 Begin // Trata o erro 4177
Showln "O arquivo TempCli
está aberto por outra aplicação/usuário."
Showln "Deseja tentar novamente
(S/N)?"
InKey sResposta
Indicate Err False
If ("Ss" Contains sResposta)
Return Reiniciar
Abort
End
Else Error LastErr // Se não for o
erro 4177, faz o tratamento padrão
Indicate Err False
Return
Se você estiver usando o Visual DataFlex ou se seu
programa for OOP (usando o pacote Error.pkg), veja um exemplo
de tratamento de erro no artigo
372 da seção Knowledge Base do site
4developers.
Excluir os registros um a um
Esta opção consiste na utilização
de um método ou macro que apagasse os registros do
arquivo para substituir o comando ZeroFile. Poderia ser
um loop com utilização do comando delete.
Exemplo:
Open TempCli
Clear TempCli
Find Gt TempCli.Recnum
While (Found)
Reread TempCli
Delete TempCli
UnLock
Find Gt TempCli.Recnum
Loop
Criação de um arquivo
temporário
Esta opção consiste em criar uma cópia
do arquivo com outro nome e utilizá-lo no processamento.
Esta opção pode ser usada nos casos em que
o comando ZeroFile foi empregado para limpar um arquivo
que é usado temporariamente em determinados processamentos
e que depois as informações podem ser descartadas.
A procedure abaixo pode ser usada para este propósito.
Ela requer dois parâmetros: o caminho do arquivo de
cópia e o número do arquivo original que será
"clonado".
//------------------------------------------------------------------
//-- Sintaxe: Send ZeroFile_Tmp "Nome_do_Arquivo_Copia"
; Nome_do_Arquivo.File_Number
//------------------------------------------------------------------
Procedure ZeroFile_Tmp String sNomeArq Integer iNumArq
Local String sTmpArq
Local Integer iNovoArq
Move 0 To iNovoArq
Structure_Start iNovoArq
"DATAFLEX"
Structure_Copy iNumArq To iNovoArq
Set_Attribute DF_FILE_PHYSICAL_NAME
Of iNovoArq To (Trim(sNomeArq))
Structure_End iNovoArq DF_STRUCTEND_OPT_NONE
Close iNumArq
Open (Trim(sNomeArq)) As iNumArq
End_Procedure
Veja um exemplo de chamada desta procedure:
Send ZeroFile_Tmp "C:\TMP\TempCli"
TempCli.File_Number
Abaixo uma segunda procedure que pode ser usada para apagar
o arquivo temporário e abrir novamente o arquivo
original da aplicação:
//------------------------------------------------------------------
//-- Sintaxe: Send Close_Tmp "Nome_do_Arquivo_Copia"
; Nome_do_Arquivo.File_Number
//------------------------------------------------------------------
Procedure Close_Tmp String sNomeArq Integer iNumArq
Close iNumArq
EraseFile (Trim(sNomeArq))
Open iNumArq
End_Procedure
Abaixo um exemplo de chamada:
Send Close_Tmp "C:\TMP\TempCli"
TempCli.File_Number
Evidentemente, será necessário que você
avalie cada caso de sua aplicação para determinar
qual destas soluções é a melhor.
| Veja Também: |
| Artigo 372 do Knowledge Base: |
Tratando
erros manualmente |
 |
| Artigo 1164 do Knowledge Base: |
Mensagem
de Erro "File access violation, file may be in use"
status 4177 |
 |
| Matéria 085 da Revista 4Developers: |
Convertendo
aplicações 2.3b para DataFlex 3.2 |
 |
| Comando 127 da Developer Library: |
Error |
 |
| Comando 202 da Developer Library: |
Error_Report |
 |
| Comando 111 da Developer Library: |
Structure_Copy |
 |
| Comando 102 da Developer Library: |
Structure_End |
 |
| Comando 103 da Developer Library: |
Structure_Start |
 |
| Comando 161 da Developer Library: |
ZeroFile |
 |
|
Esta e outras dicas técnicas
você encontra na revista 4developers,
uma publicação trimestral com 40 páginas
de conteúdo técnico de alta qualidade,
desenvolvida pelo Departamento de Suporte Técnico
e distribuída exclusivamente para assinantes
do
Pacote de Serviços Exclusivos.
Assine o Pacote de Serviços Exclusivos e receba
gratuitamente a revista 4developers!
|
|