deletar linhas selecionadas no CXGrid

Delphi

10/11/2008

Olá delphianos!!!

Estou desenvolvendo um sistema onde tenho uma tela onde uso o componente da DevExpress (CXGrid), faço a seleção das linhas pra excluir, mais parei no seguinte código.

begin
cxGrid1DBTableView1.DataController.DataSet.First;
while not cxGrid1DBTableView1.DataController.DataSet.Eof do
begin
if cxGrid1DBTableView1.DataController.SelectRows then begin
ShowMessage(OracleDataSet1.FieldByName(´COD_TIpO_DOC´).AsString);
end;
cxGrid1DBTableView1.DataController.DataSet.Next;
end;
end;

Conto com a ajuda de vcs.
Desde já agradeço.
Fica com Deus


Sayllonn

Sayllonn

Curtidas 0

Melhor post

Tonidavi2004

Tonidavi2004

11/11/2008

Colega sayllonn.

O método SelectRows é usado para selecionar linhas no CxGrid e não para saber as linhas selecionadas. Ele tem dois parâmetros, o primeiro é a linha inicial, o segundo a linha final.
  procedure SelectRows(AStartRowIndex, AEndRowIndex: Integer);


Para vc saber as linhas selecionadas, usa-se a função GetSelectedCount.
  function GetSelectedCount: Integer;

Exemplo:
var
  i: integer;
  ARowIndex: integer;
  ARowInfo: TcxRowInfo;
begin
  with cxGrid1DBTableView1.DataController do
  begin
    for i := 0 to Pred(GetSelectedCount) do
    begin
      ARowIndex := GetSelectedRowIndex(i); // retorna o índice da linha selecionada
      ARowInfo  := GetRowInfo(ARowIndex); // retorna informação da linha selecionada
      DeleteRecord(ARowInfo.RecordIndex); // deleta o registro da linha selecionada
    end;
  end;
end;

// como vc deu um showMessage, demonstro aqui neste exemplo

var
  i: integer;
  ARowIndex: integer;
  ARowInfo: TcxRowInfo;
begin
  with cxGrid1DBTableView1.DataController do
  begin
    for i := 0 to Pred(GetSelectedCount) do
    begin
      ARowIndex := GetSelectedRowIndex(i); // retorna o índice da linha selecionada
      ARowInfo  := GetRowInfo(ARowIndex); // retorna informação da linha selecionada
      ShowMessage(VarToStr(Values[ARowInfo.RecordIndex, cxGrid1DBTableView1COD_TIpO_DOC.index]));
    end;
  end;
end;



GOSTEI 2

Mais Respostas

Delmar

Delmar

10/11/2008

Tente sem percorrer, usando o código


cxGridDBsuaTableView.Controller.DeleteSelection;

cxGridDBsuaTableView.DataController.DeleteSelection;

cxGridDBsuaTableView.DataController.Controller.DeleteSelection;


O código acima eu não sei se funciona

O código abaixo funciona para cxGrid não DBs

cxGridTVnfServicoItem.DataController.GotoFirst;
while not cxGridTVnfServicoItem.DataController.IsEOF do
cxGridTVnfServicoItem.Controller.DeleteSelection;
if cxGridTVnfServicoItem.DataController.IsEOF then
cxGridTVnfServicoItem.Controller.DeleteSelection;

DeleteSelection deleta todos registros selecionados


GOSTEI 0
Delmar

Delmar

10/11/2008

Este é um exemplo onde seleciono todos e em seguida invoco DeleteSelection

cxGridTvPedidoItem.OptionsSelection.MultiSelect:=True;
cxGridTvPedidoItem.DataController.SelectAll;
cxGridTvPedidoItem.DataController.DeleteSelection;
cxGridTvPedidoItem.OptionsSelection.MultiSelect:=False;

Mas neste exemplo tb não é uma grade DB


GOSTEI 0
Delmar

Delmar

10/11/2008

Mande retorno


GOSTEI 0
Sayllonn

