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. #21
    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 j'ai essayer votre code ANDRY mais lors de la compilation il me dit toujours que parambyname non déclaré.

    pour mon code:

    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;

    si j'enleve adotableann.next l'application lors du supprime se plante mais dans la table les enregistrement sont bien supprimé et si je laisse adotableann.next sa marche sans plantage mais il y'a toujours un enregistrement restant à la fin de la table, je ne sais pas ou le probléme
    merci

  2. #22
    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
    bonjours
    bon j'ai essayer votre code ANDRY mais lors de la compilation il me dit toujours que parambyname non déclaré.
    C 'est pour ça que le F1 existe.
    Met Parameters.ParamByName à la place de ParamByName.
    Comme je n'avais pas Delphi sous la main, j'ai pas pu tester.

    A+
    On progresse .....

  3. #23
    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
    Si ton Query détail ne contient que les enregistrements de ton détail il ne faut pas de next et le locate ne sert à rien, sinon pose un filtre plutot que de faire un locate à chaque fois sur ce que tu veux supprimer :

    Explication
    En supposant que tu ais 4 enregistrements :
    1ère itération :
    Delete : Suppression N°1
    Ton Query est sensé être positionner sur le n°2 puisque le 1 n'existe plus
    Next : Ton query se positionne sur le N°3
    2ème itération
    Delete : Suppression N°3
    Ton Query est sensé être positionner sur le n°4 puisque le 3 n'existe plus
    Next : Ton query se positionne à la fin de ton query.

    Résultat tu as supprimé 2 enreg au lieu de 4.

    Pour ton pb tu peux essayer de faire un adotableann.Resync([rmCenter]) après chaque delete, ne connaissant pas ado je ne sais pas si c'est la bonne solution mais avec les Cds on est obligé de procéder ainsi quand on veut supprimer unitairement un détail avec une boucle.

  4. #24
    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
    pourquoi voullez vous compliquer l'existance.

    la solution de andry et parfaite fou appelez la requette dans l'évenement befordelete de la table maitre pour ne pas perdre la valeur du champs clé.

  5. #25
    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
    Citation Envoyé par aityahia
    pourquoi voullez vous compliquer l'existance.

    la solution de andry et parfaite fou appelez la requette dans l'évenement befordelete de la table maitre pour ne pas perdre la valeur du champs clé.
    Je me le demande.
    En plus, il y a encore mieu :
    Gerer les contrainte au niveau de access comme je l'ai montré en haut.

    A+
    On progresse .....

  6. #26
    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 suis d'accord avec andry pour les contraintes d'intégrité et c'est une bonne solution, mais supposons que je ne travail pas avec access et que je travail avec un autre logiciel il y'aura le même probléme.
    Mais pour mon code je cherche qu'il fonctionne bien car je vais l'utiliser dans d'autres manipulation, j'ai enlever Matable.next, au niveau de table les enregistrement sont bien supprimer mais il y'a toujours le plantage au niveau d'execution (lors de la suppession biensûre), aussi j'ai changer matable.next par matable.resync([rmcenter]) les enregistrement sont bien supprimer au niveau de la table mais toujours il y'a le plantage lors du suppression.

    code:

    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.Resync([rmcenter]);

    end;
    finally
    adotableann.enablecontrols;
    adotable1.enablecontrols;
    end;
    end;
    end;
    merci

  7. #27
    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
    qu'est ce que tu appelles plantage? c'est quoi le message d'erreur ?

    Ce qui me gêne dans ta boucle de suppression c'est ton locate qui pourrait faire une boucle infinie, si tous les enregs de ton détail ne sont pas à supprimer. Est-ce que tu as essayé en posant un filtre avant la suppression?

    Autrement essaie ptet un while not Bof au lieu de Eof.

  8. #28
    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
    bonjour
    le plantage c'est à dire lors de la suppression l'application se bloque (en dirais quelle tourne dans l'infinie), mais au niveau des tables tout est bien supprimer.
    ici si je change le EOF par BOF sa ne deviens pas logique (on ne teste pas sur le debut des tables) au contraire la logique c de tester sur la fin des tables et avec cette proposition BOF au lieu de EOF sa ne supprime rien des tables
    merci

  9. #29
    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
    Avec Le Bof il faut evidemment faire un Last avant ta boucle, par contre vu ce que tu dis, tu as une boucle infinie comme je l'évoquais dans le post précédent. Ce qui est surement du à ton Locate.

    Si tu veux absolument garder ton Locate il faudrait que tu codes plutot ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while not Eof do 
    begin
      if adotableann.Locate('nom_et_prenom',adotable1.fields[0].value,[loCaseInsensitive]) then
        adotableann.Delete
      else
        adotableann.Next;
     
      adotableann.Resync([rmcenter]);// vois si nécessaire de conserver cette instruction.
    end;
    Mais cela risque également de planter puisque tu changes l'enregistrement courant de la boucle, bref ton Locate est pas très logique...

  10. #30
    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
    Bonjour,
    Permettez moi d'ecrire ce quelques mots.
    On vous a déjà suggeré 2 solutions valables et plus propre, celle de gerer le contrainte au niveau de la Bdd ou bien d'utiliser un query pour la suppression.
    Mais vous persistez à utiliser une methode pas trop propre à nos jour(c'est mon avis et ça n'engage que moi).
    Néammoins, je vous propose une solution qui, je pense doit marcher avec locate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Tant que locate trouve un enregistrement
    while adotableann.Locate('nom_et_prenom',adotable1.fields[0].value,[loCaseInsensitive]) do
    begin
    //on le supprime
      adotableann.Delete;
      // et on se repositionne sur le premier enregistrement de la table pour  une locate suivante. Cette ligne peut être enlever si besoin après verification
      adotableann.first;
    end;
    voilà
    On progresse .....

  11. #31
    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
    bonjour
    bon, j'ai ajouté un else avant adotableann.next, aussi j'ai enlevé adotableann.resync... et tout a bien fonctionner (et je vais essayer aussi le code de andry).
    merci andry de ton avis, mais je ne connais pas bien le fonctionnement des query et les requêtes sql, si il y'a un bon document ou je peux connaitre les principes des query (et sql) et comment je peux les uliliser dans mes applications je vous dois le grand merci.
    merci

  12. #32
    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
    Pour SQL, il y en a sur le site

    http://sqlpro.developpez.com/

    A+
    On progresse .....

  13. #33
    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
    On vous a déjà suggeré 2 solutions valables et plus propre, celle de gerer le contrainte au niveau de la Bdd ou bien d'utiliser un query pour la suppression.
    Je ne conteste pas ces 2 solutions, mais si tu travailles en cache ces solutions ne gèrent pas l'accès concurrentiel, je ne les considère donc pas plus propre.
    Si un premier utilisateur décide de supprimer un enregistrement détail alors que le deuxième utilisateur décide de supprimer l'intégralité du maitre détail, le deuxième utilisateur ne sera pas prévenu qu'une modification a été faite. Alors qu'avec cette écriture l'accès concurrentiel est géré et le deuxième utilisateur ne pourra pas supprimer le maitre détail. Cela dépend donc de la façon dont on veut gérer l'accès concurrentiel, les 3 solutions sont valables. La question est donc de savoir qui a raison le premier ou le dernier qui valide ses modifications. Dans ma boite on a choisit de dire que c'est le premier qui valide qui a raison et on adopte donc cette écriture en ajoutant dans la clause where une date et heure de modification sur chacune des requêtes de mises à jour(delete et maj). Dans les 2 solutions données précedemment c'est le dernier qui valide qui a raison.
    Libre à chacun de choisir, il y a plusieurs façons de voir les problèmes et de les régler.

  14. #34
    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
    bonjour
    merci andry pour le lien du sql, mais y'a t'il des autres lien (ou documents) qui expliquent le fonctionnement et comment utiliser (connection,requêtes...) les query et les ttables car j'ai trop chercher et je n'ai rien trouver.

    grand merci

  15. #35
    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
    bah, tu as le choix de tuto sur le SGBD dans la section tutoriel Delphi
    http://delphi.developpez.com/cours/

    A+
    On progresse .....

  16. #36
    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
    effectivement j'ai cherché dans cours/tutoriels delphi et je n'ai pas trouvé se que je cherche (connexion et manipulation des ttable et query)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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