Página 1 de 1

Erro Nome de alias duplicado

Enviado: 08 Nov 2012 01:15
por cjp
Pessoal, alguém saberia me explicar o que significa este erro:

Código: Selecionar todos

Error DBCMD/1011 Nome de alias duplicado: ATCAM.
Não consigo identificar nem a origem do erro, só sei que ele começou a dar depois que passei a usar a cláusula SHARED no USE.

Alguém poderia me ajudar, por favor?

Estou compilando com o Harbour, hbmk2. A máquina onde deu o erro está com o XP instalado.

Erro Nome de alias duplicado

Enviado: 08 Nov 2012 04:22
por Jairo Maia
Olá Inácio,

Este erro significa que você está tentando abrir um aliás que já está aberto. Apenas achei estranho a tradução do Harboor: Nome de Aliás duplicado. A rigor é: Alias already in use, ou seja, aliás já está em uso, mas enfim, tente da seguinte forma:

Código: Selecionar todos

If Select( "ATCAM" ) = 0
 Use ATCAM Shared New
Else
 Select ATCAM
Endi

Erro Nome de alias duplicado

Enviado: 08 Nov 2012 08:36
por Pablo César
Complementando o que o amigo Jairo já falou.

Se você está usando alguma função como esta indicada pelo Sr. Toledo, função muito boa para abertura de Dbf principalmente em rede. Note que precisa passar o segundo parâmetro xcAlias, podendo ser numéro mas do tipo caracter:

Código: Selecionar todos

IF !Abre_Dbf("Arquivo","Alias",.T.,10)  ou  IF !Abre_Dbf("Arquivo","1",.T.,10)
   Alert("Não foi possível abrir o Arquivo")
   RETURN
ENDIF
O terceiro parâmetro ( aqui .T. ) é para indicar que o arquivo seja aberto em modo exclusivo e 10 é o numero de tentativas, enquanto está sendo ocupado por outro. Note também que a função faz uma verificação nas primeiras linhas desse código do Sr. Toledo:

IF EMPTY(SELECT(xcAlias))

Se já existe, este é apenas chamado e não tenta abrir outro. Talvez você esqueceu de fechar o arquivo ou não está utilizando uma função de controle como esta.

Erro Nome de alias duplicado

Enviado: 10 Nov 2012 01:48
por cjp
Pablo, eu não conhecia essa função do Toledo, mas havia criado algo semelhante. Só que não tinha pensado nessa parte, pois não usava a shared. Coloquei isso agora e deu certo.

Jairo, o que achei mais estranho é que, ao estudar a shared no NG, observei que ele informa que, embora não seja recomendável, é possível abrir o mesmo arquivo duas vezes com a cláusula shared. Não era pra dar erro, né?

De toda forma, ficou ótimo assim. Muito obrigado a ambos.

Inacio

Erro Nome de alias duplicado

Enviado: 10 Nov 2012 03:18
por Pablo César
embora não seja recomendável, é possível abrir o mesmo arquivo duas vezes com a cláusula shared
Não, pelo contrário... é sempre recomendável quando se trabalha em rede, então deve sempre usar-se SHARED.

Veja este tutorial que irá ajudar a entender o bloqueio de arquivos conforme abertura: https://pctoledo.org/forum/viewto ... 368#p79365

Erro Nome de alias duplicado

Enviado: 10 Nov 2012 04:33
por Jairo Maia
cjp escreveu:Jairo, o que achei mais estranho é que, ao estudar a shared no NG, observei que ele informa que, embora não seja recomendável, é possível abrir o mesmo arquivo duas vezes com a cláusula shared. Não era pra dar erro, né?
Sim! Era pra dar erro! Você interpretou errado. Como você mesmo disse: Abrir o Arquivo. Arquivo é uma coisa, e Alias é outra totalmente diferente. Shared = Compartilhado, permite você abrir o arquivo tantas vezes quantas máquinas na rede o estiverem usando, e na mesma máquina quantas vezes se fizer necessário. Pessoalmente entendo que necessário é apenas uma. Porém, no mesmo ambiente, ou seja, na mesma máquina, o ALIAS pode usar SOMENTE UMA AREA. Se você quer o mesmo arquivo aberto um monte de vezes, tem que atribuir nomes de aliases diferentes:

Código: Selecionar todos

Function Main()

 Use ATCAM Alias Atcam1 Shared New
 Use ATCAM Alias Atcam2 Shared New
 Use ATCAM Alias Atcam3 Shared New
 // Use etc...

 Sele Atcam1
 ? Alias()

 Sele Atcam2
 ? Alias()

 Sele Atcam3
 ? Alias()

 //Sele etc...

Return Nil

Erro Nome de alias duplicado

Enviado: 10 Nov 2012 10:35
por Pablo César
Jairo, o que achei mais estranho é que, ao estudar a shared no NG, observei que ele informa que, embora não seja recomendável, é possível abrir o mesmo arquivo duas vezes com a cláusula shared. Não era pra dar erro, né?
Abrir no mesmo computador ? Ahhh eu achava que referia-se abertura na rede... por isso respondi daquele jeito. rs deve ter sido cansaço pelo horário. Mas não abra duas vezes o arquivo !

Analise, o aplicativo terá que fazer alterações únicas e esse procedimento não corre o risco de outro usuário estar ao mesmo tempo acessando um ou ou mais Dbfs ? Se não corre risco, abra em modo exclusivo.

