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