Clipper On Line • Ver Tópico - Uso correto da função NETERR()

Uso correto da função NETERR()

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Uso correto da função NETERR()

Mensagempor Ingrid Farabulini » 01 Abr 2018 19:03

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! :*
Ingrid Farabulini
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 24 Mar 2018 21:36
Cidade/Estado: Canasvieiras-SC
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Uso correto da função NETERR()

Mensagempor Jairo Maia » 02 Abr 2018 01:50

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:

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

EndIf


Para evitar mensagens de erros no Clipper, somente alterando o arquivo ERRORSYS.PRG, mas é extremamente desaconselhável.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2002
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 217 vezes
Mens.Curtidas: 195 vezes

Uso correto da função NETERR()

Mensagempor JoséQuintas » 02 Abr 2018 12:17

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.

IF .NOT. File( "arquivo.dbf" )
   ? "Arquivo não existe"
   // e o que fazer se não existir
ENDIF
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9086
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 526 vezes

Uso correto da função NETERR()

Mensagempor Ingrid Farabulini » 02 Abr 2018 18:51

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.
USE TEMPFILE SHARED NEW    // Se TEMPFILE não existir, exibirá a mensagem de erro.
Acredito que somente com um controle de erro BEGIN/BRAKE vou conseguir corrigir, o que é desaconselhável.

Alguma sugestão?
Obrigada pela ajuda. :*
Ingrid Farabulini
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 24 Mar 2018 21:36
Cidade/Estado: Canasvieiras-SC
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Uso correto da função NETERR()

Mensagempor JoséQuintas » 02 Abr 2018 20:01

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...
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9086
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 526 vezes

Uso correto da função NETERR()

Mensagempor Jairo Maia » 02 Abr 2018 23:32

Olá Ingrid,

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.
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: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.
Caramba, qual exatamente seria essa situação que nesses milésimos de segundo o arquivo poderia ser deletado?

Ingrid Farabulini escreveu:Acredito que somente com um controle de erro BEGIN/BRAKE vou conseguir corrigir
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?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2002
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 217 vezes
Mens.Curtidas: 195 vezes

Uso correto da função NETERR()

Mensagempor JoséQuintas » 18 Abr 2018 18:50

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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9086
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 526 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Bing [Bot] e 5 visitantes


Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro