ALIAS does not exist

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ALIAS does not exist

Mensagem por JoséQuintas »

Ok, geralmente é usar um alias/arquivo que não está aberto.

Servidor com Windows 8, foi adicionada uma nova máquina com Windows 8.

No início do módulo:

Código: Selecionar todos

IF .NOT. AbreArquivos( { "jptabel", ... } )
   RETURN
ENDIF
Ou seja, se o arquivo não puder ser aberto, o módulo não é executado.

Este é o segundo ambiente em que acontece isso, e a única alteração de ambiente foi adicionar um terminal com Windows 8.

O erro acontece no aplicativo rodando no próprio servidor.

Alguma sugestão sobre o que fazer?
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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ALIAS does not exist

Mensagem por Kapiaba »

Uma sugestão:

Código: Selecionar todos

FUNCTION VER_SE_ABRE_BANCOS()

   LCHDIR( cDirPleno ) // Onde estao os .DBFs
   SET PATH TO

   IF .NOT. FILE( "CADNFE.DBF" ) .OR. .NOT. FILE( "CADCESVE.DBF" ) .OR.     ;
      .NOT. FILE( "ICESVE.CDX" ) .OR. NETERR()

      ? "IMPOSSIVEL ABRIR BANCO DE DADOS.       "

      DBCLOSEALL()

      QUIT

   ENDIF

RETURN( .T. )
Verifique também, se não tem um DbCloseAll() fechando os bancos.

Abs
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ALIAS does not exist

Mensagem por JoséQuintas »

Ok.
É isso que a AbreArquivos() faz hoje, inclusive alguns testes a mais.
Num resumo:

Código: Selecionar todos

FUNCTION AbreArquivos( acArquivos, lExclusive )
   LOCAL lOk := .T.
   FOR nCont = 1 TO Len( acArquivos )
      lOk := AbreUmArquivo( acArquivos[ nCont ], lExclusive )
      IF .NOT. lOk
         EXIT
      ENDIF
   NEXT
   IF .NOT. lOk
      CLOSE DATABASES
   ENDIF
   RETURN lOk

FUNCTION AbreUmArquivo( cArquivo, lExclusive )
   LOCAL nSelect
   lExclusive := iif( lExclusive == NIL, .F., lExclusive )
   IF .NOT. File( cArquivo + ".dbf" )
      MsgExclamation( "Arquivo " + cArquivo + ".dbf não localizado" )
      RETURN .F.
   ENDIF
   nSelect := Select( cArquivo ) // caso já esteja aberto, usa mesma área
   SELECT ( nSelect )
   IF lExclusive
      USE ( cArquivo ) EXCLUSIVE
   ELSE
      USE ( cArquivo ) SHARED
   ENDIF
   IF NetErr()
      MsgExclamation( "Erro NetErr() ao abrir " + cArquivo )
      RETURN .F.
   ENDIF
   IF .NOT. Used()
      MsgExclamation( "Erro Used() ao abrir " + cArquivo )
      RETURN .F.
   ENDIF
   IF Select( cArquivo ) == 0
      MsgExclamation( "Erro Select() ao abrir " + cArquivo )
      RETURN .F.
   ENDIF
   IF Upper( Alias() ) != Upper( cArquivo )
       MsgExclamation( "Erro Alias() ao abrir " + cArquivo )
      RETURN .F.
   ENDIF
   RETURN AbreIndice( cArquivo )
e AbreIndice() usa uma tabela do sistema que contém a lista de índices, criando caso não exista, por isso não precisa testar se retorna verdadeiro.

Já tinha acrescentado esses testes a mais da outra vez, pra ver se fazia diferença.
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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ALIAS does not exist

Mensagem por Kapiaba »

Teste agora por favor:

Código: Selecionar todos

FUNCTION AbreArquivos( acArquivos, lExclusive )
 LOCAL lOk := .T.
 FOR nCont = 1 TO Len( acArquivos )
   lOk := AbreUmArquivo( acArquivos[ nCont ], lExclusive )
   IF .NOT. lOk
    EXIT
   ENDIF
 NEXT

 IF .NOT. lOk
   CLOSE DATABASES
 ENDIF
 RETURN lOk

