COISA ESTRANHA NO DBGRID

14/08/2008

1

bom dia..
olha só que estranho que esta acontecendo comigo, qdo vou excluir um item da dbgrid, se tiver apenas 2 itens na grid ele excluir, agora se tiver mais que 2 item ele nao exclui, alguem tem pode me ajudar ? :)

agradeço desde já !

Danilo


Responder

Posts

14/08/2008

Paulo

Isto é ilógico, a menos que você esteja esquecendo de dizer alguma coisa a mais. Não faz sentido nenhum, em situações normais. Dá alguma mensagem? Qual banco? Qual componente de acesso a dados? O DBGrid é apenas um visualizador de dados.


Responder

14/08/2008

Gemim

estou usando o firebird, ibdataset, e nao da nenhuma msg, apenas nao exclui, por exmplo se eu clicar na grid em um item e depois clicar em outro ele ja nao exclui mais, estranho nao ?


Responder

15/08/2008

Discorpio

Boa noite a todos.

Gemim, existe uma coisa que voce precisa saber sobre DBGrids e principalmente sobre DataSet.

O DBGrid atualiza um DataSet local.

Como assim, DataSet local :?:

Quando voce faz uma conexão com o banco e faz a seleção dos registros com uma instrução Select do SQL através de um componente IBDataSet, ele apanha os registros no banco e armazena no cache de disco local como DataSet (Conjunto de Registros), dai o nome do componente IBDataSet.

Esse DataSet é atualizado localmente, através do método Post, e só será atualizado no Banco do lado do Servidor, quando voce aciona um comando Commit,

Outra coisa, que voce precisa avaliar é qual é o momento em que voce aciona o método Delete, ou seja, em que estado se encontra o seu DataSet (Estado de Inclusão, Edição), se o seu DataSet estiver em qualquer um desses dois estados, ao efetuar o Delete, voce poderá causar resultados inesperados no banco. O Delete só poderá ser acionado no estado de Browser (Navegação).

Quando voce aciona um delete, e seu DBGrid estiver com a seleção múltiplas de linhas, voce só vai apagar o linha de registro onde estiver o ponteiro do registro na tabela, ou seja, voce só apagará o registro corrente, as outras linhas permanecem intactas, pois o método delete só apaga a linha de registro corrente, a não ser que voce implemente um código com um delete em Loop, onde o é colocado o ponteiro do registro na tabela, na exata linha que se queira deletar e depois acionar o delete sucessivamente até apagar todas as linha selecionadas. O código do looping seria mais ou menos assim:


procedure TForm1.tbExcluirClick(Sender: TObject);
var I: Integer;
      Mens: String;
      BookmarkList: TBookmarkList;
      Bookmark: TBookmarkStr;
begin
  BookmarkList := DBGrid1.SelectedRows;
  if BookmarkList.Count > 1 then 
     Mens := ´Deseja excluir os registros selecionados ?´
  else 
     Mens := ´Deseja excluir o registro nº. ´ + IntToStr(IBDataSet.RecNo);
  if MessageBox(Self.Handle, PChar(Mens), ´Exclusão de Registro´, MB_YESNO + MB_ICONQUESTION) = IDYES then
    if BookmarkList.Count > 1 then 
       for I := 0 to BookmarkList.Count - 1 do begin
            IBDataSet.Bookmark := BookmarkList[I];
            IBDataSet.Delete;
    end else 
            IBDataSet.Delete;
end;



Repare que se voce selecionar apenas um registro, basta apenas acionar o Delete, porém se selecionar vários é faz o looping através dos registro selecionados, coloca o ponteiro no registro com o método Bookmark e depois deleta.


Responder

15/08/2008

Gemim

boa tarde discorpio, muito obrigado pela atenção, o meu problema é que eu nao quero excluir todos os itens quero excluir apenas oque eu selecionar, mas o problema ocorre ai, qdo por exemplo clico em um item para excluir, ele exclui tudo certo, mas do banco ele nao apaga, e eu estou comintando normal esta assim:

ibdataset.delete
dm_banco.IBTransaction1.CommitRetaining;

agradeço desde já !


Responder

15/08/2008

Discorpio

Boa tarde Gemim

Realmente então está acontecendo algo estranho, pois pelo código que voce passou, está correto.

Então tente utilizar o ApplyUpdates antes do CommitRetaining, assim:


if ibdataset.state in [dsBrowse] then begin
  ibdataset.delete
  ibdataset.ApplyUpdates; 
  dm_banco.IBTransaction1.CommitRetaining;
end;



Se ainda assim não funcionar, então verifique a conexão do IBDataSet e principalmente do DataSource que liga o DBGrid ao IBDataSet, verifique também o IBDatabase, o IBTransaction, vê se o IBTransaction está conectado ao IBDatabase corretamente.


Responder

18/08/2008

Gemim

Discorpio bom dia :) deu certo :) pois entao coloquei o codigo que vc me passou tentei deu erro, fiz o seguinte, coloquei o seu codigo e alteri a propriedade do datasource cachedupdates para true assi deu certo, mais uma vez muito obrigado !

Danilo


Responder

19/08/2008

Gemim

Discorpio..vc nao acredita, agora que eu deixei aquela propriedade do datasource cachedupdates TRUE, qdo eu nao excluo nenhum item ele nao sai nada na impresao, cada uma que acontece viu !

agradeço desde já !


Responder