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 :

Supprimer champ dans table maître avec tous détails clients


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut Supprimer champ dans table maître avec tous détails clients
    Bonjours

    Je suis entrain de créer une application (gestion des congés (ajout,suppr,calcul...)), tout en utilisant adoconnection, adotable et datasource, j'utilise aussi les relation mettre/détail.
    bon la base est créer avec MSAcces et elle contient plusieurs tables:
    table ref (maitre) ou il y'a :nom,identificateur...
    congann (detail) ou il y'a: nom,datedeb,datefin,durée...
    sold (detail) ou il y'a : soldann,soldexcep...
    ...etc
    et tout les tables ont des champs communs (nom, id).

    Donc, je cherche si dans la fiche personnel si je supprime avec dbnavigator une personne, je veux que cette personne sois supprimer dans tous les autres tables avec tout ces informations (congé,durée,...), car dans la table ref les références qui sont uniques c'est à dire le nom et l'identificateur ne se repettent plus dans la suite des champs de la table car c'est une table maitre et dans les autres tables (detail) la personne avec ca ref peut être repetter une infinité de fois.
    Avec l'insertion ca marche (avec le code: if button = nbpost then...) mais pour la suppression je n'arrive plus à supprimer toutes les detail de tous les tables (seulement de la table ref qui sont supprimer mes les autres non)

    merci

  2. #2
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut,
    Je ne sais pas si Access gère ça mais tu peux utiliser les contrainte d'integrité au niveau des tables.

    A+
    On progresse .....

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par dj_techno
    Bonjours

    Je suis entrain de créer une application (gestion des congés (ajout,suppr,calcul...)), tout en utilisant adoconnection, adotable et datasource, j'utilise aussi les relation mettre/détail.
    bon la base est créer avec MSAcces et elle contient plusieurs tables:
    table ref (maitre) ou il y'a :nom,identificateur...
    congann (detail) ou il y'a: nom,datedeb,datefin,durée...
    sold (detail) ou il y'a : soldann,soldexcep...
    ...etc
    et tout les tables ont des champs communs (nom, id).

    Donc, je cherche si dans la fiche personnel si je supprime avec dbnavigator une personne, je veux que cette personne sois supprimer dans tous les autres tables avec tout ces informations (congé,durée,...), car dans la table ref les références qui sont uniques c'est à dire le nom et l'identificateur ne se repettent plus dans la suite des champs de la table car c'est une table maitre et dans les autres tables (detail) la personne avec ca ref peut être repetter une infinité de fois.
    Avec l'insertion ca marche (avec le code: if button = nbpost then...) mais pour la suppression je n'arrive plus à supprimer toutes les detail de tous les tables (seulement de la table ref qui sont supprimer mes les autres non)

    merci

    remarque:j'ai utilisé access seulement pour créer ma table(rien que les tables), les intégrété et les liaisson sont réalisé avec delphi

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par dj_techno
    remarque:j'ai utilisé access seulement pour créer ma table(rien que les tables)
    Access sait très bien gérer les intégrités référentielles.

    Citation Envoyé par dj_techno
    les intégrété et les liaisson sont réalisé avec delphi
    Là on dirait que tu t'es compliqué la vie. Bien sûr ca doit être faisable de tout définir par Delphi, mais le plus simple reste de définir toutes tes liaisons et intégrités (mise à jour et/ou suppression en cascade) depuis Access.

    A partir de là, ton application sera beaucoup simple à gérer.

    @+ Claudius

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    salut,

    Pour ce genre d'opération je travail dans l'evenement TDataset.OnBeforeDelete: TDataSetNotifyEvent.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure MonDataModule.MonDataSetOnBeforeDelete (DataSet: TDataSet);
    begin
      //- Demarer une transaction mais je ne connais pas syntaxe ADO
      try
        //- Supprimer donnée 1 ere table detaile
        //- 
        //- Supprimer donnée N eme table detaile
     
        //- valider la transaction mais je ne connais pas syntaxe ADO
      except  
        //- annuler la transaction mais je ne connais pas syntaxe ADO
        Abort; // Annule la supression dans la table principale
      end;
    end;

    a+

  6. #6
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Je confirme les propos de Claudius.
    Les bases de donnees sont faite pour ca !
    Tu te compliques la vie, et tu n'exploites pas le plus important des avantages d'un SGBDD qui te garanti l'integrite des donnees.

    Mais comme j'aime bien le dire, as you want, pourquoi faire simple quand on peut faire complique.

  7. #7
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    deux solution s'offre a toi:
    meme si les integrité son réaliser au niveau de delphi tu peut toujour gérer sa au niveau de la base access on activant mettre a jour et supprimer en casscade.
    our créer une procédure dans l'évenement befordelete de la table maitre mais dans ce cas il faut faire attention si ta table et lier a d'autre Adotable ou requette qui peuvent supprimés l'enregistrement.

    je vous recomande de laisser access gerer les intégrité

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    bonjours
    bon je viens de trouver une solution sans passer par aucune intégrité, car on tiens compte que si la base n'est pas créer avec access donc il y'auraa des problémes, et moi je ne veux pas passer par access.
    la solution c'est dans l'evenement beforedelete du dbnavigator en selectionnant la personne et avant ca suppression il va faire une recherche dans la table detail par se nom et supprimer tout les détail:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure Tpers.ADOTable1BeforeDelete(DataSet: TDataSet);
    var
    nom:string;
    begin
      nom:=adotable1.Fields[0].AsString;
        while not adotableann.Eof do
      begin
     adotableann.Locate('nom_et_prenom',nom,[loCaseInsensitive]);
        adotableann.Delete;
      end;
       end;
     end.

    merci

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut plantage lors de la suppression
    salut
    bon je crois que j'ai un autre probléme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure Tpers.ADOTable1AfterDelete(DataSet: TDataSet);
    begin
    while not adotableann.Eof do
            begin
            if adotableann.Locate('nom_et_prenom',adotable1.fields[0].value(*nom*),[loCaseInsensitive]) then
            adotableann.Delete;
            end;
            end;
    end.
    se code est lorsque en selectionnant un enregistrement dans adotable1 il dois faire une recherche dans la table adotableann et supprimer tous les enregistrement qui on pour clonne nom le nom du table1 et enfin supprimer se nom dans la table1.

    c'est un principe qui supprime toutes les détail d'un nom avant qu'il supprime se dernier en second lieu.

    Bon le code aprés vérification dans la base fonctionne normalement et la suppression des détails est effectués mais le nom dans la table adotable1 n'est pas supprimer aprés la suppression des détails, aussi lorsque je supprime avec dbnavigator du nom en excutant l'application elle se plante.

  10. #10
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par dj_techno
    bonjours
    bon je viens de trouver une solution sans passer par aucune intégrité, car on tiens compte que si la base n'est pas créer avec access donc il y'auraa des problémes, et moi je ne veux pas passer par access.
    la majorité sinon la plupart des SGBD d'aujourd'hui ont un système de gestion des intégrité référentielles. par quoi veux-tu passer ? peut-être pouvons nous t'indiquer comment activer ces contraintes dans ton SGBD ?
    c'est bien beau de vouloir le faire à la main, mais pourquoi refaire ce qui est déjà fait si ce n'est pour l'améliorer ? de plus, dans ton cas tu n'as apparemment à faire qu'a quelques tables. lorsque tu seras en présence de plusieurs tables comment feras-tu?

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    effectivement, j'ai beaucoup de tables, donc comment je peux faire cette intégrété de tel sorte que lorsque je supprime un nom de la table reférence toutes les details de se nom dans les autres tables (relation maitre/detail)seront supprimer (il peut avoir une grande liste de détails)
    bon je vais expliquer un peu mon application: il y'a la table ref ou les nom ne se repettent pas avec des Id et il y'a la table conge_annuel ou il y'a beaucoup de détail pour chaque nom c'est à dire que les congé peuvent se repetter une infinité de fois.
    Donc je veux si je supprime un nom de la table nom toutes ces congé et détails serons supprimer aprés un message de notification.
    merci

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Outre l'intégrité que tu ne sembles pas forcémment envisagé et qui n'est pas forcémment possible à appliquer dans tous les cas, le code que tu cites doit se faire dans le beforedelete et non le afterdelete....

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    salut

    je pense que la meilleur solution est d'utiliser le SGBD pour définir les contraintes d'integrité(sont fait pour ça),moi j essayer et ca marche tres bien .
    et comme il a dit evarisnea penser lorsque votre application devient plus grande(plusieurs tables) ca sera tres difficile de programmer tous ca .
    merci

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    bonjours
    Quels sont ces contraintes d'intégrité et comment les faire.
    bon, j'ai du tromper lorsque j'ai dit qu'il s'écrit dans l'evenement afterdelete, concernant la partie manuelle c'est à dire avec le code je crois que j'ai trouver la solution et voici le code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure Tpers.ADOTable1BeforeDelete(DataSet: TDataSet);
    begin
    if MessageDlg('åá ÊÑíÏ ÍÐÝ ÌãíÚ ÈíÇäÊ åÐÇ ÇáÔÎÕ',
        mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
        with adotableann do begin
    adotable1.DisableControls;
    adotableann.DisableControls;
    try
    adotableann.First;
    while not Eof do begin
    if adotableann.Locate('nom_et_prenom',adotable1.fields[0].value,[loCaseInsensitive]) then
       adotableann.Delete;
            adotableann.next;
           end;
            finally
             adotableann.enablecontrols;
              adotable1.enablecontrols;
            end;
                   end;
            end;
             end;
    Mais il y'a un tout petit probléme c'est qu'il laisse toujours le dernier enregistrement et ne le traite pas (je le trouve toujours dans la table), je crois que à cause de "while not Eof do begin" qui n'inclus pas le dernier enregistrement, bon je pense qu'aprés la sortie du boucle je dois faire un test sur le dernier enregistrement et le traiter tout seul avec "matable.last" et locate, j'attends toujours vos comentaires et merci

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Il ne faut pas faire de Next dans ta boucle.

    Et pour l'intégrité ce que tout le monde pense être la meilleure solution c'est que vous n'avez jamais eu à développer des programmes compatibles multi bases de données. Là on est très content de faire les contrôles d'intégrités une seule fois pour toute par programmation...

  16. #16
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    j'ai essayé la solution d'enlever matable.next dans le boucle, les enregistrements sont bien supprimés lorsque je fais la vérification de la table, mais au niveau execution de l'application et lorsque je fais la suppression elle se plante mais les enregistrement sont supprimés.
    merci

  17. #17
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Personnelement,
    Primo , je ne vois pas pourquoi tu n'utilise pas les contrainte d'intégrité au niveau de la BDD.
    Secudno, si tu opte pour la méthode manuelle, utilise une requête au lieu de parcourir un à un tes enregistrement pour suppression.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     DELETE FROM TABLE1 WHERE NOM_PRENOM = :NOM_PRENOM
    Suffit de renseigner le param et d'executer la requête.

    Voilà
    On progresse .....

  18. #18
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    bon pour mon application je travaille avec les ado (adoconnection,adotable et datasource), je ne sais pas comment utiliser cette requette.
    pour les contrainte d'intégrité, j'attends toujours si on peut m'aider à comment les faires.
    merci

  19. #19
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    je vous conseil d'utiliser les transaction SQL cela vous evite d'avoir des enregistrement orphelin .si l'opération crash pour une raison quel ...

  20. #20
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut
    Citation Envoyé par dj_techno
    bon pour mon application je travaille avec les ado (adoconnection,adotable et datasource), je ne sais pas comment utiliser cette requette.
    il suffit d'utiliser un adoquery pour faire les suppression
    Dans l'evenement BeforeDelete, met ceci (et change suivant tes besoins)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    With TAdoQuery.Create(Nil) do
    try
       Connection := ADOConnection; //Ton adoConnection
       SQL.Text    := 'Delete from TABLE_FILLE1 WHERE CHAMPS1 = :ID_PERE';
       ParamByName('ID_PERE').AsString := adotable1.fields[0].value;
       ExecSQL;
       .....//repete autant de fois que le nombre de tes tables filles.
       SQL.Text    := 'Delete from TABLE_FILLEn WHERE CHAMPSn = :ID_PERE';
       ParamByName('ID_PERE').AsString := adotable1.fields[0].value;
       ExecSQL;
    finally
       Free;
    end;
    Citation Envoyé par dj_techno
    pour les contrainte d'intégrité, j'attends toujours si on peut m'aider à comment les faires.
    Utilise la relation pour mettre les contrainte d'integrité sous Access (cf capture)


    Voilà, grossomodo, pour le code, je n'ais pas tester mais ça devrait être comme ça.

    A+
    On progresse .....

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/01/2015, 18h59
  2. Ajout champs dans table existante avec données
    Par Danix dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/03/2009, 08h51
  3. Détection zéro champ dans table détail
    Par looping dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/11/2008, 09h13
  4. comment formater un champs dans table mysql
    Par rollly dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2006, 14h31
  5. Commande Update... vider certains champ dans table.
    Par angelevil dans le forum ASP
    Réponses: 3
    Dernier message: 04/05/2005, 21h08

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