ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Erro de chave primaria

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
eduardoserrao
Novato
Novato


Registrado: Segunda-Feira, 28 de Novembro de 2016
Mensagens: 78

MensagemEnviada: Ter Nov 19, 2019 11:44 am    Assunto: Erro de chave primaria Responder com Citação

Bom dia,
Estou com problemas ao tentar inserir dois registros simultaneamente no banco de dados. Estou usando o unigui, e executando a mesma aplicação em em 2 computadores diferentes, em algumas situações quando aciono o botão para salvar um registro nas duas máquinas simultaneamente e estou recebendo a mensagem:

[FireDAC][Phys][FB]violation of PRIMARY or UNIQUE KEY constraint "INTEG_772" on table "ORDEMSERVICO"

Código:
procedure gravar;
var
  ORSEA13ID : String;
begin
  try
    if not UniMainModule.DB.InTransaction then
      UniMainModule.DB.StartTransaction;
    ORSEA13ID := UniMainModule.getCodigoAutomatico;
    q := TFDQuery.Create(nil);
    q.Connection := UniMainModule.DB;
    q.SQL.Add('INSERT INTO ORDEMSERVICO (ORSEA13ID, EMPRICOD, ORSEICOD, ORSEDDATA');
    q.SQL.Add('VALUES (:orsea13id, :empricod, :orseicod, :orseddata');
    q.ParamByName('orsea13id').AsString := ORSEA13ID;
    q.ParamByName('empricod').AsInteger := UniMainModule.idEmpresaPadraoTerm;
    q.ParamByName('orseicod').AsInteger := codigoOS;
    q.ParamByName('orseddata').AsString := FormatDateTime('mm/dd/yyyy', dtData.DateTime);

    if i = 0 then
      teste;

    q.ExecSQL;
    if UniMainModule.DB.InTransaction then
      UniMainModule.DB.Commit;
    FreeAndNil(q);
  except
    on E : Exception do begin
      UniMainModule.DB.Rollback;
      ShowMessageN(E.Message);
    end;
  end;
end;


A chave primária da tabela é a coluna ORSEA13ID, e o metodo getCodigoAutomatico faz um select max na tabela e incrementa + 1.

Como o problema acontecia as vezes eu criei este método para forçar executar o mesmo método 2 vezes.

Código:
procedure teste;
begin
  i := 1;
  gravar;
end;


Alguém poderia me ajudar?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Ter Nov 19, 2019 1:43 pm    Assunto: Responder com Citação

Primeiro de tudo, é saber como você está gerando a chave primária, pois desta forma saberemos o que está acontecendo.

Não tente fazer manualmente ou você terá problemas, de preferência gere o ID no beforepost, assim evita-se de perder sequência ato-a, mas não evita-se caso dê algum erro, pois aí vai ter sido gerado o sequence/generator ID.

Assim você incrementa no banco o sequence, gravando diretamente no campo é pior, pois o sequence é independente de transação, ele será disparado mesmo que ocorra um erro.


No seu caso o que está ocorrendo é que ele pega o número do ID antes de gravar e com este número ele tenta fazer algo, mas não é incrementado antes de salvar, daí a violação de chave.


Somente em master detail eu gero antes o ID, caso contrário deixo para o banco resolver.
Visto que em master detail necessita do ID para gravar o detalhe, sem o qual dá problema na gravação.




bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB