Fórum Apagar registro do bando de dados usando stringgrid #604260

05/08/2019

0

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.

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

Helbert

Responder

Post mais votado

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


Correção, não precisa do With:

TForm_Cad_Pedidos.DeletaLinhaGrid;
begin
TAuxStringGrid(Self.C_Det_Grid1).DeleteRow(Self.C_Det_Grid1.Row);
end;

Fernando Ito

Fernando Ito
Responder

Gostei + 1

Mais Posts

06/08/2019

Helbert

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.

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?
Responder

Gostei + 0

08/08/2019

Fernando Ito

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
Responder

Gostei + 0

08/08/2019

Helbert

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


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.
Responder

Gostei + 0

08/08/2019

Fernando Ito

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


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
Responder

Gostei + 1

08/08/2019

Helbert

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


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.
Responder

Gostei + 0

09/08/2019

Fernando Ito

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
Responder

Gostei + 1

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

Aceitar