tenho uma dúvida a esclarecer se possível ... tenho uma rotininha que funciona muito bem no meu C: onde fica o PRG ele roda tranquilo, mas ao colocar a rotina no servidor F: ao executar ele processa uns dados e depois me emite uma tela vermelha com WORKAREA NOT IN USE: DBGOTOP ... pq isso no F e não ocorre no C segue o trecho do PRG onde indica o problema para uma análise .. grato
USE DEMONS
REPLACE ALL WFAT WITH 0
REPLACE ALL WCODVEN WITH " "
DO WHILE ! eof()
LOCATE FOR WFAT = 0
IF FOUND()
TOTFAT := 0
ZERADO := WCODCLI
@ 24,0 SAY ZERADO
@ 24,15 SAY WNOMCLI
Olá, minha sugestão e você especificar o caminho dentro do programa na hora da abertura dos arquivos, por exemplo:
USE DEMOS ficaria USE F:\PASTA\DEMOS
USE \LILAS\RECEBER ficaria USE F:\LILAS\RECEBER
Outro detalhe e você verificar se não ha outro usuario abrindo os mesmos arquivos, pois este seu código não esta preparado para trabalhar em multiusuario, para isso deve haver alguns tratamentos como o SET EXCLUSIVE OFF, além de ter que existir um controle de nos REPLACE ´s
Exemplo simples
SET EXCLUSIVE OFF && ABERTURA DE ARQUIVOS COMPARTILHADOS
SELECT 1
USE TESTE1
IF NETERR()
? "ERRO NA ABERTURA DO ARQUIVO"
CLOSE DATABASES
QUIT
ENDIF
SELECT 2
USE TESTE2 INDEX TESTE2
IF NETERR()
? "ERRO NA ABERTURA DO ARQUIVO"
CLOSE DATABASES
QUIT
ENDIF
SELECT 1
CODIGO=0
GO TOP && VAI NO INICIO DO ARQUIVO TESTE1
DO WHILE .NOT. EOF()
IF ALOCA() && ESTA FUNÇÃO TENTA 10 VEZES BLOQUEAR O REGISTRO PARA USO
CODIGO = WCODIGO
REPLACE CAMPO WITH 1
DBUNLOCK() && DESBLOQUEIA
DBCOMMIT() && BAIXA O BUFFER PARA O DISCO
ELSE
EXIT
ENDIF
SELECT 2
SEEK CODIGO
IF .NOT. EOF()
IF ALOCA()
REPLACE VALOR WITH 100
DBUNLOCK()
DBCOMMIT()
ELSE
EXIT
ENDIF
ENDIF
SELECT 1
SKIP
ENDDO
CLOSE DATABASES
RETURN
FUNCTION ALOCA()
FCTA=0
DO WHILE .T.
FCTA++
IF RLOCK()
RETURN .T.
ELSE
IF FCTA > 10
? "Registro sendo usado por outro usuario"
INKEY(0)
RETURN .F.
ELSE
INKEY(1)
ENDIF
ENDIF
ENDDO
RETURN .F.
Atenção!
Você já abriu o arquivo em modo exclusivo e está tetando abrí-lo novamente. Não faça isso!
Use o comando (SELECT) ou função (DBSELECTAREA()) de seleção de área do arquivo e pronto.
Espero ter ajudado.
e que local não ha problemas de compartilhamento, já em uma unidade de rede sim
por isso do SET EXCLUSIVE OFF no inicio do meu exemplo
além disso você não deve ficar abrindo o arquivo varias vezes, além da performance ficar horrivel ha estes e outros problemas, siga o conselho do amigo e use SELECT para abrir arquivos sempre no inicio da aplicação e detalhe para não ter problemas no futuro, se usar indices abraos sempre na mesma ordem por exemplo
select 1
use arquivo1 index index1, index 2
nunca faça isso
select 1
use arquivo1 index index2, index1 pois com isso tera problema de arquivo corrompido blz.
Na verdade não é muito bom usar o SELECT para criar uma area pois no meio do caminho voce pode esquecer em que area esta um .DBF e tentar seleciona-lo em outra area.
Use o parametro NEW nas aberturas de arquivo e deixe o Clipper alocar uma área.
USE arquivo1 NEW
USE arquivo2 NEW
...
SELECT arquivo1
...
SELECT arquivo2
...
Outra coisa é que voce faz USE DEMONS e em um ponto abaixo repete o USE DEMONS e o que pode estar ocorrendo é o fechamento do arquivo DEMONS, pois se voce abre um arquivo em uma área e depois da um comando USE sem parametros este comando fecha a área atual e o que pode estar ocorrendo é isto.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.