identificar se um arquivo está aberto

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

identificar se um arquivo está aberto

Mensagem 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
Piter Galdiano
Programador Clipper
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem 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.
Piter Galdiano
Programador Clipper
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Vc jah tento fechar todos os arquivos antes de iniciar o processo de reindexação ??

Ex:
dbcloseall()
RefInd()
return
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem 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!
Piter Galdiano
Programador Clipper
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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 !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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.
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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem 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.
Piter Galdiano
Programador Clipper
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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...
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.
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem 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
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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.
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.
Responder