Uso correto da função NETERR()
Moderador: Moderadores
-
Ingrid Farabulini
- Usuário Nível 1

- Mensagens: 3
- Registrado em: 24 Mar 2018 21:36
- Localização: Canasvieiras-SC
Uso correto da função NETERR()
Olá,
Estou tendo dificuldade com o uso correto da função NETERR() adicionada logo na linha seguinte ao comando USE, no caso "USE ARQ.DBF SHARED NEW". Quando tento abrir um arquivo .DBF que não existe no diretório atual, é exibida na tela a seguinte mensagem de erro "Error DBFNTX/1001 Open Error: ARQ.DBF (DOS Error 2)" com as opções "Quit, Retry, Default". Se escolho a opção "Default", a NETERR() retorna falso ".F.", mas não deveria retornar .T., por ter ocorrido um erro de abertura? Aproveito para perguntar se existe alguma maneira da mensagem de erro padrão do Clipper não ser exibida caso ocorra a tentativa de abrir um arquivo .DBF que não existe. Pensava que a mensagem padrão de erro só era exibida caso não utilizasse a função NETERR() na linha seguinte.
Só para completar, utilizo Windows XP/7 rodando Clipper 5.2e.
Obrigada, aguardo pela ajuda! :*
Estou tendo dificuldade com o uso correto da função NETERR() adicionada logo na linha seguinte ao comando USE, no caso "USE ARQ.DBF SHARED NEW". Quando tento abrir um arquivo .DBF que não existe no diretório atual, é exibida na tela a seguinte mensagem de erro "Error DBFNTX/1001 Open Error: ARQ.DBF (DOS Error 2)" com as opções "Quit, Retry, Default". Se escolho a opção "Default", a NETERR() retorna falso ".F.", mas não deveria retornar .T., por ter ocorrido um erro de abertura? Aproveito para perguntar se existe alguma maneira da mensagem de erro padrão do Clipper não ser exibida caso ocorra a tentativa de abrir um arquivo .DBF que não existe. Pensava que a mensagem padrão de erro só era exibida caso não utilizasse a função NETERR() na linha seguinte.
Só para completar, utilizo Windows XP/7 rodando Clipper 5.2e.
Obrigada, aguardo pela ajuda! :*
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Uso correto da função NETERR()
Olá Ingrid,
Seja bem vinda ao fórum.
A função NETERR() inicia com valor .F., e será alterado apenas se for usado algum comando que necessite travar o registro ou arquivo em rede, e se manterá com o mesmo status até o uso da próxima tentativa.
Você não pode tentar abrir um aquivo que não existe. Precisa verificar duas coisas:
1 - Se o arquivo existe;
2 - Se ele já não está aberto. Exemplo:
Para evitar mensagens de erros no Clipper, somente alterando o arquivo ERRORSYS.PRG, mas é extremamente desaconselhável.
Seja bem vinda ao fórum.
A função NETERR() inicia com valor .F., e será alterado apenas se for usado algum comando que necessite travar o registro ou arquivo em rede, e se manterá com o mesmo status até o uso da próxima tentativa.
Você não pode tentar abrir um aquivo que não existe. Precisa verificar duas coisas:
1 - Se o arquivo existe;
2 - Se ele já não está aberto. Exemplo:
Código: Selecionar todos
Local x, cArquivo, cAlias, aIndices
cArquivo := "NomeArq.Dbf" // nome do .DBF
aIndices := { "Indice1", "Indice2", etc... } // nomes dos indices
cAlias := Left( cArquivo, 1, At( ".", cArquivo ) - 1 )
If File( cArquivo ) // verifica se arquivo existe
If Select( cAlias ) = 0 // verifica se não está aberto
USE ( cArquivo ) SHARED NEW // abre o arquivo
If Used() // verifica se deu tudo certo
For x = 1 To Len( aIndices )
SET INDEX TO ( aIndices[x] ) ADDITIVE // abre os indices
Next
DbSetOrder( nOrdem )
EndIf
Else
DbSelect( cAlias )
DbSetOrder( nOrdem )
EndIf
EndIfAbraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Uso correto da função NETERR()
Só clarear o que foi postado pelo Jairo:
A mensagem de erro DOS ERROR 2 é quando o arquivo não existe.
Isso não é erro de rede, é falta de arquivo mesmo.
A opção é primeiro testar se o arquivo existe, e decidir o que fazer.
A mensagem de erro DOS ERROR 2 é quando o arquivo não existe.
Isso não é erro de rede, é falta de arquivo mesmo.
A opção é primeiro testar se o arquivo existe, e decidir o que fazer.
Código: Selecionar todos
IF .NOT. File( "arquivo.dbf" )
? "Arquivo não existe"
// e o que fazer se não existir
ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
Ingrid Farabulini
- Usuário Nível 1

