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 :

Requête pour supprimer une liste d'élèves


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 61
    Points
    61
    Par défaut Requête pour supprimer une liste d'élèves
    Bonjour,
    J’ai besoin de vos lumières
    Dans une base de données sous delphi Je souhaite supprimer une liste d’élèves selon l’année ou session.
    La table élèves est liée à la table session
    La table session contient les sessions 2012 et 2013. La table élève contient les enregistrements ou la liste des élèves 2012 et 2013 selon ID de la table session.

    La connexion s’effectue sans aucun problème ci-joint une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     DM.QuerySessions.Close;
     DM.QuerySessions.SQL.Clear;
     DM.QuerySessions.SQL.Add('select * from Tbl_Sessions');
     
     QueryEleves.Close;
     QueryEleves.SQL.Clear;
     QueryEleves.SQL.Add('Select * from Tbl_Eleves where Eleve_ID=:SES_ID');
     QueryEleves.Parameters[0].DataType:=ftInteger;
     QueryEleves.Parameters[0].Direction:=pdInput;
     QueryEleves.Parameters[0].Attributes:=[paNullable];
     QueryEleves.Parameters[0].Name:='SES_ID';
     QueryEleves.DataSource:=DSSessions;
    Nom : relation BD.jpg
Affichages : 111
Taille : 21,2 Ko

    Voici ma requête delete qui supprime malheureusement les deux sessions à savoir : 2012 et 2013 dans la table élèves
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DM.QueryEleves.SQL.Clear;
    DM.QueryEleves.SQL.Add('delete  Tbl_Eleves_ ');
    DM.QueryEleves.ExecSQL;
    Je souhaite supprimer dans la table élève une liste d’élèves sans détruire l’autre.
    ex: session 2012. Je me retrouve à chaque fois avec les deux sessions effacées?
    Merci infiniment pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par 94340DB Voir le message
    Dans une base de données sous delphi Je souhaite supprimer une liste d’élèves selon l’année ou session.
    Cela commence mal !
    Tu as probablement voulu dire que tu utilisais Paradox via le BDE au sein de ton application Delphi
    Si ce n'est ni Paradox ni BDE, merci de preciser le SGBD et le layer utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QueryEleves.SQL.Add('Select * from Tbl_Eleves where Eleve_ID=:SES_ID');
     QueryEleves.Parameters[0].DataType:=ftInteger;
     QueryEleves.Parameters[0].Direction:=pdInput;
     QueryEleves.Parameters[0].Attributes:=[paNullable];
     QueryEleves.Parameters[0].Name:='SES_ID';
     QueryEleves.DataSource:=DSSessions;
    Le code ci-dessus utilise une relation maitre-détail, pour le SELECT c'est très pratique pour le DELETE, je ne l'ai jamais pratiqué, est-ce même possible

    Sache que l'on peut aussi écrire tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QueryEleves.SQL.Add('Select * from Tbl_Eleves where Eleve_ID=:SES_ID'); // Eleve_ID à mon avis devrait être SES_ID 
    QueryEleves.ParamByName('SES_ID').AsInteger := SessionID;

    SessionID un nombre fourni par un TEdit par exemple ou via un AfterScroll sur Session

    Par contre Eleve_ID=:SES_ID me semble peut convaincant !
    Il y a un mélange des Clés, si Eleve est attaché à une session, il devrait y avoir un SES_ID dans la table elève

    j'utiliserais un QueryElevesSup sans DataSource pour ne perturber QueryEleves

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DM.QueryEleves.Close();
     
    DM.QueryElevesSup.Close();
    DM.QueryElevesSup.SQL.Clear;
    DM.QueryElevesSup.SQL.Add('delete  Tbl_Eleves where SES_ID = :SES_ID ');
    DM.QueryElevesSup.ParamByName('SES_ID').AsInteger := SessionID;
    DM.QueryElevesSup.ExecSQL;
     
    DM.QueryEleves.Open(); // Relit les données !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Bonjour et merci ShailTroll pour la réponse.
    En ce qui concerne le SGBD j’utilise ADO (moteur de base de données Microsoft Jet avec un curseur côté client).

    En ce qui concerne la procédure de connexion elle fonctionne parfaitement. Je l’ai ajouté uniquement pour éclairer ma question de base à savoir : supprimer une liste d’élèves selon la session. Néanmoins je prends acte de vos conseils, je tenterai une connexion ADO avec moins de lignes.

    En ce qui concerne les règles de nommage des clefs primaires et externes je savais qu’il fallait faire des modifications. Cependant, j’ai irrité de cette base de données qui contient déjà une vingtaine de tables toutes liées dans un DATAMODULE, je n’ai pas eu le temps de toucher au guêpier, mais je le ferai pendant les vacances.

    Grace à vos orientations et vos conseils j’ai réussi à créer une requête me permettant de supprimer une session sans endommager les autres. Cependant, j’ai procédé à quelques modification, puisque
    Cette partie de la procédure ne fonctionne pas chez moi :
    DM.QueryElevesSup.Parameters.ParamByName('SES_ID ').asInteger := ne fonctionne pas, erreur sur AsInteger ;

    Voici la requête qui a fonctionnée mais attention n’ayant pas assez de recul je ne sais si elle est conforme et stable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DM.QueryElevesSup.Close();
    DM.QueryElevesSup.SQL.Clear;                        
    DM.QueryElevesSup.SQL.Add('DELETE FROM Tbl_Eleves ');
    DM.QueryElevesSup.SQL.Add('Where Eleve_ID =: SES_ID '); DM.QueryElevesSup.ExecSQL;
    je vous remercie infiniment pour votre aide.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par 94340DB Voir le message
    En ce qui concerne le SGBD j’utilise ADO (moteur de base de données Microsoft Jet avec un curseur côté client).
    ...
    Cependant, j’ai procédé à quelques modification, puisque
    Cette partie de la procédure ne fonctionne pas chez moi :
    DM.QueryElevesSup.Parameters.ParamByName('SES_ID ').asInteger := ne fonctionne pas, erreur sur AsInteger ;
    ParamByName renvoie un TParameter dont on peut affecter la valeur par la propriété Value de type OleVariant.

    Ce qui donne en reprenant votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DM.QueryElevesSup.Close();
    DM.QueryElevesSup.SQL.Clear;                        
    DM.QueryElevesSup.SQL.Add('DELETE FROM Tbl_Eleves');
    DM.QueryElevesSup.SQL.Add('Where Eleve_ID = :SES_ID');
    DM.QueryElevesSup.Parameters.ParamByName('SES_ID').Value := SessionID;
    DM.QueryElevesSup.ExecSQL;
    Philippe.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête pour obtenir une liste
    Par shayw dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/07/2015, 20h42
  2. Réponses: 5
    Dernier message: 17/11/2013, 14h37
  3. Requête pour afficher une liste de stock
    Par scofield1 dans le forum InterBase
    Réponses: 5
    Dernier message: 08/09/2011, 10h17
  4. Réponses: 1
    Dernier message: 01/05/2011, 20h36
  5. Requête pour supprimer des doublons dans une table
    Par nomade333 dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/03/2008, 12h48

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