Deletar registros
bom, tenho um consulta que é exibida no dbgrid todos os campos da tabela usuario, gostaria que quando clicasse no botao excluir, deletasse o registro selecionado!
eu uso delphi e firebird!
eu fiz mais ou menos assim, mais deu errado....
dm.cdsbusu.Close;
dm.cdsbusu.CommandText:='delete from USUARIO where codigo=codigo';
essa linha se nau me engano deve ter um parametro, mais na conseguir fazer dm.cdsbusu.Execute; me ajudem por favor! abraços....
dm.cdsbusu.CommandText:='delete from USUARIO where codigo=codigo';
essa linha se nau me engano deve ter um parametro, mais na conseguir fazer dm.cdsbusu.Execute; me ajudem por favor! abraços....
Thiago Silva
Curtidas 0
Respostas
Bruno Batista
02/12/2009
Boa tarde.
Me parece que você está utilizando ClientDataSet, é só fazer isso.
dm.cdsbusu.Delete;
com isso deletará o registro que o cursor estiver posicionado.
Atenciosamente,
Bruno Moreira Batista.
Me parece que você está utilizando ClientDataSet, é só fazer isso.
dm.cdsbusu.Delete;
com isso deletará o registro que o cursor estiver posicionado.
Atenciosamente,
Bruno Moreira Batista.
GOSTEI 0
Thiago Silva
02/12/2009
esse clientdataset q eestou usando é somente de consulta, o outro é q está ligado com o formulario de cadasttro de usuarios, por isso não há como usar esse comando:
dm.cdsbusu.delete;
obrigado msm assim;
GOSTEI 0
Bruno Batista
02/12/2009
Boa tarde,
Então terá que posicionar o ClientDataSet de cadastro, no registro que deseja excluir.
if (DM.ClientDataSetCadastro.Locate('Chave', DM.ClientDataSetConsulta.FieldByName('CHAVE').Value,[])) then
DM.ClientDataSetCadastro.Delete;
Atenciosamente,
Bruno Moreira Batista.
Então terá que posicionar o ClientDataSet de cadastro, no registro que deseja excluir.
if (DM.ClientDataSetCadastro.Locate('Chave', DM.ClientDataSetConsulta.FieldByName('CHAVE').Value,[])) then
DM.ClientDataSetCadastro.Delete;
Atenciosamente,
Bruno Moreira Batista.
GOSTEI 0
Thiago Silva
02/12/2009
não aconteceu nada, ficou desse jeito o codigo....
begin
if (dm.cdsusu.Locate('CODIGO', dm.cdsbusu.FieldByName('CODIGO').Value,[])) then
begin
dm.cdsusu.Delete;
end; end; o q pode ser? e outra, o codigo q postei anteriormente está totalmente errado?
if (dm.cdsusu.Locate('CODIGO', dm.cdsbusu.FieldByName('CODIGO').Value,[])) then
begin
dm.cdsusu.Delete;
end; end; o q pode ser? e outra, o codigo q postei anteriormente está totalmente errado?
GOSTEI 0
Perivaldo Martins
02/12/2009
você está usando ClientDataSet e escreveu uma instrução informando um parametro mas não o instancia.
então tente mudar seu código para:
dm.cdsbusu.Close;
dm.cdsbusu.CommandText:='delete from USUARIO where codigo = :codigo';
dm.cdsbusu.param.parambyname('codigo').asinteger := StrToInt(Edit1.Text);
dm.cdsbusu.Execute;
Algo mais ou menos assim, teste pq eu não testei, eu geralmente faço a exclusão usando Query.
Boa sorte e bons códigos.
então tente mudar seu código para:
dm.cdsbusu.Close;
dm.cdsbusu.CommandText:='delete from USUARIO where codigo = :codigo';
dm.cdsbusu.param.parambyname('codigo').asinteger := StrToInt(Edit1.Text);
dm.cdsbusu.Execute;
Algo mais ou menos assim, teste pq eu não testei, eu geralmente faço a exclusão usando Query.
Boa sorte e bons códigos.
GOSTEI 0
Thiago Silva
02/12/2009
o consulta é exibida em um dbgrid, entao para funcionar a consulta deve ser igual ao registro selecionado do dbgrid!
ao invés de ser caixa de texto com q vc colocou no parametro
mais como faço isso?
ao invés de ser caixa de texto com q vc colocou no parametro
mais como faço isso?
GOSTEI 0
Paulo Silva
02/12/2009
dm.cdsbusu.Close;
dm.cdsbusu.CommandText:='delete from USUARIO where codigo = :codigo';
dm.cdsbusu.param.parambyname('codigo').asinteger := seuDBGRId.Fields[0].asinteger; dm.cdsbusu.Execute; /coloque o indice do campo no lugar do zero caso seja o primeiro pode manter o zero pois o indice é incrementado apartir do zero ^^
dm.cdsbusu.CommandText:='delete from USUARIO where codigo = :codigo';
dm.cdsbusu.param.parambyname('codigo').asinteger := seuDBGRId.Fields[0].asinteger; dm.cdsbusu.Execute; /coloque o indice do campo no lugar do zero caso seja o primeiro pode manter o zero pois o indice é incrementado apartir do zero ^^
GOSTEI 0
Thiago Silva
02/12/2009
rapaz deu esse seguinte erro
access violation at address 004d84c0 in module 'videolocadora.exe'. Read of address 000000......saberiam me dizer o q pode ser? desde ja abrigado!
GOSTEI 0
Armando Filho
02/12/2009
deve servir para qualquer banco
uses IBODataset;
procedure Deletar(xDatabase:TIBODatabase;xTransaction:TIBOTransaction;Tabela,CampoChave,CompararCom:String;QueryRefresh:TIBOQuery;Generator:String;IniciarTransaction:Boolean=True);
var Query:TIBOQuery;
begin
if (MessageDlg('Confirma a exclusão do registro ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
Query:=TIBOQuery.Create(Application.Owner);
TRY
Query.IB_Connection:=xDatabase;
Query.IB_Transaction:=xTransaction;
if(IniciarTransaction)AND(NOT xTransaction.InTransaction)then
xTransaction.StartTransaction;
Query.Close;
Query.SQL.Text:='DELETE FROM '+Tabela+' WHERE ('+CampoChave+'=:CompararCom)';
Query.ParamByName('CompararCom').AsString:=CompararCom;
Query.ExecSQL;
Query.Close;
Query.SQL.Text:='SET GENERATOR '+Generator+' TO '+IntToStr(GetMaxCampo(xDatabase,xTransaction,Tabela,CampoChave));
Query.ExecSQL;
if(IniciarTransaction)then xTransaction.Commit;
if(QueryRefresh.Active)then QueryRefresh.Refresh;
FINALLY
Query.Close;
Query.Free;
END;
end;
end;
uses IBODataset;
procedure Deletar(xDatabase:TIBODatabase;xTransaction:TIBOTransaction;Tabela,CampoChave,CompararCom:String;QueryRefresh:TIBOQuery;Generator:String;IniciarTransaction:Boolean=True);
var Query:TIBOQuery;
begin
if (MessageDlg('Confirma a exclusão do registro ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
Query:=TIBOQuery.Create(Application.Owner);
TRY
Query.IB_Connection:=xDatabase;
Query.IB_Transaction:=xTransaction;
if(IniciarTransaction)AND(NOT xTransaction.InTransaction)then
xTransaction.StartTransaction;
Query.Close;
Query.SQL.Text:='DELETE FROM '+Tabela+' WHERE ('+CampoChave+'=:CompararCom)';
Query.ParamByName('CompararCom').AsString:=CompararCom;
Query.ExecSQL;
Query.Close;
Query.SQL.Text:='SET GENERATOR '+Generator+' TO '+IntToStr(GetMaxCampo(xDatabase,xTransaction,Tabela,CampoChave));
Query.ExecSQL;
if(IniciarTransaction)then xTransaction.Commit;
if(QueryRefresh.Active)then QueryRefresh.Refresh;
FINALLY
Query.Close;
Query.Free;
END;
end;
end;
GOSTEI 0
Thiago Silva
02/12/2009
tem um jeito mais simples nau? ta meio dificil de entender....
vlw
GOSTEI 0
Thiago Silva
02/12/2009
Boa tarde.. uma terceira forma de se fazer isso é a seguinte, vou charmar de CDSUsuario a query que vc usa para os registros ok, nao esta que esta usando para pesquisa, mas o cds que vc usa pra post e apply, estou considerando que esteja usando um CDS para efetuar os registros..
------------------------
CDSUsuario .Close;
CDSUsuario .CommandText := ' select * from usuario ';
CDSUsuario .Open;
CDSUsuario .Locate('CODIGO', dm.cdsbusuCODIGO.AsInteger ,[]); CDSUsuario .Delete; CDSUsuario .ApplyUpdates(-1); ------------------------- Dessa forma é pra dar certo.. das outras que nossos amigos passaram tb dá.. no caso, estou abrindo todos os registros da sua query principal, para que traga tudo que existe na tabela, e dando um locate no campo código, que no caso, deve ser sua pk.. com locate eu jogo o foco no registro da query que vc usa para efetuar transações com o banco de dados pelo codigo da query que vc usa para consultas, apos dar locate e jogar o foco, dou um delete e um applyupdates na query para efetuar a transação... O problema de se fazer desta forma, é que caso vc tenha muitoa registros na sua query, quando abrir a query principal, por estar abrindo todos os registros, irá demorar um pouco, por consequencia, sua deleção ficará lenta, mas no caso, aparentemente é pra cadastro de usuario, e dificilmente vc terá 10000 usuarios ou coisa do tipow.. então é pra vinga de boa.. Espero ter ajudado.. Sucesso.
CDSUsuario .CommandText := ' select * from usuario ';
CDSUsuario .Open;
CDSUsuario .Locate('CODIGO', dm.cdsbusuCODIGO.AsInteger ,[]); CDSUsuario .Delete; CDSUsuario .ApplyUpdates(-1); ------------------------- Dessa forma é pra dar certo.. das outras que nossos amigos passaram tb dá.. no caso, estou abrindo todos os registros da sua query principal, para que traga tudo que existe na tabela, e dando um locate no campo código, que no caso, deve ser sua pk.. com locate eu jogo o foco no registro da query que vc usa para efetuar transações com o banco de dados pelo codigo da query que vc usa para consultas, apos dar locate e jogar o foco, dou um delete e um applyupdates na query para efetuar a transação... O problema de se fazer desta forma, é que caso vc tenha muitoa registros na sua query, quando abrir a query principal, por estar abrindo todos os registros, irá demorar um pouco, por consequencia, sua deleção ficará lenta, mas no caso, aparentemente é pra cadastro de usuario, e dificilmente vc terá 10000 usuarios ou coisa do tipow.. então é pra vinga de boa.. Espero ter ajudado.. Sucesso.
GOSTEI 0