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