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á 1804 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

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?
 
 
  • Solution
Postado

 

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;
Postado (editado)

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

  • Moderadores
Postado

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_Transparent-02.png
 

 

  • Este tópico foi criado há 1804 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.