Página 1 de 2

identificar se um arquivo está aberto

Enviado: 20 Dez 2006 14:53
por PITERGALDIANO
Pessoal estou com problemas para identificar se um arquivo está aberto!
Preciso fazer isso para reindexar os DBF´s

Detalhes:
Abro todos os meus DBF´s da seguinte forma:
USE MEUDBF ALIAS ALIASDBF SHARED NEW

Funciona direitinho na rede.

Rotinas para indexação

Código: Selecionar todos

Function RefInd()

   USE MEUDBF ALIAS ALIASDBF EXCLUSIVE  // linha do erro
   IF NETERR()
       ? arquivo aberto
   else
       refaz indices
   endif

Retun .T.
quando tenta abrir em modo exclusivo aparece o seguinte erro:

Error _DBFCDX/1001 Open error: cadclif.DBF
(DOS Error 5)
Quit Retry Default

Obrigado a todos

Enviado: 20 Dez 2006 15:49
por sygecom
Buenas.....

Tche abaixo segue como faço para criar indece nos meus sistemas !!!

Código: Selecionar todos

*-------------------------------*
* Funcao p/ indexar bancos dados
*-------------------------------*
Func indexa()

use dados\PROG  alias PROG excl new
if !neterr()
   PACK
   DELETE FILE dados\PROG1.CDX
   index on DATA TAG 1 TO dados\PROG1 eval progress(20,26) every lastrec()/20
   use
endif

use dados\CEPRS alias CEPRS excl new
if !neterr()
   pack
   DELETE FILE dados\CEPRS1.CDX
   index on CEP TAG 1 TO dados\CEPRS1 eval progress(20,26) every lastrec()/20
   use
endif

use dados\cag_EST alias cag_EST excl new
if !neterr()
   DELETE FILE dados\CAG_EST1.CDX
   DELETE FILE dados\CAG_EST2.CDX
   index on DESCRICAO TO dados\cag_EST1 eval progress(20,26) every lastrec()/20
   index on CODEST    TO dados\cag_EST2 eval progress(20,26) every lastrec()/20
   @ 05,26 say "Controle de Estoque.OK "
   use
else
   @ 05,26 say "Estoque em.........USO "
endif

RETURN

Enviado: 20 Dez 2006 16:34
por PITERGALDIANO
sua rotina é basicamente igual a minha, o meu problema e que quando vou abrir o DBF em modo exclusivo é exibido o erro que postei no início.

Enviado: 20 Dez 2006 16:54
por sygecom
Vc jah tento fechar todos os arquivos antes de iniciar o processo de reindexação ??

Ex:
dbcloseall()
RefInd()
return

Enviado: 20 Dez 2006 16:58
por PITERGALDIANO
mas como eu faço para fechar os arquivos que estão abertos em modo compartilhado nas estações de trabalho.
Eu teria que solicitar aos usuários que fechem o sistema, mas antes disso o próprio sistema tem que me falar que o arquivo está sendo usado por outro usuário!

endendeu?

Este é o meu problema

Obrigado!

Enviado: 20 Dez 2006 17:12
por Clipper
Tem algo errado aí.

Testei a função que postei e funcionou perfeitamente, e a função NETERR() funciona perfeitamente.


Tento abrir um arquivo que já está aberto e NETERR() retorna .T. normalmnete sem abortar.

Até logo.

Marcelo

Enviado: 20 Dez 2006 17:21
por Clipper
Faz o seguinte :

Usa a função FLOCK()

USE CADCLI SHARED
IF FLOCK()
INDEX ON CODIGO TO CADACLI
ENDIF

Se não funcionar vá no prompt do DOS e...

FORMAT C: <ENTER>
Brincadeirinha... :?

Até logo.

Marcelo

Enviado: 20 Dez 2006 17:24
por sygecom
Tche como o Marcelo falou tem algo errado ai.....mas vamos lah tem dar um DBCLOSEALL() antes de iniciar a função de indexar....o DBCLOSEALL() vai fechar o que esta aberto na area que vc executar a função de indexar...e faça como eu lhe mandei acima !!! aqui funciona que é um relogio e nuam tem problema algum !!!

Abraços !!!

Enviado: 20 Dez 2006 19:27
por rochinha
Amiguinhos

As rotinas de voces ou funções estão corretas o que não esta correto é o procedimento.

Como se proceder para criar indices:

1 - Reindex caiu em desuso pelo fato de poder gerar indices balofos.
2 - Voces devem sempre usar dbCloseAll()
3 - A indexação é um processo exclusivo e portanto só pode ser feito em tabelas abertas por um unico usuário.

Para testar se um arquivo esta aberto em outra estação voce podem usar esta função:

Código: Selecionar todos

FUNCTION dblocked( dbf )
  ldbf := FOPEN( dbf, 1 )
  IF FERROR() <> 0
     RETURN .t.
  ENDIF
  FCLOSE(ldbf)
  RETURN .f.
Passe como parametro o nome do arquivo, não serve alias pois a tentativa de abertura se dará no arquivo fisico.

Código: Selecionar todos

...
if dbLocked( "CLIENTES.DBF" )
   ? "Arquivo travado em algum lugar"
