Página 1 de 1

ALIAS does not exist

Enviado: 22 Mar 2015 07:36
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?

ALIAS does not exist

Enviado: 24 Mar 2015 09:47
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

ALIAS does not exist

Enviado: 24 Mar 2015 10:51
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.

ALIAS does not exist

Enviado: 24 Mar 2015 12:11
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.

ALIAS does not exist

Enviado: 24 Mar 2015 12:16
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. )

ALIAS does not exist

Enviado: 24 Mar 2015 12:24
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

ALIAS does not exist

Enviado: 24 Mar 2015 12:27
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 )
 

ALIAS does not exist

Enviado: 24 Mar 2015 13:09
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

ALIAS does not exist

Enviado: 24 Mar 2015 13:26
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".

ALIAS does not exist

Enviado: 24 Mar 2015 15:33
por JoséQuintas
Bem lembrado, poderia ser uma condição.
Talvez um USE antes de abrir, só pra garantia.

ALIAS does not exist

Enviado: 25 Mar 2015 00:13
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

ALIAS does not exist

Enviado: 25 Mar 2015 09:00
por jairfab
Você poderia postar a função que abre o arquivo?

ALIAS does not exist

Enviado: 26 Mar 2015 10:27
por janio
Eu gostaria de saber como é função VALIDA_NOME_TAB(oError:operation) tbm!

Janio