Sayllonn

10/11/2008

Caro colega Delmar.

O meu problema está na linha do selectRows, preciso que alselecionar as linhas quando eu for mandar deletar o selectRows vai lendo as linhas selecionadas e deletando linha por linha. Cada linha selecionada e deletada é será gerado um registro numa tabela de auditoria por isso preciso que ao deletar seja lindo a linha pelo selectRows.

begin
cxGrid1DBTableView1.DataController.DataSet.First;
while not cxGrid1DBTableView1.DataController.DataSet.Eof do
begin
if cxGrid1DBTableView1.DataController.SelectRows[I] (O problema ta aqui) then begin
ShowMessage(OracleDataSet1.FieldByName(´COD_TIpO_DOC´).AsString);
end;
cxGrid1DBTableView1.DataController.DataSet.Next;
end;
end;


GOSTEI 0
Delmar

Delmar

10/11/2008

qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRowCount - 1; // quantidade de linhas selecionadas
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; // ou quantidade de linhas selecionadas
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; // ou quantidade de linhas selecionadas
for linha := 0 to qtdeLinhasSelecionada do
begin
showmessage(´coluna1 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[0]) + ´ coluna2 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[1]) );
showmessage(VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRecords[linha].Values[1]));
end;

cxGridPedidoItemTV.Controller.DeleteSelection; //após percorrer as linhas selecionadas tente DeleteSelection para deletar as linhas selecionadas, isto deve deletar tb no dataset e no BD


GOSTEI 0
Delmar

Delmar

10/11/2008

Esse eu testei e funcionou, e altenativamente indexei a coluna pelo NomeDaColuna.Index para pegar seus valores, com isso já poderá criar seu log com sucesso

Ou seja, percorre os itens selecionados já de forma otimizada, tem as intruções para pegar os valores de suas colunas, e deleta os registros


var qtdeLinhasSelecionada, linha : integer;
begin
//qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRowCount - 1; //quantidade de linhas selecionadas
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; //quantidade de linhas selecionadas
//qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; //quantidade de linhas selecionadas
for linha := 0 to qtdeLinhasSelecionada do
begin
showmessage(´coluna1 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[0]) + ´ coluna2 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[cxGridDBtvPedidoItemNOMEP.Index]) );
showmessage(VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRecords[linha].Values[cxGridDBtvPedidoItemNOMEP.Index]));
end;
cxGridDBtvPedidoItem.DataController.DeleteSelection;


GOSTEI 0
Delmar

Delmar

10/11/2008

Da forma que vc vinha tentando seria exatamente isso, mas não encontrei uma função/propriedade na cxGrid que retorna um TbookMark para que o ponteiro pudesse indexar no seu dataset, ou seja, não encontrei o equivalente de DBGridLancamentos.SelectedRows.Items[i]


for i:=0 to DBGridLancamentos.SelectedRows.Count-1 do
begin
DBGridLancamentos.DataSource.DataSet.GotoBookmark(pointer(DBGridLancamentos.SelectedRows.Items[i]));
DBGridLancamentos.DataSource.DataSet.Edit;
DBGridLancamentos.DataSource.DataSet.FieldByName(´CONTROLE´).AsString:=acontrole; //recebe o codigocontrole ou codigocobranca
DBGridLancamentos.DataSource.DataSet.Post;
end;


GOSTEI 0
Sayllonn

Sayllonn

10/11/2008

Quero agradecer a ajuda dos caros colegas Delmar e tonidavi2004. É muito importante a participação dos colegas programadores no Forum. E dizer que a ajuda de vocês deu certo no problema em questão, pois fiz teste com a dica tanto do Delmar quanto dotonidavi2004
. Muito obrigado pela força, qualquer dúvida e se eu puder ajudar ajudarei com certeza. Tenham todos uma ótima tarde de Terça-feira.
Fiquem com Deus.


GOSTEI 0
Sayllonn

Sayllonn

10/11/2008