- Mensagens: 3
- Registrado em: 24 Mar 2018 21:36
- Localização: Canasvieiras-SC
Uso correto da função NETERR()
Olá meninos, agradeço a atenção de vocês e as mensagens de boas vindas!
Agradeço a explicação sobre o uso correto da função NETERR(). Havia lido em um livro que se houvesse algum erro com os comandos USE e APPEND BLANK, essa função também acusaria. Agora tenho certeza que não! Pelo menos vou poder explicar minha dificuldade melhor agora: o que preciso é criar o arquivo caso ocorra a exclusão desse arquivo mesmo depois de testado a existência do mesmo com a função FILE(), ou seja, nesse intervalo mínimo de segundos entre a função FILE() e o comando USE. Por esse motivo, gostaria que a mensagem de erro seja ocultada, visto que o sistema só saberá se precisa criar esse arquivo a ser usado exatamente no momento que obtém acesso a ele.Acredito que somente com um controle de erro BEGIN/BRAKE vou conseguir corrigir, o que é desaconselhável.
Alguma sugestão?
Obrigada pela ajuda. :*
Agradeço a explicação sobre o uso correto da função NETERR(). Havia lido em um livro que se houvesse algum erro com os comandos USE e APPEND BLANK, essa função também acusaria. Agora tenho certeza que não! Pelo menos vou poder explicar minha dificuldade melhor agora: o que preciso é criar o arquivo caso ocorra a exclusão desse arquivo mesmo depois de testado a existência do mesmo com a função FILE(), ou seja, nesse intervalo mínimo de segundos entre a função FILE() e o comando USE. Por esse motivo, gostaria que a mensagem de erro seja ocultada, visto que o sistema só saberá se precisa criar esse arquivo a ser usado exatamente no momento que obtém acesso a ele.
Código: Selecionar todos
USE TEMPFILE SHARED NEW // Se TEMPFILE não existir, exibirá a mensagem de erro.
Alguma sugestão?
Obrigada pela ajuda. :*
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Uso correto da função NETERR()
Provavelmente está com uma rotina no servidor que vai apagando o arquivo conforme processa.
Vai ser quase impossível impedir problemas, se tem mais terminais envolvidos.
Se for isso, o ideal é criar um arquivo de semáforo.
Ou ir criando com extensões diferentes arquivo001, arquivo002, etc.
Lembrando que o próprio Windows tem problemas com isso, de ficar apagando/criando...
Vai ser quase impossível impedir problemas, se tem mais terminais envolvidos.
Se for isso, o ideal é criar um arquivo de semáforo.
Ou ir criando com extensões diferentes arquivo001, arquivo002, etc.
Lembrando que o próprio Windows tem problemas com isso, de ficar apagando/criando...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Uso correto da função NETERR()
Olá Ingrid,
E sim, acusa. Porém, no comando USE você não pode usar o parâmetro SHARED. Se você usar SHARED o arquivo não é travado. Se usar apenas o comando USE sem SHARED, o arquivo será aberto em modo exclusivo, e NETERR() será .T. Se não for possível abrir o arquivo em modo exclusivo, NETERR() então será .F.Ingrid Farabulini escreveu:Havia lido em um livro que se houvesse algum erro com os comandos USE e APPEND BLANK, essa função também acusaria.
Caramba, qual exatamente seria essa situação que nesses milésimos de segundo o arquivo poderia ser deletado?Ingrid Farabulini escreveu:o que preciso é criar o arquivo caso ocorra a exclusão desse arquivo mesmo depois de testado a existência do mesmo com a função FILE(), ou seja, nesse intervalo mínimo de segundos entre a função FILE() e o comando USE.
Mesmo com BEGIN/BREAK não seria possível sem alterar o arquivo ERRORSYS. O problema é o que fazer a partir dai. Tem como você postar um exemplo da situação que você precisa tratar?Ingrid Farabulini escreveu:Acredito que somente com um controle de erro BEGIN/BRAKE vou conseguir corrigir
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Uso correto da função NETERR()
Por coincidência acabei de pensar numa situação onde isso poderia acontecer:
Pensei em ter arquivos DBFs temporários, como resultado de pesquisas no MySQL.
Mas definir um tempo de vida útil pra eles, a fim de atualizar com novos dados do MySQL.
Seria uma situação onde poderia acontecer isso de precisar de um controle em milésimos de segundo... rs
Só um arquivo de semáforo mesmo.
Tipo cada registro com o nome do arquivo, e um RLock() ao criar/apagar, pra impedir que outro processo faça o mesmo.
Em multithread, milésimos de segundo podem fazer diferença, porque são processos rodando local na mesma máquina.
Outra opção é fazer reaproveitamento de registro deletado, assim pode excluir os registros e reaproveitar, sem que o arquivo "engorde" demais.
Mas vai precisar pensar muito bem, seja qual for a opção escolhida.
Pensei em ter arquivos DBFs temporários, como resultado de pesquisas no MySQL.
Mas definir um tempo de vida útil pra eles, a fim de atualizar com novos dados do MySQL.
Seria uma situação onde poderia acontecer isso de precisar de um controle em milésimos de segundo... rs
Só um arquivo de semáforo mesmo.
Tipo cada registro com o nome do arquivo, e um RLock() ao criar/apagar, pra impedir que outro processo faça o mesmo.
Em multithread, milésimos de segundo podem fazer diferença, porque são processos rodando local na mesma máquina.
Outra opção é fazer reaproveitamento de registro deletado, assim pode excluir os registros e reaproveitar, sem que o arquivo "engorde" demais.
Mas vai precisar pensar muito bem, seja qual for a opção escolhida.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
Gabriel Pavan
- Usuário Nível 1

