|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
eduardoserrao Novato
Registrado: Segunda-Feira, 28 de Novembro de 2016 Mensagens: 78
|
Enviada: Ter Nov 19, 2019 11:44 am Assunto: Erro de chave primaria |
|
|
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 |
|
|
johnny-walker Moderador
Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Ter Nov 19, 2019 1:43 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|