Página 1 de 2
problema na execução em rede
Enviado: 05 Out 2006 10:28
por Genildo
Bom dia a todos
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
USE \LILAS\RECEBER
DO WHILE ! EOF()
IF RCCLIENTE = ZERADO
TOTFAT := TOTFAT + RCVALOR
@ 24,65 SAY TOTFAT
ENDIF
SKIP
LOOP
ENDDO
USE DEMONS
<< o erro de DBGOTOP ocorre nesta linha >>
DO WHILE ! EOF()
IF WCODCLI = ZERADO
REPLACE WFAT WITH TOTFAT
IF TOTFAT = 0
REPLACE WFAT WITH 1
ENDIF
ENDIF
SKIP
LOOP
ENDDO
ELSE
DO IMP
ENDIF
ENDDO
Sugestão
Enviado: 05 Out 2006 11:18
por marchiore
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.
Enviado: 05 Out 2006 16:37
por Genildo
ok ... vou tentar essa solução de apontar o drive do sistema, mas normalmente só uma pessoa q usa mesmo. Até eu sozinho testando ele deu o erro.
Enviado: 05 Out 2006 16:42
por Genildo
realmente é pra deixar alucinado, apontei o drive e ficou
USE F:\LILAS\DEMONS
e mesmo assim ele continua WORKAREA NOT IN USE: DBGOTOP
é muito louco ... eu uso normalmente sem a letra do drive para fins de compilação para teste no HD.
PS: só eu usando a rotina
Enviado: 05 Out 2006 17:28
por MARCELOG
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.
MarceloG
Enviado: 06 Out 2006 08:38
por Genildo
ok marcelo .. vou procurar fazer isso .. o engraçado é q executando no HD num tem esse problema ...
Rede
Enviado: 06 Out 2006 10:39
por marchiore
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.
Abraço.
Enviado: 06 Out 2006 21:07
por rochinha
Amiguinho
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 :?)
Enviado: 11 Out 2006 11:20
por Genildo
vlw gente .. vou tentar aperfeiçoar essa joça rsss
Enviado: 11 Out 2006 20:54
por Augusto
O parceiro ROCHINHA tem toda razão (com sempre) ...
O que está acontecendo é que ou vc usa o SELECT como foi dito por ele ou uma outa forma é:
Código: Selecionar todos
select 1
USE ARQUIVO1 alias ARQUIVO1
select 2
USE ARQUIVO2 alias ARQUIVO2
...
select ARQUIVO1
...
select ARQUIVO2
Além é claro de ter de usar os controles de MULTIUSUÁRIO tais como:
SET EXCLUSIVE OFF, RLOCK(), FLOCK(), UNLOCK, COMMIT entre outros...
Enviado: 11 Out 2006 23:36
por rochinha
Amiguinho
Obrigado
@braços :?)
Enviado: 13 Out 2006 09:43
por Genildo
vou decorando e implementando essas paradas pq num tem nada disso na rotina rss
Enviado: 20 Out 2006 08:03
por Genildo
nossa ... hj q consegui fazer a cabeça esfriar e funcionou a parada ... rsss a galera ta de parabéns ...
Enviado: 20 Out 2006 12:16
por Genildo
sem querer ser chato .. mas ja sendo ..o q seriam ?? e como se aplicam ?
SET EXCLUSIVE OFF, RLOCK(), FLOCK(), UNLOCK e COMMIT
Enviado: 20 Out 2006 16:38
por MARCELOG