COMMENT RECUPERER LE N° D'ORDRE D'UN CHAMP DANS UNE REQUETE

Messages postés
56
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 mars 2010
-
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
-
Mon application contient des scriptes qui  permet le calcul  des  moyennes trimestrielles et annuelles par étudiant, affiche les  moyennes  coéfficiées  le  total  voir  toutes  les  informations relatives à un bulletin scolaire mais le problème, je dois fournir le classement des étudiants par classe en fonction de leur moyennes trimestrielle et si une moyenne quelconque arrivait à être modifier, le classement devrait changé automatiquement pour établir l'ordre.



Par exemple: voici une suite de moyenne: 10, 14, 09, 17, 11. (champ MOYENNE)
pour le classement:
- 1er pour l'étudiant qui a 17
- 2ème pour l'étudiant qui a 14
- 3ème pour l'étudiant qui a 10
- 4ème pour celui qui a 09

Je precise que j'utilise INTERBASE 6.0 comme serveur et DELPHI 7 comme langage AGL et WINDOWS XP SP2 comme OS et j'utilise les composants IBDATASET ET IBQUERY pour mes requêtes SQL.

j'ai essayé ceci :
Select MOYENNE from TMOYENNE
Where NUMERO_CLASSE= :NUMCLASSE
Order By MOYENNE DESC;

Avec ça, les moyennes sont classées par ordre décroissant de la plus grande moyenne à la plus petite comme souhaité mais je n'arrive pas à recuperer l 'ordre 1, 2, 3...des lignes d'emplacement des numeros.

voici un autre que j'ai éssayé et qui ne passe pas:
SelectCOUNT (distinct MOYENNE ) As RANG from TMOYENNE
Where NUMERO_CLASSE =:NUMCLASSE
Order By MOYENNE DESC;

Ici à l'execution cela me donne 1.

Aidez moi SVP

ful

6 réponses

Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Salut,

avec un script çà va être dur..
je verrais mieux :
créer un champ ORDRE (integer) dans la table TMoyenne
et
déclencher un UPDATE sur le champ ordre :

 UPDATE TMOYENNE
 SET TMOYENNE.ORDRE = TMOYENNE.ORDRE + 1
 Order By MOYENNE DESC;

J'ai pas testé..

En tout cas le COUNT ne peut pas fonctionner puisque lui compte les enregistrements de la requête alors que toi tu souhaites introduire un incrément
du champ MOYENNE en ordre décroissant.

restera ensuite l'affichage, mais là un simple select et c'est gagné..

cantador
Messages postés
56
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 mars 2010

Je ne te comprend pas!, soit precis et concis, c'est vrais que tu as proposer un update qui est d'ailleurs évident mais malheusement inconprehensile, j'aurais souhaité que tu arrives au bout de ta methéde.

Le update est cré où, comme procedure sur interbase ou au sein d'un ibquery? et comment l'utilise t-on ? et comment tu le met à zéro? soit beaucoup plus explicite car je ne te comprend pas mieux. Et si tus pouvais m'expliquer comment se fait la jointure incrementable  sachant que le camps ORDRE une fois crée ne comporte aucune données et par défaut c'est la valeur nulle(0).

ful
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
ben écoutes, j'essaie simplement de me couler dans ta méthode.
Moi, je ne sais pas ce que tu veux faire exactement..
une requête SQL, tu peux la déclencher en script direct ou sans un IbQuery
comme il te plaira.
bon un p'tit query :


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  IbQuery1.Close;
  with IBQuery1.SQL do
  begin
    Clear;
    Add('UPDATE TMOYENNE  ');
    Add('SET TMOYENNE.ORDRE = TMOYENNE.ORDRE + 1 ');
    Add('Order By MOYENNE DESC ');
  end;
  IbQuery1.ExecSQL;
end;

c'était peu être évident, mais encore aurait-il fallut y penser et l'écrire...

La liaison  ?

Where NUMERO_CLASSE =:NUMCLASSE
çà c'est pas une liaison, c'est un passage de paramètre..

tu peux très bien rajouter ce WHERE dans la requête ci-dessus.

reste la remise à zéro..

je te laisse chercher un peu...

cantador
Messages postés
56
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 mars 2010

Ce-ci, c'est très bon à comprendre, ainsi je me retrouve et j'ai même eu le reflexe de l'adapter à d'autre composants comme le cas d'un IBUpdateSQL1 de Delphi7.

 UPDATE TMOYENNE
 SET ORDRE = :ORDRE
  WHERE NUMERO_CLASSE =:NUMCLASSE
 Order By MOYENNE DESC;

Dans la version Delphi 7 Entreprise, les ordres SQL de
IBUpdate peuvent être générés automatiquement :

 

<ol start= "1" type="1"><li class="MsoNormal" style="">Mettez la propriété Active
de IBDatabase1 à True. Faites de même avec IBTransaction1 et IBQuery1.</li><li class ="MsoNormal" style= "">Cliquez droit sur
IBUpdateSQL1 et activez l'Editeur IBUpdateSQL .</li><li class ="MsoNormal" style="">Cliquez sur Sélectionner
les clés primaires, puis sur Générer le SQL. Tous les ordres
SQL d'IBUpdateSQL1 sont alors automatiquement générés.</li></ol>Compilez, Exécutez :

NB: Le champ ORDRE doit être déclerer comme clef PRIMAIRE lors de sa création.

Nous navons pas besoin de faire une jointure, parce que nous travaillons avec une une table bien determinée (TMOYENNE) donc precision pas necessaire.

La remise à zéro ici n'est vraiment pas necessaire parce toute fois qu'on aura besoin de faire l'"ORDRE" il suffit de faire appelle au coposant IBUpdateSQL1 qui nous met automatiquement à jour le contenu du champ ORDRE de TMOYENNE en fonction de l'ordre des données du champs MOYENNE, de façon dynamique sans une une mise à zéro au préalable.

Bonne compréhension et je suis toujous disponible pour faire comprendre ma methode dans les moindres détails. "tout ce qui se conçoit bien s'énonce clairement" ....ZICSON1

ful
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
content que tu es réglé ton problème,
mais moi je n'utilise pas les compos natifs IB qui ne sont pas excellents
(tu le verrras à l'usage..)

je préfère FIB+ ou TIBO

cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
UPDATE TMOYENNE
 SET ORDRE = :ORDRE
  WHERE NUMERO_CLASSE =:NUMCLASSE
 Order By MOYENNE DESC;

et
NB: Le champ ORDRE doit être déclerer comme clef PRIMAIRE lors de sa création.

heu, à mon avis, il doit y avoir une erreur quelque part...

cantador