Por isso é importante que a sua função para abertura do seu BD controle se o Alias já está em aberto, assim não corre o risco de abrir duas vezes.

Erro Nome de alias duplicado

Enviado: 12 Nov 2012 00:46
por cjp
Entendido, meus amigos. Fiz a adaptação e agora está funcionando.

Muito obrigado.

Erro Nome de alias duplicado

Enviado: 23 Nov 2012 22:22
por cjp
Pessoal, eu achei que tinha resolvido este problema, mas ainda está dando o mesmo erro.

Estou chamando a função assim:

Código: Selecionar todos

			   if select(nomebase)#0
			              sele (nomebase)
 				     return .t.
                                  else
                                      use (nomebase) shared
			          endif
Está dando o erro Error DBCMD/1011 Nome de alias duplicado: ATCAM na linha sele (nomebase).

Será que o problema é porque estou passando o nome da base como parâmetro? Acho que não, né? Sempre funcionou.

Ou seria porque o nome da base (atcam.dbf) coincide com o nome do parâmetro (atcam)? Se bem que isto também sempre funcionou antes de usar a cláusula shared.

Estou fazendo algo errado?

Erro Nome de alias duplicado

Enviado: 24 Nov 2012 07:28
por asimoes
Tenta isso:

Código: Selecionar todos

IF SELECT(nomebase) == 0
   USE &nomebase. SHARED NEW
ELSE
   DbSelectArea(nomebase)
ENDIF

Erro Nome de alias duplicado

Enviado: 25 Nov 2012 00:42
por cjp
Fiz isso. Até agora não deu mais o erro. Vou testar mais e aviso depois. Obrigado.

Erro Nome de alias duplicado

Enviado: 25 Nov 2012 09:08
por asimoes
CJP,

Mostre-nos a todo conteúdo da função onde ocorre o erro, assim poderemos sugerir uma solução.

[]´s

Erro Nome de alias duplicado

Enviado: 17 Dez 2012 00:11
por cjp
Desculpe a demora.

Aí vai o conteúdo da função inteira:

Código: Selecionar todos

function usebase(nomebase,exclusivo)
         vezusb=0
         do while .t.
			      use &nomebase. shared
               if neterr()
                  vezusb++
                  if ("TAR2P"$upper(hb_progname()) .and. vezusb>160) .or. (at("TAR2P",upper(hb_progname()))=0 .and. vezusb>80)
                     return .f.
                  endif
                  @ maxrow(),1 clear to maxrow(),79
                  @ maxrow(),5 say "Base "+upper(nomebase)+" ocupada; aguarde liberação ("+alltrim(str(vezusb))+")"
                  desiste:=inkey(8)
                  if desiste= 27 //K_ESC
                     conf="N"
                     @ maxrow()-2,1 clear to maxrow(),79
                     @ maxrow()-1,5 say "Confirma abandono da tentativa da utilização?"get conf pict "@!"
                     read
                     @ maxrow()-2,1 clear to maxrow(),79
                     if conf="S"
                        return .f.
                     endif
                  endif
               else
                  exit
               endif
               @ maxrow(),5 clear to maxrow(),79
            else
               return .f.
            endif
         enddo
return .t.

O que tenho notado é que o erro ocorre apenas quando a área em uso é a 3, sendo que a base em questão já está em uso na área 1. Vejam:

Código: Selecionar todos

Ocorreu o erro: Error DBCMD/1011  Nome de alias duplicado: ATCAM
Data: 16/12/12; hora: 22:52:17
Programa......: C:\criancas\criancas.exe Na função.....: DBUSEAREA Na linha......: 0 Base em uso...: 
Área em uso...: 3
Pasta.........: criancas
Usuário.......: Y
Versão........: 11/12/12
Área 1........: ATCAM
Área 2........: 
Área 3........: 
Área 4........: 
Área 5........: 
Área 6........: 


Erro Nome de alias duplicado

Enviado: 17 Dez 2012 01:05
por asimoes
Olá cjp,

Acredito que essa pequena alteração vai resolver o seu problema, susbstitua a sua função usebase() por esse código:

Código: Selecionar todos

function usebase(nomebase,exclusivo)
         vezusb=0
         do while .t.
               //(---Inicio ALteração---)//
               //use &nomebase. shared
               if select(nomebase) = 0
                  use &nomebase. shared new
               else
                  DbSelectArea(nomebase)
               endif
               //(---Fim ALteração---)//
                if neterr()
                  vezusb++
                  if ("TAR2P"$upper(hb_progname()) .and. vezusb>160) .or. (at("TAR2P",upper(hb_progname()))=0 .and. vezusb>80)
                     return .f.
                  endif
                  @ maxrow(),1 clear to maxrow(),79
                  @ maxrow(),5 say "Base "+upper(nomebase)+" ocupada; aguarde liberação ("+alltrim(str(vezusb))+")"
                  desiste:=inkey(8)
                  if desiste= 27 //K_ESC
                     conf="N"
                     @ maxrow()-2,1 clear to maxrow(),79
                     @ maxrow()-1,5 say "Confirma abandono da tentativa da utilização?"get conf pict "@!"
                     read
                     @ maxrow()-2,1 clear to maxrow(),79
                     if conf="S"
                        return .f.
                     endif
                  endif
               else
                  exit
               endif
               @ maxrow(),5 clear to maxrow(),79
            else
               return .f.
            endif
         enddo
return .t.