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

Langage Delphi Discussion :

Supprimer un enregistrement après une recherche


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut Supprimer un enregistrement après une recherche
    Bonjour;
    j'ai fait une recherche sur ma table Employé, après affichage des résultats je veux supprimer l'un des enregistrement affiché a l'aide d'un PopupMenu, mais quand je valide la suppression par 'Ok', je vois que l'enregistrement sélectionné n'est pas supprimé, mais un autre qui est sélectionné dans la table d'origine : Employé.
    La recherche se fait avec une requête SQL.
    Quelquin pourrait m'aider afin de supprimer l'enregistrement recherché.

    Une capture d'écran pour mieux comprendre:
    Nom : rrrrrr.png
Affichages : 670
Taille : 53,9 Ko
    Dans cet exemple j'essaie de supprimer 'REHHAL', mais 'MALIK' qui est supprimé !!!

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 118
    Points
    118
    Par défaut
    Bonjour,
    vous avez sans doute utiliser le nom de la table d'origine pour supprimer cet enregistrement au lieu du nom de la requette d'affichage.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    vous auriez du nous montrer le code qui fait la suppression (code du onclick ou de l'action du popupmenu).
    a mon avis puisque vous partez d'une requête vous devriez faire une autre requête DELETE FROM <table employé> WHERE NOMEMPLOYE=<NomEmployeselectionné> et tout ça en n'oubliant pas par la suite (à la sortie de la fiche) de rafraichir la fiche de départ
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    vous auriez du nous montrer le code qui fait la suppression (code du onclick ou de l'action du popupmenu).
    a mon avis puisque vous partez d'une requête vous devriez faire une autre requête DELETE FROM <table d''origine> WHERE NOMEMPLOYE=<NomEmployeselectionné> et tout ça en n'oubliant pas par la suite (à la sortie de la fiche) de rafraichir la fiche de départ
    Je pense que c'est bête ce que j'ai fait, malgré je connais pas d'autre solution -------> le code du PopupMenu est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Principale.Temploye.Delete;
    Et c'est le même code que j'utilise pour supprimer à partir de la table d'origine

    Si, je dois supprimer avec une requête SQL, la quelle?
    SVP Aider moi.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par samidz2014 Voir le message
    Si, je dois supprimer avec une requête SQL, la quelle?
    j'ai déjà répondu à cette question avec le peu d'informations données
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    DELETE FROM <table employé> WHERE NOMEMPLOYE=<NomEmployeselectionné>
    Le problème c'est dans la partie NomEmployeselectionné, comment récupérer ça valeur et l'inclure dans le code SQL!!

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Vous avez bien une Requête qui affiche les données dans la grille de la "deuxième forme" c'est de cette requête que vous allez obtenir la valeur (enregistrement en cours du dbgrid )
    sachez qu'il est hyper frustrant de répondre à ce genre de question car vos indications sont tellement fragmentaires qu'il s'agit plus de divination qu'autre chose
    heureusement que j'utilise une boule de cristal et non les entrailles de mon chat !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    Vous avez bien une Requête qui affiche les données dans la grille de la "deuxième forme" c'est de cette requête que vous allez obtenir la valeur (enregistrement en cours du dbgrid )
    Mais le résultat de la recherche peut avoir plusieur enregistrements pas forcément un seul, non?

    sachez qu'il est hyper frustrant de répondre à ce genre de question car vos indications sont tellement fragmentaires qu'il s'agit plus de divination qu'autre chose
    Dacord voici mon code du reqête SQL qui résulte la recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      TdbQuery1.SQL.Clear;
      TdbQuery1.SQL.Add('SELECT');
      TdbQuery1.SQL.Add(' p.nom_empl, p.prenom_empl, p.Fonction, S.num_salle_arch, p.rayonnage, p.etage_ray, p.num_boite_arch, D.libelle_dir, p.date_naiss, p.date_entree, p.date_sortie, p.type_sortie, p.date_archivage, p.duree_vie,');
      TdbQuery1.SQL.Add(' E.etat_arch');
      TdbQuery1.SQL.Add(' FROM employe p');
      TdbQuery1.SQL.Add(' LEFT JOIN directions D ON p.id_dir = D.id_dir');
      TdbQuery1.SQL.Add(' LEFT JOIN etat_arch E ON p.id_etat_arch = E.id_etat_arch');
      TdbQuery1.SQL.Add(' LEFT JOIN salles_archives S ON p.id_salle = S.id_salle');
      TdbQuery1.SQL.Add(' WHERE nom_empl like :pfiltrenom_empl');
      TdbQuery1.SQL.Add(' ORDER BY nom_empl ');
      TdbQuery1.Prepare;
      TdbQuery1.ParamByName('pfiltrenom_empl').AsString :='%' + RzEdit7.Text+ '%';
      TdbQuery1.Open;
    J'espère que j'ai bien détaillé cette fois.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Mais le résultat de la recherche peut avoir plusieurs enregistrements pas forcément un seul, non?
    oui mais il n'y aura qu'une seule ligne active à la fois (exactement comme avec un table)

    selon le code fourni , avec un peu de chance ce sera alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Query.SQL.Text:='DELETE FROM EMPLOYE WHERE nom_empl=:E';
    Query.ParamByName('E').asString:=TDBQuery1.FieldByname('nom_empl').asString;
    Sauf que l'on ne sait pas (et à priori ce ne devrait pas) si nom_empl est une valeur unique
    je critiquerais déjà la structure de la table employé qui ne permet pas d'avoir un index unique (colonne index qui devra être utilisé dans la requête)

    J'espère que j'ai bien détaillé cette fois
    pas tant que ça ! tout dépend de la structure de la table EMPLOYE et selon un ajustement de la requête de recherche sera à modifier
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    salut;
    j'ai essaié votre code mais un message me dit:
    TdbQuery1 : Field ‘nom_empl’ not found, malgré que je suis sur que 'nom_empl' est bien correct.

    Je veux essayer une autre solution mais je ne s’est pas comment la réaliser: je veux que quand je click sur un enregistrement dans le DBGrid de la form de recherche, il sera automatiquement sélectionné dans la form principale (d'origine), et comme ça le problème est résolu puisque mon code de suppression vas supprimer le même enregistrement.
    merci pour ton aide.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 118
    Points
    118
    Par défaut
    bonjour,
    l'utilisation d'un code_empl facilitera la résolution du probleme :

    1) modifier la structure de la table employe en y ajoutant un nouveau champs; ex : code_empl
    2) modifier la 3e ligne du tdbquery1 comme suit
    TdbQuery1.SQL.Add('p.code_empl, p.nom_empl, p.prenom_empl, p.Fonction, S.num_salle_arch, p.rayonnage, p.etage_ray, p.num_boite_arch, D.libelle_dir, p.date_naiss, p.date_entree, p.date_sortie, p.type_sortie, p.date_archivage, p.duree_vie,');

    3) vous pouvez supprimer l'enregistrement employe ayant pour code : tdbquery1Code_empl

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    bonjour,
    j'abonde dans le sens de camatchou pour ce qui est du code unique employé, il a mis en plus clair ce que j'essayai de faire comprendre par
    je critiquerais déjà la structure de la table employé qui ne permet pas d'avoir un index unique (colonne index qui devra être utilisé dans la requête)

    Citation Envoyé par samidz2014 Voir le message
    j'ai essayé votre code mais un message me dit:
    TdbQuery1 : Field ‘nom_empl’ not found, malgré que je suis sur que 'nom_empl' est bien correct.
    Encore une fois le code proposé l'est en fonction des éléments donnés selon le bon vieux principe informatique du GIGO (garbage in garbage out).
    Je me demande juste si vous avez mis le code au bon endroit, (sur la deuxième fiche dans l'évènement du popup menu) ou bien ailleurs ! d'ailleurs cela vous apprendra aussi j'espère à ne pas garder les noms par défaut mais donner un nom explicite à un composant

    Citation Envoyé par samidz2014 Voir le message
    Je veux essayer une autre solution mais je ne s’est pas comment la réaliser: je veux que quand je click sur un enregistrement dans le DBGrid de la form de recherche, il sera automatiquement sélectionné dans la form principale (d'origine), et comme ça le problème est résolu puisque mon code de suppression vas supprimer le même enregistrement.
    Ce qui suit est à mon avis du mauvais code que je donne quand quand même pour débat
    en supposant que la forme2 est appelée par un showmodal et que l'action de suppression soit un résultat (par exemple une valeur -10) alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if form2.showmodal=-10 then begin
      if table1.locate('NOM',form2.tdbquery1.fieldbyname('nom_empl').asString,[]) then table1.delete;
    end;
    ou encore dans form2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form1.table1.locate('NOM',form2.tdbquery1.fieldbyname('nom_empl').asString,[])
    Mais cela ne change rien au problème de fond puisqu'il faudra bien obtenir ce nom/code
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    salam;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form1.table1.locate('NOM',form2.tdbquery1.fieldbyname('nom_empl').asString,[])
    Merci beaucoup Sergio ton code est bien mon bienfaiteur.
    et voici mon code final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Principale.temploye.locate('nom_empl',FSearchEmpl.tdbquery1.fieldbyname('nom_empl').asString,[]);
    Il reste seulement l'histoire d'indexer le nom_empl, ou bien j'ajoute le code de l'employé 'id_empl' dans la reqête SQL, (Avant j'ai voulu pas qu’il sois affiché dans mon DBGrid puisque il n'est pas significatif (code Auto Incrémenté)).
    Encore Merci...

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par samidz2014 Voir le message
    Avant j'ai voulu pas qu’il sois affiché dans mon DBGrid puisque il n'est pas significatif (code Auto Incrémenté).
    ce n'est pas parce qu'il est dans la requête que l'on doit l'afficher (il suffit de gérer les colonnes de la DBGrid)
    et c'est certainement mieux car si on a deux personne avec le même nom ce n'est pas forcément le bon qui sera supprimé !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Création d'un etat apres une recherche
    Par jojo57 dans le forum Access
    Réponses: 10
    Dernier message: 15/05/2006, 10h27
  2. Supprimer les enregistrements d'une table !
    Par obon dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/05/2006, 11h15
  3. Récupérer les données après une recherche
    Par cdumas dans le forum Access
    Réponses: 7
    Dernier message: 04/05/2006, 12h09
  4. raffraichir un formulaire après une recherche
    Par ormoy28 dans le forum IHM
    Réponses: 10
    Dernier message: 10/02/2006, 10h53
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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