Actualiser une table sans que la dbgrid modifie son visuel et l' enregistrement actuel.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 801 fois - Téléchargée 17 fois

Contenu du snippet

Pour ceux qui utilisent les SGBD client/serveur, l' un des problèmes rencontrés est que lorsque l' on veut actualiser les données d' une table, on doit forcément réexecuter le query (select * from ...) ce qui implique la fermeture de la table.
Cela a pour conséquence que la DBGrid oú l' on visualise les données, n' est plus positionnée sur le bon enregistrement. Quand bien même on utiliserait GetBookmark/GotoBookmark/FreeBookmark, l' enregistrement peut ne plus se trouver sur la même ligne de la DBGrid, ce qui estétiquement n' est pas terrible ...

Pour résoudre ce problème, je vous propose le source à appliquer à votre compo DBGrid, ou bien vous pouvez aussi bien téléchargé mes compos et utiliser mes DBGrids:
https://sourceforge.net/projects/tcycomponents/
http://www.delphifr.com/codes/CINDY-PACK-V3-00_51810.aspx

Démo:
http://sourceforge.net/projects/tcycomponents/files/Demo/demo3.40.zip/download

A+

Source / Exemple :


Déclarez ce type qui vous permettra d' utiliser les fonctions: 
type
  TRecordPosition = Record
    ActiveRecord: Integer;
    Bookmark: TBookmark;
  end;

Sauvegardez la position :
function TcyBaseDBGrid.GetRecordPosition: TRecordPosition;
begin
  if not DataLink.Active then Exit;
  Result.ActiveRecord := DataLink.ActiveRecord;
  Result.Bookmark := DataLink.DataSet.GetBookmark;
end;

// Restaurer la position : 
function TcyBaseDBGrid.GotoRecordPosition(RecordPosition: TRecordPosition): Boolean;
var m, LastRow: Integer;
begin
  Result := false;
  if not DataLink.Active then Exit;

  if DataLink.DataSet.BookmarkValid(RecordPosition.Bookmark) then
  begin
    BeginUpdate;    // Avoid flickering
    DataLink.DataSet.GotoBookmark(RecordPosition.Bookmark);

    if DataLink.ActiveRecord <> RecordPosition.ActiveRecord
    then begin
      // *** We are not placed on the same row *** //
      if DataLink.ActiveRecord < RecordPosition.ActiveRecord
      then begin
        // Goto to first row and scroll DBGrid to put the bookmarked record on the correct row:
        m := DataLink.ActiveRecord + (RecordPosition.ActiveRecord - DataLink.ActiveRecord);
        DataLink.DataSet.MoveBy((-1) * m);

        // Goto to the correct record:
        DataLink.DataSet.MoveBy(RecordPosition.ActiveRecord);
      end
      else begin
        LastRow := RowCount-1;
        if dgTitles in Options
        then Dec(LastRow, 1);
        // Goto last row and scroll DBGrid ti put the bookmarked record on the correct row:
        m := (LastRow - DataLink.ActiveRecord) + (DataLink.ActiveRecord - RecordPosition.ActiveRecord);
        DataLink.DataSet.MoveBy(m);

        // Goto to the correct record:
        DataLink.DataSet.MoveBy(RecordPosition.ActiveRecord - DataLink.ActiveRecord);
      end;

      // Can fail if a record was added/removed:
      if DataLink.DataSet.CompareBookmarks(RecordPosition.Bookmark, DataLink.DataSet.GetBookmark) <> 0
      then DataLink.DataSet.GotoBookmark(RecordPosition.Bookmark);
    end;

    Result := DataLink.DataSet.CompareBookmarks(RecordPosition.Bookmark, DataLink.DataSet.GetBookmark) = 0;
    EndUpdate;
  end;
end;

// Libérer le bookmark : 
procedure TcyBaseDBGrid.FreeRecordPosition(RecordPosition: TRecordPosition);
begin
  if not DataLink.Active then Exit;
  DataLink.DataSet.FreeBookmark(RecordPosition.Bookmark);
end;

A voir également

Ajouter un commentaire

Commentaires

amir_kebaili
Messages postés
1
Date d'inscription
lundi 9 décembre 2013
Statut
Membre
Dernière intervention
9 décembre 2013

merci
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Exactement!
Delphian
Messages postés
3
Date d'inscription
mardi 2 novembre 2010
Statut
Membre
Dernière intervention
2 novembre 2010

Autant pour moi... je n'avais effectivement pas bien lu l'énoncé. En gros, tu "recadres" la ligne courante dans le buffer du dataset pour éviter un éventuel changement de position de la ligne dans la grille après rafraichissement. Bien vu...

Merçi.

@+
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut,

je me cite :
"Pour ceux qui utilisent les SGBD client/serveur, l' un des problèmes rencontrés est que lorsque l' on veut actualiser les données d' une table, on doit forcément réexecuter le query (select * from ...) ce qui implique la fermeture de la table.
Cela a pour conséquence que la DBGrid oú l' on visualise les données, n' est plus positionnée sur le bon enregistrement. Quand bien même on utiliserait GetBookmark/GotoBookmark/FreeBookmark, l' enregistrement peut ne plus se trouver sur la même ligne de la DBGrid, ce qui estétiquement n' est pas terrible ..."

La ligne importante est celle-ci:
"Quand bien même on utiliserait GetBookmark/GotoBookmark/FreeBookmark, l' enregistrement peut ne plus se trouver sur la même ligne de la DBGrid, ce qui estétiquement n' est pas terrible ..."

A+
Delphian
Messages postés
3
Date d'inscription
mardi 2 novembre 2010
Statut
Membre
Dernière intervention
2 novembre 2010

Ooops... petite correction:

ABookmark := ADataset.GetBookmark;
ADataset.DisableControls;
try
ADataset.Close;
ADataset.Open;
if ADataset.BookmarkValid(ABookmark) then ADataset.GotoBookmark(ABookmark);
finally
ADataset.EnableControls;
end;

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.