IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

numéro automatique d'un champ


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut numéro automatique d'un champ
    salut tout le monde,
    voilà, j'ai une table "Edudiants" qui se compose des champs suivants:
    "n°_etudiant" , "nom_prenom" , "classe" , "moyenne" et "classement".
    Dans cette table, je saisis les résultats de 4 classes.
    je veux connaitre comment faire pour donner un numéro de classement(automatique) pour chaque étudiant selon sa moyenne et sa classe.
    ex:
    1---Albert Loront--- 6°---15.23---classement:5
    2---Tony Faudin--- 6°---16.15---classement:2
    3---Charles Samon---6°---17.25---classement:1
    .
    .
    Merci d'avance de votre aide.
    cordialement

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Je dirais que la réponse dépend fortement du SGBD que tu utilises et des fonctionnalités qu'il propose. Mais comme tu ne nous précises pas c'est lequel...

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Une requête du genre ne marcherait pas :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT n°_etudiant, nom_prenom, classe, moyenne 
    FROM ETUDIANTS
    GROUP BY classe
    ORDER BY moyenne DESC;

    Ansi, ton classement est déjà fait ... Le premier de la classe X est classé premier (normal, il aura la plus grande moyenne) ...
    C'est une idée, à toi de voir si ça te satisfait

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour,
    merci de vos réponses et d'être penché sur mon cas.
    Pardon Aka Guymelef , j'ai oublié de mentionner mon SGBD.je travaille avec des tables Paradox 7.
    Pour ta réponse ero-sennin ,ça marche mais elle ne me satisfait pas vraiment car je veux sauvegarder dans la BD le numéro du classement de chaque étudiant suivant sa moyenne et à la classe à laquelle il appartient.
    Dans mon DBGrid, l'ordre d'affichage est selon le "n°_etudiant".
    merci encore.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Mmmh je ne connais pas les fonctionnalités de Paradox 7 mais une technique qui marche à tout les coups (mais pas très belle) serait de créer une table temporaire avec un champ auto-incrément, puis insérer les lignes dans la table temporaire dans le bon ordre pour chaque incrément corresponde bien au rang de la ligne.
    Puis transférer les lignes de la table temporaire vers la table finale.

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Je rejoins l'idée d'Aka n'en ayant aucune qui me vient à l'esprit...
    A vrai dire, je pense que ça ne sera pas vraiment possible de faire autrement du fait que l'on doit lire la première fois la table, puis remplir le champ concerné ...

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonjour Aka Guymelef ,
    le problème est le suivant: je sauvagarde tous les résultats des étudiants dans une même table.Comme j'ai 4 classes et pour chacune d'elle il y a un n°_classement de l'étudiant, le "n°_classement" "1" par exemple va être sauvegarder 4 fois(puisqu'il y a 4 classes) ,donc l'incrémentation ça ne marchera pas.
    Existe-t-il une autre solution?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Hum ben je ne sais pas comment tu te débrouilles avec tes traitements mais dans ce cas il faut effectuer ce traitement non pas pour une classe en particulier mais pour l'ensemble des élèves.

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Je dirai qu'avec ma requête précédente, l'ordre, on l'a ... et par classe en plus.
    Il suffirait de faire une boucle tant que l'on a des enregistrements.

    On lit le premier enregistrement, on lit ça classe et tant que l'on est sur la même classe, on incrémente le classement.
    Dès que l'on change de classe, on remet à 0 (ou 1, tout dépend comme on va le coder) le classement et on continue le même raisonnement.
    Et après on reprends l'idée d'Aka pour mettre à jour les tables existantes

    C'est une idée comme ça ... je n'ai pas le temps de mettre en pratique la chose, mais à mon avis, c'est surement la seule façon de faire pour avoir un tri correct ...

  10. #10
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    avant d'exposer ce problème sur le forum,j'ai créer une requête comme vous m'avez suggeré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT n°_etudiant, nom_prenom, classe, moyenne 
    FROM ETUDIANTS
    GROUP BY classe
    ORDER BY moyenne DESC;
    après l'execution de cette requête,j'ai filtrer la requête sur une classe et j'ai fait une boucle pour "poster" le n° de classement de chaque étudiant suivant sa moyenne mais j'ai obtenu un message "impossible de modifier les enregistrements car ils sont en lecture seuls".ce message est logique de la par de delphi.
    comment modifier les résultats de cette requête ?
    D

  11. #11
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    je dirais que pour la requête tout semble bon faudrait maintenant que tu montre le code du Post.

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     while not Query_Classement.Edudiants.Eof do
    begin
    Query_Classement.fieldbyname('Classement').asinteger:=1;
    Query_Classement.first;
    Query_Classement.fieldbyname('Classement').asinteger:=Query_Classement.fieldbyname('Classement').asinteger+1;
    Query_Classement.post;
    Query_Classement.next;
     end;
    Close;
    end;
    j'obtiens un message d'erreur:"impossible de modofier les résultats car ils sont en lecture seuls."
    comment modifier les résultats d'une requête?
    ou existe-t-il une autre technique?
    merci

  13. #13
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    pour la lisibilité du code faut pas se priver d'utiliser des variables locales donc à priori je ferais sans hésitation ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var n : integer;
    n := 1;
    while not Query_Classement.Edudiants.Eof do
    begin
    //Query_Classement.fieldbyname('Classement').asinteger:=1;
    Query_Classement.first;
    Query_Classement.fieldbyname('Classement').asinteger:=n;
    Query_Classement.post;
    Query_Classement.next;
    inc(n):
     end;
    Close;
    end;

  14. #14
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Dans ce petit bout de code, je vois plein de choses bizarres...

    1. La boucle s'effectue sur Query_Classement.Edudiants alors que toutes les autres opérations sont sur Query_Classement
    2. La commande Query_Classement.first doit être avant la commande While..Do, sinon ont avancera jamais dans la requête...
    3. Avant de modifier un champ de l'enregistrement, il faudrait peut-être envoyer la commande Query_Classement.edit


    Le code devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    var n : integer;
    n := 1;
    Query_Classement.first;
    while not Query_Classement.Eof do
    begin
      Query_Classement.edit;
      Query_Classement.fieldbyname('Classement').asinteger:=n;
      Query_Classement.post;
      Query_Classement.next;
      inc(n)
    end;

  15. #15
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    +++ et bien vue Le Lézard je crois que NABIL a eu la bonne réponse à lui de nous la confirmer.

  16. #16
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour et merci à vous,
    j'ai testé votre code mais Delphi m'affiche toujours le message :"impossible de modifier un ensemble de donnéées en lecture seule".y a-t-il un moyen de modifier les résultats d'une requête?
    j'ai ajouter "+1" à votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     var n : integer;
    n := 1;
    while not Query_Classement.Edudiants.Eof do
    begin
    //Query_Classement.fieldbyname('Classement').asinteger:=1;
    Query_Classement.first;
    Query_Classement.fieldbyname('Classement').asinteger:=n+1;
    Query_Classement.post;
    Query_Classement.next;
    inc(n):
     end;
    Close;
    end;

  17. #17
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Citation Envoyé par Le Lézard Voir le message
    Dans ce petit bout de code, je vois plein de choses bizarres...

    1. La boucle s'effectue sur Query_Classement.Edudiants alors que toutes les autres opérations sont sur Query_Classement
    2. La commande Query_Classement.first doit être avant la commande While..Do, sinon ont avancera jamais dans la requête...
    3. Avant de modifier un champ de l'enregistrement, il faudrait peut-être envoyer la commande Query_Classement.edit


    Le code devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    var n : integer;
    n := 1;
    Query_Classement.first;
    while not Query_Classement.Eof do
    begin
      Query_Classement.edit;
      Query_Classement.fieldbyname('Classement').asinteger:=n;
      Query_Classement.post;
      Query_Classement.next;
      inc(n)
    end;
    j'en rajoute rien je dis simplement essaie le code .

  18. #18
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    merci encore à toi Just-Soft
    j'ai testé le code sur une Table et il marche à merveille mais le problème se situe au niveau de la requête.il est impossible de modifier les résultats de la requête?

  19. #19
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Re;

    1. Debug ton programmes en mode pas à pas et dis nous où exactement où se situe le problème.
    2. autre chose, ton champ Classement il est de quel type ? n'est-il pas en mode lecture seule par hasard ?

  20. #20
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    voilà ce j'obtiens comme message(débogage pas à pas):
    "Query_classement:impossible de modifier un ensemble de données en lecture seule".
    le champ "classement" est de type numérique.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 30
    Dernier message: 17/11/2012, 17h42
  2. numéro automatique d'un champ
    Par NABIL74 dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/12/2008, 11h28
  3. Réponses: 14
    Dernier message: 17/10/2005, 10h41
  4. Numéro automatique avec PostgreSql
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/09/2005, 23h55
  5. pb de numéro automatique
    Par Little-Freud dans le forum Access
    Réponses: 1
    Dernier message: 26/10/2004, 23h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo