Erro Nome de alias duplicado

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

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro Nome de alias duplicado

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro Nome de alias duplicado

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem 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
Inacio de Carvalho Neto
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro Nome de alias duplicado

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro Nome de alias duplicado

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro Nome de alias duplicado

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem por cjp »

Entendido, meus amigos. Fiz a adaptação e agora está funcionando.

Muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Erro Nome de alias duplicado

Mensagem por asimoes »

Tenta isso:

Código: Selecionar todos

IF SELECT(nomebase) == 0
   USE &nomebase. SHARED NEW
ELSE
   DbSelectArea(nomebase)
ENDIF
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem por cjp »

Fiz isso. Até agora não deu mais o erro. Vou testar mais e aviso depois. Obrigado.
Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Erro Nome de alias duplicado

Mensagem por asimoes »

CJP,

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

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro Nome de alias duplicado

Mensagem 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........: 

Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Erro Nome de alias duplicado

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder