Savoir si la requête retourne au moins un enregistrement

IAmIvyAlice Messages postés 14 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 septembre 2009 - 4 juin 2009 à 14:55
vrachid Messages postés 109 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 octobre 2011 - 14 déc. 2009 à 16:01
Bonjour,
Voici mon soucis, j'aimerais tester si une requête ADO retourne au moins un enregistrement ou s'il n'y a pas eu de résultat pour cette dernière.
J'ai essayé avec if maRequeteAdo.eof then... ça ne fonctionnait pas, j'ai également essayé avec while NOT maRequeteAdo.eof do en pensant que s'il n'y avait pas d'enregistrement, il skipperais tout simplement le code, visiblement je me trompais ^_^

Donc est-ce que quelqu'un pourrait me faire savoir comment je dois faire pour obtenir cette information ?

Merci d'avance

Ivy

9 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
5 juin 2009 à 10:42
bonjour,
Il faut tester les deux pointeurs de début et de fin en même temps

cantador
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
22 juil. 2009 à 14:43
Bonjour,
la question m'intéresse car je suis devant le même problème...
Cantador dit qu'il faut tester les deux pointeurs en même temps... du genre :

if (ADOQuery1.bof) and (ADOQuery1.eof) then... "la requête n'a rien rendu"

Est-ce bien cela ?
Merci
0
grandyaka54 Messages postés 97 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 18 décembre 2013 5
22 juil. 2009 à 17:09
Bonjour,

As tu la possibilité de faire maRequeteAdo.RecordCount ?
Si oui, alors si maRequeteAdo.RecordCount > 0, il y a au moins un résultat.

GrandYaka
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
22 juil. 2009 à 18:36
Bonjour Grandyaka,
merci de ta suggestion... elle fonctionne !
La propriété ADOQuery1.RecordCount donne, en effet, le nombre de groupes de champs renvoyés par une requête 'select'.
J'avais essayé ADOQuery1.Fields.Count mais cela ne donne que le nombre de champs demandés dans le select. Sans intérêt.
Ce 'count' vaut toujours la même valeur qq soit la réponse du 'select'.

Merci de ton aide.
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 juil. 2009 à 18:57
NON, if ADOQuery1.RecordCount = 0,
c'est NUL !

cela oblige à parcourir toute la table
(imagine une table avec 1000 000 de records !)

la bonne réponse c'est celle de DenisPhil :

if (ADOQuery1.bof) and (ADOQuery1.eof) then

que l'on peut tester aussi négativement..

+ 1 pour lui


cantador
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
22 juil. 2009 à 21:16
Bonsoir Cantador,
en effet, parcourir une table énorme pour compter les enreg peut prendre du temps.
Mais je pensais (naïvement !) que ce compteur existait, mis à jour par Access à chaque 'insert / delete' fait dans une table...
BOF ! Je vais utiliser les 'bof/eof' plus rapides.
Merci
0
rozg Messages postés 8 Date d'inscription vendredi 12 décembre 2008 Statut Membre Dernière intervention 11 juin 2014 1
10 sept. 2009 à 18:14
Un commentaire sur la réponse de Cantador du 22/08:

L'ancètre TDataSet met à disposition une fonction publique FUNCTION IsEmpty: BOOLEAN;
Qui semble donc répondre parfaitement au besoin.

Toutefois, si on va voir le source, cette fonction est codée (Delphi 2007):
Result:=FActiveRecord>=FRecordCount;

S'ils ont codé comme ça on pourrait penser que la détermination de FRecordCount ne nécessite pas le parcourt de toute la table.

C'est d'autant plus souhaitable que IsEmpty est utilisé en interne de l'unité DB (par exemple dans DoAfterOpen !

Si on cherche un peu, on voit qu'effectivement FRecordCount est mis à jour ici ou là (par exemple dans TDataSet.Insert).
Nota: Regarde un peu se qui se passe dans ClearBuffers et ActivateBuffers...

Je n'ai pas tout analysé mais je pense que FRecordCount ne représente pas forcément le nombre réel d'enregistrements de la table mais au plus le nombre qui est dans le tampon (FBufferCount). Dans ce cas, l'utilisation de IsEmpty n'aurait pas d'inconvénient.

UN détail : La propriété TDataSet.RecordCount renvoie toujours -1. Ce sont les descendants qui doivent implémenter (c'est le cas d'ADO).
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 sept. 2009 à 22:08
ah ?
isEmpty ou les pointeurs ?

cantador
0
vrachid Messages postés 109 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 octobre 2011
14 déc. 2009 à 16:01
Bonjour à tous
il y a aussi cette méthode normalement:
begin
with AdoQuery do
begin
..
....
SQL.Add('SELECT COUNT( * ) as NbRecord From maTable');
....
...

if FieldByName('NbRecord').AsInteger > 0 then
......
else
....
end;
end;
0
Rejoignez-nous