else
   USE clientes EXCLUSIVE
E ai SygeCOM encontrou a Shirley(SYDA), hehehe!, eu me equivoquei pois o nome de usuário dela vem antes do seu e eu cliquei no link www do seu perfil.

Enviado: 20 Dez 2006 19:45
por sygecom
Rocinha,

Referente ao processo de reindex, tche semprei usei assim em rede com mais de 10 micros tanto com NTX ou CDX e nunca tive problema ainda !! mas sei que sua experiencia e seu conhecimento vai muito alem do que o meu....entaum como gosto de estar sempre inovando....vou adotar esse seu procedimento nos meus sistemas que tem a função de reindex......obrigado..

Shirley(SYDA):
Tche sai perguntando pra todo mundo por aqui se alguem conhecia a tal fulana Shirley(SYDA).....cara e nd...esses dias foi no tal do ORKUT um querido resolveu colocar www.sygecom.com.br e fez M****.....cara maior estress até dizer q fulano não trabalha aqui jah viu neh !!!
Mas tudo bem....um forte abraços !! e um Feliz Natal e um prospero Ano Novo !!!

Abraços

Enviado: 20 Dez 2006 20:07
por PITERGALDIANO
Olá pessoal, finalmente deu certo

Gostaria de agradecer aqui a ajuda do usuário do Fórum Maickon, pois devo a ele isso ter funcionado.

com relação ao que o Rochinha disse, vou fazer os teste com meu prg aqui e volto a postar novamente.

obrigado a todos pela dedicação e paciencia

Obrigado.

Enviado: 20 Dez 2006 21:32
por Clipper
Depois dessa fui até rever meus códigos e e acho muito estranho, pois veja como eu faço, sempre fiz e sempre funcionou.

Código: Selecionar todos

use caixa new
If !NetErr()
   RstEnv(rTela)
   Return(.T.)
Else
   ClrTed()
   MsgBox({"Caixa.Dbf esta em uso." ," "      ,;
   "Aguarde um momento, tentando acesso.....",;
   "[ ESC ] Cancela"},;
   "Aviso da Rede")
   Inkey(1)

   If Lastkey() = 27
      RstEnv(rTela)
      Return(.F.)
   EndIf
   nTempo++
   Loop
EndIf
E creio que 99,9 dos programadores em Clipper fazem de forma semelhante.

Até logo.

Marcelo

Enviado: 21 Dez 2006 03:39
por rochinha
Amiguinho

Poste a sua rotina inteira aqui inclusive com o do..while no qual o seu loop faz referencia.

Sua rotina faz a verificação em vários arquivos, então processe a indexação da seguinte forma:

Va em outra estação, abra o seu modulo de clientes. abra o explorer e veja a data e hora dos indices abertos.

Agora vá em outra estação e faça a reorganização. abra o explorer e veja a data e hora dos indices abertos.

Voce manteve por algum tempo os arquivos abertos e processou a indexação, certo? então qual a diferença nas datas e horários dos mesmos? nenhuma? então ai esta a falha, estes arquivos não foram indexados.

Se houve a re-estruturação mesmo com os arquivos abertos, sua rede tem brecha e os caches estão desencontrados.

Não existe meio de re-estruturar um indice aberto em modo shared e se isto acontece em sua rede os caches de cada maquina estão armazenandos as informações de forma desencontrada e voce só notará estes problemas muito tempo depois. Quando registros sumirem, registros deletados reaparecerem, conciliações feitas aparecerem desfeitas, etc. Isot demora, mas ai já outro papo...

Enviado: 21 Dez 2006 11:24
por Daniel
Ola Rochinha
Não existe meio de re-estruturar um indice aberto em modo shared e se isto acontece em sua rede os caches de cada maquina estão armazenandos as informações de forma desencontrada e voce só notará estes problemas muito tempo depois. Quando registros sumirem, registros deletados reaparecerem, conciliações feitas aparecerem desfeitas, etc. Isot demora, mas ai já outro papo...
Como que eu fico sabendo se tem este problema de caches? estou com este problema numa maquina com windows 98 com servidor de rede xp.

voce poderia me dizer

Grato

Enviado: 21 Dez 2006 13:02
por rochinha
Amiguinho

Na verdade não tem como saber, mas com Win98 eu geralmente deixava ativo o SMARTDRV pois alem de aumentar a velocidade de leitura faz o salvamento do cache automaticamente.

Código: Selecionar todos

;
; Resolve problemas de rede com o Clipper
;
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"     ; ValueType: dword; ValueName: "EnableOpLocks"          ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"     ; ValueType: dword; ValueName: "CachedOpenLimit"        ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UseOpportunisticLocking"; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UtilizeNtCaching"       ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UseLockReadUnlock"      ; ValueData: "0"; Components: clipper

;
; Melhora resposta do cache do Windows
;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Compress Old Files"          ; flags: DeleteKey         ; Components: desempenho\cache
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\ClassId key"     ; flags: DeleteKey         ; Components: desempenho\cache
No trecho de codigo de meu INSTALL.ISS( InnoSetup Script ) veja que faço algumas alterações no registro em relação a isto.

Exemplo:

Na chave SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters eu acrescento um Valor DWORD com 0 e assim por diante.