Alterar registros com MySQL - DBExpress
Pessoal,
Tenho uma dúvida tremenda aqui no meu formulário de cadastro, onde utilizo delphi 2010 e Mysql 5.1. Eu consigo normalmente cadastrar os meus registros e ir colocando dentro do Banco de Dados, inclusive utilizando um código que peguei aqui no site da DevMedia, sobre o autoincremento do mysql.
Até ai tudo bem, o problema está sendo em editá-lo, pois quando eu faço as alterações e dou o ApllyUpdates, ele cria um novo ID para o campo e a partir daí, ele fica dando erro de key violation, não sei mais o que fazer, pois cadastrar novos registros está 100%, mais quando chega a parte de alteração não saiu do canto.
Eu sou iniciante e estou aprendendo utilizando o MySQL, pois já venho do PHP e tenho familiaridade com esse BD. Queria muito a ajuda de todos, de como eu faço pra alterar um registro, sem alterar o seu ID.
Fico no aguardo. Desde já, muito obrigado.
Francisco Sena
Curtidas 0
Respostas
Wilson Junior
21/04/2010
Como está sendo feito o seu código sobre o auto-incremento?
GOSTEI 0
Francisco Sena
21/04/2010
Eu tou usando o auto-incremento do próprio SQL, usei o MySQL-Front para criar as tabelas e lá utilizei a opção auto-incremento.
Dentro do sistema eu utilizei uns códigos que peguei no curso de uma aplicação financeira qutilizando mysql e delphi 2009, que fala sobre esse ID MySQL, mas, ele tá funcionando normalmente, o problema está só acontecendo quando clico em EDITAR um registro, pois no lugar de manter o mesmo ID, ele gera um novo ID e depois daí, ele não deixa mais cadastrar novos registros, pois dá Key Violation.
Qualquer coisa, se precisar, posto os códigos que fazem o auto-incremente, mas, resaltando, que não é essa parte que está com problema, é NA PARTE DE EDIÇÃO DO REGISTRO.
Dentro do sistema eu utilizei uns códigos que peguei no curso de uma aplicação financeira qutilizando mysql e delphi 2009, que fala sobre esse ID MySQL, mas, ele tá funcionando normalmente, o problema está só acontecendo quando clico em EDITAR um registro, pois no lugar de manter o mesmo ID, ele gera um novo ID e depois daí, ele não deixa mais cadastrar novos registros, pois dá Key Violation.
Qualquer coisa, se precisar, posto os códigos que fazem o auto-incremente, mas, resaltando, que não é essa parte que está com problema, é NA PARTE DE EDIÇÃO DO REGISTRO.
GOSTEI 0
Wilson Junior
21/04/2010
O que você pode fazer é que quando não for INSERT, você não utilizar o auto-incremento. Assim ele não gera um novo ID.
Qualquer dúvida posta o código aí que tentamos lhe ajudar.
Qualquer dúvida posta o código aí que tentamos lhe ajudar.
GOSTEI 0
Francisco Sena
21/04/2010
valeu Wilson,
Mais como eu faria isso ?? Eu sou novato no Delphi e tenho pouquíssima experiência nesse tipo de programação.
Seria alterando algum componente, ou utilizar algum código ??
Agradeço desde já a sua ajuda.
GOSTEI 0
Wilson Junior
21/04/2010
Coloque o seu código aqui para poder lhe ajudar.
Pois não sei se você está gerando o ID diretamente no banco ou via código no Delphi. Coloque aqui para poder lhe ajudar.
Pois não sei se você está gerando o ID diretamente no banco ou via código no Delphi. Coloque aqui para poder lhe ajudar.
GOSTEI 0
Francisco Sena
21/04/2010
esse código fica no Data Module:
procedure TDM.DataModuleCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ComponentCount - 1 do
if Components[I] is TClientDataSet then
begin
TClientDataSet(Components[I]).BeforePost := SetID;
end; end; function TDM.GetID(Table: String): Integer;
var
SqlQuery : TSQLQuery;
begin
SqlQuery := TSQLQuery.Create(Self);
SqlQuery.SQLConnection := SQLCon;
SqlQuery.SQL.Add('SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ' + QuotedStr(Table)); SqlQuery.Open; Result := SqlQuery.Fields[0].Value;
end; procedure TDM.SetID(DataSet: TDataSet);
begin
DataSet.Fields[0].Value := GetID('tbl' + copy(DataSet.Name, 4));
end; Conforme eu falei anteriormente, eu peguei esses códigos de um curso de aplicação financeira com delphi 2009 e mysql... Por favor, me dá essa forcinha, só está faltando essa parte para cocnluir a minha parte dos registros... Agradeço desde ja!
var
I: Integer;
begin
for I := 0 to ComponentCount - 1 do
if Components[I] is TClientDataSet then
begin
TClientDataSet(Components[I]).BeforePost := SetID;
end; end; function TDM.GetID(Table: String): Integer;
var
SqlQuery : TSQLQuery;
begin
SqlQuery := TSQLQuery.Create(Self);
SqlQuery.SQLConnection := SQLCon;
SqlQuery.SQL.Add('SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ' + QuotedStr(Table)); SqlQuery.Open; Result := SqlQuery.Fields[0].Value;
end; procedure TDM.SetID(DataSet: TDataSet);
begin
DataSet.Fields[0].Value := GetID('tbl' + copy(DataSet.Name, 4));
end; Conforme eu falei anteriormente, eu peguei esses códigos de um curso de aplicação financeira com delphi 2009 e mysql... Por favor, me dá essa forcinha, só está faltando essa parte para cocnluir a minha parte dos registros... Agradeço desde ja!
GOSTEI 0
Francisco Sena
21/04/2010
alguma novidade ??
será que tem como resolver ?
GOSTEI 0
Wilson Junior
21/04/2010
procedure TDM.SetID(DataSet: TDataSet);
begin
if TClientDataSet(DataSet).State = dsInsert then
DataSet.Fields[0].Value := GetID('tbl' + copy(DataSet.Name, 4))
;
end;
Espero ter colaborado.
GOSTEI 0