Caro amigos depois de alguns testes percebi que ainda to com um problema. Tanto no código do Colega Delmar, quanto no do colega tonidavi2004. usando os seguinte código na hora de deletar.


DeleteRecord(ARowInfo.RecordIndex) ou dataset.delete se eu selecionar tipo [linha,coluna].

Exemplo:

[A,A]
[A,B]
[A,E]
[A,G]


Da erro. Conto com a ajuda dos colegas novamente.

Desde já agradeço.
Fiquem com Deus


GOSTEI 0
Sayllonn

Sayllonn

10/11/2008

Amigos esqueci de informar que esse código estou usando num formulário padrão (FormPai),onde por herança uso esse código nos formulários (Filhos).


GOSTEI 0
Delmar

Delmar

10/11/2008

procedure TForm1.Button1Click(Sender: TObject);
var qtdeLinhasSelecionada, linha : integer;
    cgr:TcxCustomGridRow;
begin
   //qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRowCount - 1; //quantidade de linhas selecionadas
   qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; //quantidade de linhas selecionadas
   //qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; //quantidade de linhas selecionadas
   for linha := 0 to qtdeLinhasSelecionada do
   begin
      //ShowMessage(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[cxGridDBtvPedidoItemPRODUTO.Index]);
      //cxGridDBtvPedidoItem.DataController.DeleteRecord(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].RecordIndex);
      cgr:=cxGridDBtvPedidoItem.Controller.SelectedRows[linha];
      ShowMessage(cgr.Values[cxGridDBtvPedidoItemPRODUTO.Index]);
      //cxGridDBtvPedidoItem.DataController.DeleteRecord(cgr.RecordIndex);
   end;
   cxGridDBtvPedidoItem.DataController.DeleteSelection;
end;


Aqui já trouxe outra forma de trabalhar

Mas o que quero dizer é que o DeleteRecord pra mim não deu pau, mas após abrir a consulta o registro volta, ou seja, no DB não deletou.

Já com o DeleteSelection os registros não voltam mais. Pra mim funciona 100¬.

OBS. eu uso IBO e a instrução de deleção está na Query, na propriedade deleteSQL


GOSTEI 0
Ondulapel Ltda

Ondulapel Ltda

10/11/2008

Olá. Muito úteis os comentários dos amigos. Gostaria de aproveitar o post para ver se mais alguém está tendo o mesmo problema que eu:

Quando abro o dataset do cxgrid, ele está em uma ordem e é esta ordem que aparece no cxgrid. Posso selecionar algumas linhas do cxgrid e trabalhar com os valores destas através do seu índice (selectedrows). O problema ocorre quando eu inverto a ordem dos registros no grid e tento trabalhar com os registros selecionados nesta segunda ordem. O aplicativo entende que a ordem permanece a ordem inicial.

Exemplo:

Abro o dataset e a ordem apresentada inicialmente é a seguinte:

Cod_Prod Produto Qtde
11555 CCCC 10
12444 DDDD 20
13777 EEEE 30
14999 BBBB 40
15888 AAAA 50

Se eu clico na título da coluna Produto, p.e., altero a exibição do cxgrid:

Cod_Prod Produto Qtde
15888 AAAA 50
14999 BBBB 40
11555 CCCC 10
12444 DDDD 20
13777 EEEE 30

Se eu selecionar as linhas intercaladas (linhas 1, 3 e 5) nesta segunda ordem (produtos 15888, 11555 e 13777), o sistema entende que as linhas selecionadas são as de quando abri o dataset (produtos 11555, 13777 e 15888). Alguém sabe como resolver o problema??? Agradeço desde já.
GOSTEI 0
Multi Ltda

Multi Ltda

10/11/2008

Tópico official DevExpress


Encontrei o artigo acima no site de suporte da devexpress. Ele 2 modos de obter as linhas selecionadas e fala sobre a diferença do índice do registro e o índice da linha (que pode ser afetada com a ordenação)
GOSTEI 0
POSTAR