FUNCTION AbreUmArquivo( cArquivo, lExclusive )

 LOCAL nSelect

 lExclusive := iif( lExclusive == NIL, .F., lExclusive )

 // Qual o tamanho da extensao de cArquivo? Algum, tem mais de 8 digitos?
 // Verifique.
 IF .NOT. File( cArquivo + ".dbf" )
   MsgExclamation( "Arquivo " + cArquivo + ".dbf não localizado" )
   RETURN .F.
 ENDIF

 nSelect := Select( cArquivo ) // caso já esteja aberto, usa mesma área

 SELECT ( nSelect )

 IF lExclusive

   USE ( cArquivo ) NEW EXCLUSIVE ALIAS cArquivo

 ELSE

   // USE TIPOVAC INDEX TIPOVAC NEW SHARED ALIAS TIP

   USE ( cArquivo ) NEW SHARED ALIAS cArquivo

 ENDIF

 IF NetErr()
   MsgExclamation( "Erro NetErr() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF .NOT. Used()
   MsgExclamation( "Erro Used() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF Select( cArquivo ) == 0
   MsgExclamation( "Erro Select() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF Upper( Alias() ) != Upper( cArquivo )
   MsgExclamation( "Erro Alias() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 RETURN AbreIndice( cArquivo )
 
abs.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ALIAS does not exist

Mensagem por Kapiaba »

Como eu abro os meus arquivos:

Código: Selecionar todos

// ------------------------------------------------------------------------
// Fun‡Æo.....: NetUse
// Descri‡Æo..: Abre um Arquivo DBF, em modo EXCLUSIVE (.F.), ou SHARED (.T.)
// Par metros : cDbf      -> Nome da Base de Dados
//              lShared   -> SHARED (.T.), EXCLUSIVE (.F.)
// Devolve ..: .T.       -> Si se ha podido abrir.
//             .F.       -> Si no se ha podido abrir.
// ------------------------------------------------------------------------

FUNCTION NetUse( cDbf, lShared )

   LOCAL cAlias := cFileName( cDbf )
   LOCAL bAlias := cFileName( cDbf )

   // CONTROLE DE PARAMETROS DE ENTRADA =====================
   If cDbf = NIL .OR. !File( cDbf + ".DBF" )
      MsgStop( "NOME DO ARQUIVO INCORRETO" + CRLF + CRLF + ;
               "NÃO ACHEI BANCO DE DADOS." + CRLF + CRLF + ;
               cDbf + ".DBF", "ERRO FATAL!!" )
      RETURN( .F. )
   ENDIF

   IIf( lShared = NIL, lShared := .F., lShared )
   // ======================================================

   IF lShared = .T.
      USE ( cDbf ) ALIAS ( cAlias := GetNewAlias( cAlias ) ) ;
      VIA "DBFCDX" SHARED NEW
   ELSE
      USE ( cDbf ) ALIAS ( cAlias ) VIA "DBFCDX" EXCLUSIVE NEW
   ENDIF

   IF !NetErr()
      RETURN( .T. )
   ENDIF

   // Se nÆo podemos abrir, solicita repeti‡Æo
   MsgStop( "IMPOSSIVEL ABRIR BANCO DE DADOS: " + cAlias + CRLF + ;
            OemToAnsi( "BLOQUEADO POR OUTRO USUµRIO." ), ;
            "ERRO FATAL DE REDE! FECHAR BANCO DE DADOS." )

RETURN( .F. )
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ALIAS does not exist

Mensagem por Kapiaba »

Caso alguem queira usar, aqui o complemento:

Código: Selecionar todos

// ------------------------------------------------------------------------
FUNCTION GetNewAlias( cAlias )
   STATIC n := 0
RETURN cAlias + StrZero( ++n, 4 )
// ------------------------------------------------------------------------
Abs
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ALIAS does not exist

Mensagem por alxsts »

Olá!

Este negócio de usar a mesma área pode dar problema, creio eu. Eu faria assim:

Código: Selecionar todos

FUNCTION AbreArquivos( acArquivos, lExclusive )
 LOCAL lOk := .T.
 FOR nCont = 1 TO Len( acArquivos )
   lOk := AbreUmArquivo( acArquivos[ nCont ], lExclusive )
   IF .NOT. lOk
    EXIT
   ENDIF
 NEXT

 IF .NOT. lOk
   CLOSE DATABASES
 ENDIF
 RETURN lOk

FUNCTION AbreUmArquivo( cArquivo, lExclusive )

 LOCAL nSelect

 lExclusive := iif( lExclusive == NIL, .F., lExclusive )

 // Qual o tamanho da extensao de cArquivo? Algum, tem mais de 8 digitos?
 // Verifique.
 IF .NOT. File( cArquivo + ".dbf" )
   MsgExclamation( "Arquivo " + cArquivo + ".dbf não localizado" )
   RETURN .F.
 ENDIF

/*--------------------------------------------------------------------------------------*/  
 IF (nSelect := Select( cArquivo ) ) > 0 // caso já esteja aberto, usa mesma área
    SELECT ( nSelect )
    DbCloseArea()
 ENDIF
/*--------------------------------------------------------------------------------------*/

 IF lExclusive

   USE ( cArquivo ) NEW EXCLUSIVE ALIAS cArquivo  /* Aqui, como está usando NEW, não utilizaria necessariamente a mesma área */

 ELSE

   // USE TIPOVAC INDEX TIPOVAC NEW SHARED ALIAS TIP

   USE ( cArquivo ) NEW SHARED ALIAS cArquivo

 ENDIF

 IF NetErr()
   MsgExclamation( "Erro NetErr() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF .NOT. Used()
   MsgExclamation( "Erro Used() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF Select( cArquivo ) == 0
   MsgExclamation( "Erro Select() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 IF Upper( Alias() ) != Upper( cArquivo )
   MsgExclamation( "Erro Alias() ao abrir " + cArquivo )
   RETURN .F.
 ENDIF
 RETURN AbreIndice( cArquivo )
 
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ALIAS does not exist

Mensagem por JoséQuintas »

Código: Selecionar todos

nSelect := Select( "alias" )
Isso retorna 0 (ZERO) se o arquivo não estiver aberto, ou o número da área se já estiver aberto.
E o SELECT seguinte usa essa informação. Sendo zero, equivale a uma área nova.

Só lembrando: O erro é em um ambiente específico.

Uso o próprio nome do arquivo como alias, assim não tem erro.
Inclusive não entendi num dos exemplos, qual a necessidade de numerar o alias.

Vi uma coisa no grupo do Harbour, onde usavam alias infinitos pra poder rodar várias janelas e achei uma loucura isso.
Seria pra algo assim?

O alias vai também na hora de salvar/pegar informações do arquivo, por isso acho que não compensa inventar nada diferente.

Código: Selecionar todos

   REPLACE ;
      jpcadas->cdEndereco WITH mcdEndereco, jpcadas->cdNumero   WITH mcdNumero,   jpcadas->cdCompl    WITH mcdCompl, ;
      jpcadas->cdBairro   WITH mcdBairro,   jpcadas->cdCidade   WITH mcdCidade,   jpcadas->cdUF       WITH mcdUf, ;
      jpcadas->cdCep      WITH mcdCep,      jpcadas->cdContato  WITH mcdContato,  jpcadas->cdTelefone WITH mcdTelefone
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ALIAS does not exist

Mensagem por alxsts »

Olá!

Não estou testando os códigos. Apenas imaginei que se Select() retornar maior que zero e você usar o arquivo já aberto na mesma área e com o mesmo Alias(), vai gerar um erro "Alias already in use".
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ALIAS does not exist

Mensagem por JoséQuintas »

Bem lembrado, poderia ser uma condição.
Talvez um USE antes de abrir, só pra garantia.
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/
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

ALIAS does not exist

Mensagem por sygecom »

Eu uso um truque que foi postado aqui pelo Dudu_xbase a muitos anos atraz e que funciona até hoje.
Quando da erro de ALIAS NOT EXIST eu interpreto o erro no errorsys.prg e abro a tabela que uso o mesmo nome de ALIAS e retorna a aplicação sem causar o erro

Código: Selecionar todos

   IF oError:genCode == EG_NOALIAS  // NÃO ACHOU O ALIAS ENTÃO ABRE O BANCO COMPARTILHADO
      cALIAS:=VALIDA_NOME_TAB(oError:operation)

         IF Use_Arq(cALIAS,oError:operation,.T.,.F.,.F.,.T.)=.T.  // aqui a minha função para abrir tabelas 
            RETURN .T.
         ENDIF
   ENDIF
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

ALIAS does not exist

Mensagem por jairfab »

Você poderia postar a função que abre o arquivo?
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

ALIAS does not exist

Mensagem por janio »

Eu gostaria de saber como é função VALIDA_NOME_TAB(oError:operation) tbm!

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Responder