Fórum COISA ESTRANHA NO DBGRID #362498
14/08/2008
0
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
Gemim
Curtir tópico
+ 0Posts
14/08/2008
Paulo
Gostei + 0
14/08/2008
Gemim
Gostei + 0
15/08/2008
Discorpio
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.
Gostei + 0
15/08/2008
Gemim
ibdataset.delete
dm_banco.IBTransaction1.CommitRetaining;
agradeço desde já !
Gostei + 0
15/08/2008
Discorpio
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.
Gostei + 0
18/08/2008
Gemim
Danilo
Gostei + 0
19/08/2008
Gemim
agradeço desde já !
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)