Apagar registro do bando de dados usando stringgrid
Olá a todos,
Tenho a seguinte questão por resolver.
Tenho um código que apaga através de um botão, uma linha selecionada no stringgrid. Até ai tudo bem, o problema que ocorrem duas coisas. primeiro que este código apenas vai jogando as linhas pra cima, com isso acaba sempre a ultima linha a ser apagada indo parar na linha de cabeçalhos.
E não apaga no bando de dados.
Por ex. Se eu apagar 4 linhas do stringgrid, no banco só apagam 3, sempre sobra uma, a mesma que foi parar no cabeçalho.
Este é o código que estou usando.
Se puderem ajudar, desde já agradeço.
Tenho a seguinte questão por resolver.
Tenho um código que apaga através de um botão, uma linha selecionada no stringgrid. Até ai tudo bem, o problema que ocorrem duas coisas. primeiro que este código apenas vai jogando as linhas pra cima, com isso acaba sempre a ultima linha a ser apagada indo parar na linha de cabeçalhos.
E não apaga no bando de dados.
Por ex. Se eu apagar 4 linhas do stringgrid, no banco só apagam 3, sempre sobra uma, a mesma que foi parar no cabeçalho.
Este é o código que estou usando.
procedure TForm_Cad_Pedidos.DeletaLinhaGrid;
Var i : Integer;
begin
with Self.C_Det_Grid1 do
begin
for i := Row to RowCount -2 do {para a penultima receber a ultima}
Cells[0,i] := Cells[0,i+1];
RowCount := RowCount -1; {retira uma linha}
end;
end;
Se puderem ajudar, desde já agradeço.
Helbert
Curtidas 0
Melhor post
Fernando Ito
08/08/2019
Olá Helbert,
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
GOSTEI 1
Mais Respostas
Helbert
05/08/2019
Olá a todos,
Tenho a seguinte questão por resolver.
Tenho um código que apaga através de um botão, uma linha selecionada no stringgrid. Até ai tudo bem, o problema que ocorrem duas coisas. primeiro que este código apenas vai jogando as linhas pra cima, com isso acaba sempre a ultima linha a ser apagada indo parar na linha de cabeçalhos.
E não apaga no bando de dados.
Por ex. Se eu apagar 4 linhas do stringgrid, no banco só apagam 3, sempre sobra uma, a mesma que foi parar no cabeçalho.
Este é o código que estou usando.
Se puderem ajudar, desde já agradeço.
Tenho a seguinte questão por resolver.
Tenho um código que apaga através de um botão, uma linha selecionada no stringgrid. Até ai tudo bem, o problema que ocorrem duas coisas. primeiro que este código apenas vai jogando as linhas pra cima, com isso acaba sempre a ultima linha a ser apagada indo parar na linha de cabeçalhos.
E não apaga no bando de dados.
Por ex. Se eu apagar 4 linhas do stringgrid, no banco só apagam 3, sempre sobra uma, a mesma que foi parar no cabeçalho.
Este é o código que estou usando.
procedure TForm_Cad_Pedidos.DeletaLinhaGrid;
Var i : Integer;
begin
with Self.C_Det_Grid1 do
begin
for i := Row to RowCount -2 do {para a penultima receber a ultima}
Cells[0,i] := Cells[0,i+1];
RowCount := RowCount -1; {retira uma linha}
end;
end;
Se puderem ajudar, desde já agradeço.
Alguém?
GOSTEI 0
Fernando Ito
05/08/2019
Olá Helbert,
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
GOSTEI 0
Helbert
05/08/2019
Olá Helbert,
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
ITO
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Olá Fernando, agradeço pela dica.
Fiz aqui as mudanças mas não surtiram o efeito esperado.
Continua não apagando no Banco de Dados.
Está apenas apagando a linha do StringGrid.
Outro detalhe é que estou usando o TAdvStringGrid da paleta TMS, mudei o método para:
TAuxStringGrid = class(TAdvStringGrid);
Mas também não resolveu.
GOSTEI 0
Fernando Ito
05/08/2019
Olá Helbert,
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
ITO
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Olá Fernando, agradeço pela dica.
Fiz aqui as mudanças mas não surtiram o efeito esperado.
Continua não apagando no Banco de Dados.
Está apenas apagando a linha do StringGrid.
Outro detalhe é que estou usando o TAdvStringGrid da paleta TMS, mudei o método para:
TAuxStringGrid = class(TAdvStringGrid);
Mas também não resolveu.
O StringGrid não é um componente consciente de dados, por isso não vai apagar o registro no banco de dados, para isso você terá que criar um método, ou usar um outro componente, o método pode ser feito de várias maneiras, depende de como você está acessando os dados, se for por consulta, você pode dar um locate e depois consulta.delete; commit; se precisar de ajuda me passe mais informações de como você acessa os dados para popular o StringGrid que vejo se consigo te ajudar ok.
Abraço,
ITO
GOSTEI 1
Helbert
05/08/2019
Olá Helbert,
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Declare o type abaixo antes da linha Implementation da sua unit
type
TAuxStringGrid = class(TStringGrid);
e use o método abaixo para deletar o registro
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
with Self.C_Det_Grid1 do
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
end;
Me confirme se deu certo por gentileza ok, grato.
Um abraço,
ITO
ITO
Correção, não precisa do With:
TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;
Olá Fernando, agradeço pela dica.
Fiz aqui as mudanças mas não surtiram o efeito esperado.
Continua não apagando no Banco de Dados.
Está apenas apagando a linha do StringGrid.
Outro detalhe é que estou usando o TAdvStringGrid da paleta TMS, mudei o método para:
TAuxStringGrid = class(TAdvStringGrid);
Mas também não resolveu.
O StringGrid não é um componente consciente de dados, por isso não vai apagar o registro no banco de dados, para isso você terá que criar um método, ou usar um outro componente, o método pode ser feito de várias maneiras, depende de como você está acessando os dados, se for por consulta, você pode dar um locate e depois consulta.delete; commit; se precisar de ajuda me passe mais informações de como você acessa os dados para popular o StringGrid que vejo se consigo te ajudar ok.
Abraço,
ITO
Se puder ajudar, gostaria sim.
É um Form para cadastro, uso alguns dbedits para inserir os dados no bando de dados (Access) e ao mesmo tempo são exibidos no StringGrid.
E o que eu queria era que o usuário ao selecionar a linha qualquer do Stringgrid, pudesse apagar não só a linha mas o seu respectivo conteúdo no banco de dados.
GOSTEI 0
Fernando Ito
05/08/2019
Ok, vamos lá!
você pode usar uma consulta auxiliar para fazer a exclusão:
var
codigoStringGrid: string;
codigoStringGrid := Self.C_Det_Grid1.Cells[1, Self.C_Det_Grid1.Row]; // 1 é a coluna na sua StringGrid, daí você pega da coluna que refere-se ao id no banco de dados
qryAux.Close;
qryAux.SQL.Clear;
qryAux.SQL.Add('delete from suaTabela where id = ' + codigoStringGrid);
qryAux.ExecSQL;
ou
qryAux.Close;
qryAux.SQL.Clear;
qryAux.SQL.Add('delete from suaTabela where id = :codigoStringGrid');
qryAux.Params[0].AsString := codigoStringGrid;
qryAux.ExecSQL;
Sucesso,
ITO
você pode usar uma consulta auxiliar para fazer a exclusão:
var
codigoStringGrid: string;
codigoStringGrid := Self.C_Det_Grid1.Cells[1, Self.C_Det_Grid1.Row]; // 1 é a coluna na sua StringGrid, daí você pega da coluna que refere-se ao id no banco de dados
qryAux.Close;
qryAux.SQL.Clear;
qryAux.SQL.Add('delete from suaTabela where id = ' + codigoStringGrid);
qryAux.ExecSQL;
ou
qryAux.Close;
qryAux.SQL.Clear;
qryAux.SQL.Add('delete from suaTabela where id = :codigoStringGrid');
qryAux.Params[0].AsString := codigoStringGrid;
qryAux.ExecSQL;
Sucesso,
ITO
GOSTEI 1