update affected more than 1 record

14/01/2006

0

Eu tenho duas tabelas , uma com uma primary key e a outra com uma foreign key, a tabela com a primary key eu edito sem problemas mas a tabela com a foreign key nao da para editar, nao importa qual campo e registro eu tentei editar que eu recebo o erro ´update affected more than 1 record ´


Joe_wah

Joe_wah

Responder

Post mais votado

14/01/2006

Essa tabela só tem a Foreign Key? Não existe chave primária? Se positivo, inclua a opção [b:58ef4b7d41]poAllowMultiRecordUpdates[/b:58ef4b7d41] na propriedade [b:58ef4b7d41]Options[/b:58ef4b7d41] do seu TDataSetProvider...


Bruno Belchior

Bruno Belchior
Responder

Mais Posts

14/01/2006

Joe_wah

Valeu.Isso resolveu o problema da mensagem de erro, mas agora ta acontecendo o seguinte, eu atualizo um unico registro e todos os outros registros que possuem a mesma foreign key viram copias do registro que eu atualizei.Eu quero editar só um e deixar os outros como estão.


Responder

14/01/2006

Joe_wah

Observei uma coisa, na verdade é o seguinte a tabela tem 3 colunas:

CODIGO(que é a foreign key)
DATA(que é um date)
INFO ( um blob memo)

eu to tentando atualizar só o campo INFO, e só viram cópias do registro que eu atualizei os registros que além da mesma chave estrangeira, tenha a mesma data.


Responder

14/01/2006

Edilcimar

vou dar um exemplo com ibtable, mas é válido para qualquer coisa, ibtable1 é primária e ibtable2 é detalhe
try
with ibtable1 do
begin
faça o que quiser com ela para achar o registro e alterar qualquer coisa uma vez que aqui vc não tem problema
with ibtable2 do
begin
edit; ->aqui vc vai trocar todos os campos que queira, menos o da chave estrangeira é claro
fieldbyname(´DATA´).Value := NovaData;
fieldByName(´INFO´).Assign(Memo1.Lines);
post;
ibtransaction1.commit;
except
showmessage(´xxxxxx´);
ibtransaction1.rollback;
end;
end;
end;


Responder

14/01/2006

Bruno Belchior

A questão é que você tem chaves estrangeiras, mas não tem um campo de idêntificação única (chave primária), logo quando você manda atualiza o campo ele atualizará todos os registros com a chave estrangeira igual (a própria mensagem de erro inicial sugeria isso).... sugiro que repense o seu projeto de dados...


Responder

14/01/2006

Joe_wah

eu coloquei uma chave primaria ( no caso um generator ) na tabela e resolveu o problema mas apareceu outros 2:

1 - Se eu tentar inserir mais de 2 registros que possuam a mesma chave estrangeira da erro key violation, se tiverem chaves estranegiras diferentes nao da problema nenhum, e eu até consigo adicionar varios com a mesma chave estrangeira desde que somente um por cada execução do programa.

2 - Eu consigo editar qualquer registro sem probglemas exceto um registo que eu tenha acabado de criar, neste caso o erro é ´´Record not found or Changed by Another User´


Responder

14/01/2006

Joe_wah

correção ´mais de 1 registro ´, não ´mais de 2´


Responder

14/01/2006

Edilcimar

mostra o código inteiro para que alguém ache o erro, caso contrário ficaremos aqui discutindo à toa e não chegaremos a lugar algum, portanto sempre que tiver algum problema siga os seguintes passos
1) banco de dados usado
2) componente usado
3) código do processo onde está acontecendo o erro


Responder

14/01/2006

Joe_wah

Notei agora que na verdade o erro não deixa de ocorrer quando as chaves estrangeiras sao diferentes.

O erro deixa de ocorrer toda hora que eu chamo o select dessa tabela.Se eu executo o select sempre antes de fazer cada inserção de registro ou atualização não da erro nenhum, porém se chamo só uma vez , o insert/edit só funciona igualmente uma vez.

Esse é código do select que exibe os dados que quero da tabela no Grid:(é este codigo todo que tenho que executar pra nao dar erro, o DataSet2 é a tabela problematica, o DataSet1 trata-se de outra tabela menos problematica, no 1 so tenho o problema do update)

DataModule1.ClientDataSet2.Close;
paciente := DataModule1.ClientDataSet1.FieldByName(´CODIGO´).AsInteger;
DataModule1.SQLDataSet2.CommandText := ´SELECT * FROM HISTORICO_PACIENTES WHERE CODIGO=:c_paciente ORDER BY DATA DESC´;
DataModule1.SQLDataSet2.ParamByName(´c_paciente´).asinteger := paciente;
DataModule1.ClientDataSet2.Open;

e para fazer as inserções e updates simplesmente uso

ClientDataset.Insert; (ou .Edit; )

e ClientDataSet.ApplyUpdates(0);

Chamar o codigo toda hora resolveria, mas seria uma gambiarra, quero achar a raiz do problema. Valeu


Responder

14/01/2006

Joe_wah

e to usando Firebird 1.5 DbEpress+ClientDataSet , Driver Interbase, Delphi 7


Responder

15/01/2006

Joe_wah

Ainda nao consegui resolver o problema, mas descobri que é algo relacionado ao generator, se eu tiro o generator e gero a chave primaria ´na mao´ , funciona ...E por algum motivo manda um SELECT no SQLDataSet faz o generator funcionar como deveria...


Responder

15/01/2006

Joe_wah

Consegui resolver o problema , mas depois voltuou a mesma coisa mesmo sem eu ter feito qualquer alteracao, pra piorar depois mudou de erro, novamente sem alteração de codigo..Resultado: desisti de usar o dbexpress, vou partir pra outro


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar