Ir para conteúdo
  • Cadastre-se

dev botao

Tms Aurelius, Erro "index _____ Already Exists"


Ver Solução Respondido por assdias,
  • Este tópico foi criado há 1516 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?
 
 
Link para o comentário
Compartilhar em outros sites

  • Solution

 

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;
Link para o comentário
Compartilhar em outros 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;
Editado por assdias
Link para o comentário
Compartilhar em outros sites

  • 4 anos depois...
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?

Link para o comentário
Compartilhar em outros sites

  • Moderadores

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

  • Curtir 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...