- Mensagens: 6
- Registrado em: 16 Mai 2018 15:09
- Localização: Jundiaí/SP
Uso correto da função NETERR()
Boa Tarde Pessoal... Sou novo por aqui... estou meio perdido.... Utilizo clipper 5.2 com Blinker... estou transformando meu sistema em rede, e estava usando o Neterr() para todos os acessos, e sempre com o comando USE vendas EXCLUSIVE antes... porém, creio que não teria necessidade bloquear o acesso ao BD quando por exemplo for fazer somente uma pesquisa... Alguém poderia me ajudar? desde já Obrigado.
-
vcatafesta
- Usuário Nível 1

- Mensagens: 27
- Registrado em: 21 Fev 2015 00:22
- Localização: Pimenta Bueno/RO
- Contato:
Uso correto da função NETERR()
Olá Gabriel,
Veja se isso te ajuda.
Defines:
Função para abrir arquivo BD:
funções para travar arquivo, travar registro, incluir registro, e liberar:
Qualquer dúvida, é só dar um tok.
att,
Veja se isso te ajuda.
Defines:
Código: Selecionar todos
#define true .T.
#define false .F.
#define FALSO .F.
#define OK .T.
#define ESC 27
#define P_DEF(Par, Def) Par := if( Par = Nil, Def, Par )
Código: Selecionar todos
*-----------------------------------------------*
function NetUse( cBcoDados, lModo, nSegundos, cAlias )
*-----------------------------------------------*
LOCAL cScreen := SaveScreen()
LOCAL nArea := 0
LOCAL Restart := OK
LOCAL cStr1
LOCAL cStr2
LOCAL cStr3
LOCAL cStr4
LOCAL cStr5
LOCAL cStr6
LOCAL lForever
LOCAL cTela
LOCAL lAberto := FALSO
P_DEF( lModo, OK )
P_DEF( nSegundos, 2 )
cBcoDados := StrTran( cBcoDados, '.DBF')
cAlias := Iif( cAlias = NIL, cBcoDados, cAlias )
lForever := ( nSegundos = 0 )
lAberto := (cBcoDados)->(Used())
if lAberto // 14:03 25/04/2018
(cBcoDados)->(DbCloseArea())
lAberto := false
endif
while Restart
while (lForever .OR. nSegundos > 0)
if lModo
Use (cBcoDados) SHARED NEW Alias ( cAlias )
else
Use (cBcoDados) EXCLUSIVE NEW Alias ( cAlias )
endif
if !NetErr()
ResTela( cScreen )
return( OK )
endif
cTela := Mensagem("Tentando acesso a " + Upper(AllTrim(cBcoDados)) + ".DBF...")
Inkey(.5)
nSegundos -= .5
ResTela( cTela )
EndDo
nOpcao := Conf("Acesso Negado a " + Upper(AllTrim( cBcoDados )) + " Novamente ? ")
if nOpcao = OK
ResTart := OK
else
ResTart := FALSO
DbCloseAll()
FChDir( oAmbiente:xBase )
SetColor("")
Cls
cStr1 := "#1 Se outra estação estiver usando o sistema, finalize-a. ;;"
cStr2 := "#2 Se outra estação estiver indexando, aguarde o término. ;;"
cStr3 := "#3 Se SHARE estiver instalado, aumente os parãmetros de ;"
cStr4 := " travamento de arquivos. Ex.: SHARE /F:18810 /L:510. ;;"
cStr5 := "#4 Em ambiente de rede NOVELL, verifique o arquivo NET.CFG;"
cStr6 := " e se necessário, acrescente a linha FILE HANDLES=127. ;"
Alert( cStr1 + cStr2 + cStr3 + cStr4 + cStr5 + cStr6, "W+/B")
Break
//Quit
endif
EndDo
return( FALSO )
Código: Selecionar todos
function TravaReg( nTentativa, aRegistros )
*+-----------------------------------+*
LOCAL cScreen := SaveScreen()
LOCAL Restart := OK
LOCAL lContinua
hb_default(@nTentativa, 2)
lContinua := ( nTentativa == 0 )
while Restart
while (!RLock() .AND. ( nTentativa > 0 .OR. lContinua ))
Mensagem(" Travando Registro " + AllTrim(Str( Recno())) + " no Arquivo " + Alias(), CorBox())
if inKey(1) = K_ESC
exit
endif
nTentativa--
enddo
if !RLock()
if !Conf("Registro em uso. Tentar Novamente ?" )
ResTela( cScreen )
return( false )
endif
ResTart := OK
nTentativa := 2
else
ResTela( cScreen )
return( true )
endif
EndDo
function TravaArq()
*+-----------------------------------+*
if Flock()
return( true )
endif
while !FLock()
ErrorBeep()
if !Conf("Arquivo em uso em outra Estaçao. Tentar Novamente ?" )
return( false )
endif
if FLock()
return( true )
endif
enddo
return( true )
function Incluiu()
*+-----------------------------------+*
DbAppend()
if !NetErr()
return( true )
endif
while NetErr()
ErrorBeep()
if !Conf("Registro em uso em outra Estaçao. Tentar Novamente ?")
return( false )
endif
DbAppend()
if !NetErr()
return( true )
endif
EndDo
return( true )
function Libera()
*+-----------------------------------+*
//DbCommit() // Atualiza Buffers
DbSkip(0) // Refresh
DbGoto( Recno()) // Refresh
DbUnLock() // Libera Registros / Arquivos
return Nil
att,
Harbour, C, C++, Ruby, Python, Go, Delphi, Haskell, Html, PHP, mingw, gtwvg, multithread, dbfcdx, letodb
=================================================
Senhor, sem Ti, nada podemos fazer!
=================================================
Senhor, sem Ti, nada podemos fazer!
-
vcatafesta
- Usuário Nível 1

