Bonjour tout le monde,
j'affiche les données d'une requête du type SELECT FROM WHERE GROUP BY ORDER BY HAVING.
Pour cela, j'utilise un TSQLQuery qui possède la requête SQL.
J'ai un DataSetProvider relié au SQLQuery, puis un ClientDataSet et un DataSource.
Pour afficher les données, j'utilise un TDBGrid qui est relié au DataSource.
Lorsque j'active le ClientDataSet, les données s'affichent, pas toutes les données, juste les 200 premières.
Quand l'utilisateur descend le curseur, les données continuent à s'afficher de façon progressive. C'est très utile lorsqu'on travaille sur des millions d'enregistrement, les temps de réponse restent acceptables.
J'ai mis un bouton qui lorsqu'on clique dessus donne le nombre total d'enregistrements.
Pour se faire, je remets le curseur du SQLQuery à First, puis je compte jusqu'à ce qu'il arrive à Eof puis je le remets à First. Enfin j'affiche la valeur comptée.
Le problème est qu'ensuite, les données sont toutes "marquées" comme lues et quand on descend le curseur dans le DBGrid, on bloque et ne vois plus les données suivantes.
Si j'essaie d'afficher le RecordCount du SQLQuery, la valeur est fausse car il ne tient pas compte des agrégations de la requête.
Si j'essaie d'afficher le RecordCount du ClientDataSet, la valeur est fausse car elle ne prend en compte que ce qui a été chargé dans le DBGrid.
J'ai pensé charger toutes les données dans le DBGrid, mais c'est extrèmement plus lent que la méthode actuelle et quand on travaille sur plusieurs millions d'enregistrement, ce n'est pas exploitable.
J'ai aussi essayé d'utiliser des Bookmark, mais ça ne fonctionne pas.
Quelle est la bonne solution pour avoir le nombre d'enregistrements valide et qu'on puisse toujours voir les données suivantes dans le DBGrid ?
Merci pour votre aide.
Partager