Jump to content

logo_acbr_paygo.png

Chegou o TEF ACBr PayGo
Seja um revendedor e ofereça uma solução completa para seu cliente.


botao_saibamais.png

beneficios.png

Curso Dominando o ACBrMonitor
Novo Módulo Soluções de Varejo
Assine o SAC ACBr em qualquer plano e tenha acesso

Saiba Mais

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba Mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

assdias

ANSWERED Tms Aurelius, Erro "index _____ Already Exists"

  • Este tópico foi criado há 159 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui

Recommended Posts

Bom dia!

 

Tenho usado o TMS Aurelius e estou tendo dificuldades em classes que faz uso de JoinColumn, na seguinte situação:

 

    [Association([TAssociationProp.Lazy], [TCascadeType.SaveUpdate])]
    [JoinColumn('VENDAPRAZOCONTACONTABIL_ID', [TColumnProp.Required], 'ID')]
    FVendaPrazoContaContabil: Proxy<TPlanoContas>;
 
    [Association([TAssociationProp.Lazy], [TCascadeType.SaveUpdate])]
    [JoinColumn('VENDAVISTACONTACONTABIL_ID', [TColumnProp.Required], 'ID')]
    FVendaVistaContaContabil: Proxy<TPlanoContas>;
 
Nesse caso, na geração da tabela do banco de dados (Firebird) ele cria a relação do primeiro campo, mais no segundo ocorre o seguinte erro:
 
Index FK_PDVCONFIGURACAO_PLANOCONTAS_ already exists'.
 
*** Pelo que percebi o Aurelius gera o nome da "FK" com o nome da tabela principal + o nome da tabela FK, onde nesse caso deveria numera-las ou ter alguma forma para informar o nome da relação. Ou o firebird (2.5) suportar nome de FK com mais de 31 caracteres.
 
Alguém já passou por essa situação?
 
 

Share this post


Link to post
Share on other sites

 

Bom dia!

 

Tenho usado o TMS Aurelius e estou tendo dificuldades em classes que faz uso de JoinColumn, na seguinte situação:

 

    [Association([TAssociationProp.Lazy], [TCascadeType.SaveUpdate])]
    [JoinColumn('VENDAPRAZOCONTACONTABIL_ID', [TColumnProp.Required], 'ID')]
    FVendaPrazoContaContabil: Proxy<TPlanoContas>;
 
    [Association([TAssociationProp.Lazy], [TCascadeType.SaveUpdate])]
    [JoinColumn('VENDAVISTACONTACONTABIL_ID', [TColumnProp.Required], 'ID')]
    FVendaVistaContaContabil: Proxy<TPlanoContas>;
 
Nesse caso, na geração da tabela do banco de dados (Firebird) ele cria a relação do primeiro campo, mais no segundo ocorre o seguinte erro:
 
Index FK_PDVCONFIGURACAO_PLANOCONTAS_ already exists'.
 
*** Pelo que percebi o Aurelius gera o nome da "FK" com o nome da tabela principal + o nome da tabela FK, onde nesse caso deveria numera-las ou ter alguma forma para informar o nome da relação. Ou o firebird (2.5) suportar nome de FK com mais de 31 caracteres.
 
Alguém já passou por essa situação?
 

 

 

Resolvi o problema acima, segue solução:

 

Alterado no TMS Aurelius a unit: "Aurelius.Sql.AnsiSQLGenerator" 
 
function TAnsiSQLGenerator.GetForeignKeyName(ForeignKey: TForeignKeyMetadata): string;
begin
  Result := 'FK_';
 
  if ForeignKey.FromTable.Schema <> '' then
    Result := Result + ForeignKey.FromTable.Schema + '_';
 
  Result := Result + ForeignKey.FromTable.Name + '_';
 
  if ForeignKey.ToTable.Schema <> '' then
    Result := Result + ForeignKey.ToTable.Schema + '_';
 
  Result := Result + ForeignKey.ToTable.Name + '_' +
    ConcatColumnNames(ForeignKey.FromColumns, '_');
 
  // Original: Result := Copy(Result, 1, GetMaxConstraintNameLength);
 
 // Novo, quando o numero de caracteres do nome for maior que o suportado pelo banco de dados, numera as FK :
  if not (Length(Result) > GetMaxConstraintNameLength) then
    Result := Copy(Result, 1, GetMaxConstraintNameLength)
  else
    Result := Format('%s%3.3d',[Copy(Result, 1, GetMaxConstraintNameLength-3),
      ForeignKey.FromTable.ForeignKeys.Count]);
 
end;

Share this post


Link to post
Share on other sites

Eu procurei e não encontrei essa property "MaxConstraintNameLength" só achei funções "GetMaxConstraintNameLength" e mesmo que existisse o firebird só suporta 31 caracteres para nomes de FK.  

 

Então falta uma implementação como essa que fiz ou algo mais sofisticado... para dar suporte a nomes longos de FK.

 

*** Essa função "GetMaxConstraintNameLength " na unit: Aurelius.Sql.Firebird.pas, esta fixo o valor "MaxConstraintNameLength",

eu poderia ter implementado aqui a solução (só para o Firebird). Mas, achei melhor colocar no ancestral, para não ter problemas futuros com outros bancos. Da forma que fiz estou considerando o "MaxConstraintNameLength" de cada banco:

 

function TFirebirdSQLGenerator.GetMaxConstraintNameLength: Integer;
begin
  Result := 31;
end;
Edited by assdias

Share this post


Link to post
Share on other sites
Em 02/03/2015 at 19:45, assdias disse:

Eu procurei e não encontrei essa property "MaxConstraintNameLength" só achei funções "GetMaxConstraintNameLength" e mesmo que existisse o firebird só suporta 31 caracteres para nomes de FK.  

 

Então falta uma implementação como essa que fiz ou algo mais sofisticado... para dar suporte a nomes longos de FK.

 

*** Essa função "GetMaxConstraintNameLength " na unit: Aurelius.Sql.Firebird.pas, esta fixo o valor "MaxConstraintNameLength",

eu poderia ter implementado aqui a solução (só para o Firebird). Mas, achei melhor colocar no ancestral, para não ter problemas futuros com outros bancos. Da forma que fiz estou considerando o "MaxConstraintNameLength" de cada banco:

 

function TFirebirdSQLGenerator.GetMaxConstraintNameLength: Integer;
begin
  Result := 31;
end;

Boa tarde irmao, sei que o post é antigo, mais estou com mesmo problema. fiz como vc mencionou acima e nada, o tms aurelius fica sempre tentando recriar os indices mesmo eu apontando eles na columm ou unique key, tem como resolver isso?

Share this post


Link to post
Share on other sites

A explicação é que o Unique Key só vai existir no create do banco depois disso ele não consegue mais ser criado então acho que vai precisar remover se o banco já existe.

Caso você tenha a licença do TMS Aurelius tem um grupo oficial do mesmo . segue o link

https://join.skype.com/xUZ6uQ7PVe5S

  • Like 1

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
http://www.juliomarmarchetti.com.br
Embarcadero MVP
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Share this post


Link to post
Share on other sites
  • Este tópico foi criado há 159 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...