- Mensagens: 27
- Registrado em: 21 Fev 2015 00:22
- Localização: Pimenta Bueno/RO
- Contato:
Uso correto da função NETERR()
Formas de Usar as funções:
Lembre-se: 1)TravaArq() para quando necessário fazer alterações/exclusões em vários registros
2)TravaReg() quando alterações/exclusões em somente um registro.
3)Inclui() para incluir registros
4)Libera(). use sempre logo após as outras funções
Código: Selecionar todos
if Printer->(TravaArq())
for nX := 1 To nTam
Printer->(DbAppend())
for nField := 1 To Printer->(FCount())
Printer->(FieldPut( nField, aPrinter[nX,nField]))
next
next
Printer->(Libera())
endif
Código: Selecionar todos
if Conf( "Pergunta: Confirma Registro da Senha ?")
if Vendedor->(TravaReg())
Vendedor->Senha := MsEncrypt(Upper(cPasse))
Vendedor->(Libera())
endif
endif
Código: Selecionar todos
if Conf("Pergunta: Confirma Inclusao do Grupo ?")
if Grupo( cCodigo )
if Grupo->(Incluiu())
Grupo->Codgrupo := cCodigo
Grupo->Desgrupo := cDescricao
Grupo->Atualizado := Date()
Grupo->Servico := IF( cServico = "S", OK, FALSO )
Grupo->(Libera())
endif
endif
endif
2)TravaReg() quando alterações/exclusões em somente um registro.
3)Inclui() para incluir registros
4)Libera(). use sempre logo após as outras funções
Harbour, C, C++, Ruby, Python, Go, Delphi, Haskell, Html, PHP, mingw, gtwvg, multithread, dbfcdx, letodb
=================================================
Senhor, sem Ti, nada podemos fazer!
=================================================
Senhor, sem Ti, nada podemos fazer!
-
Gabriel Pavan
- Usuário Nível 1

- Mensagens: 6
- Registrado em: 16 Mai 2018 15:09
- Localização: Jundiaí/SP
Uso correto da função NETERR()
Boa Tarde! Desculpe não dar o feedback antes, mas me ajudou muito.
Muito Obrigado
Muito Obrigado