Suppression de données (Access)

Résolu
Bonjour,

J'ai un probléme pour supprimer les données sur une ligne d'une table via un formulaire.

J'ai 3 tables (Enchérisseurs, Produits et Contrats_de_vente_annulé) qui sont utilisé dans mon formulaire "annulation de contrat de vente".

T_Enchérisseur = NoEnchérisseur, Nom, Prénom,...
T_Produits = NoProduits, decription, marque, modèle,... ,NoLot
T_Contrats_de_vente_annulés = NoAnnulation, DateAnnulation, NoLot, NoEnchérisseur, RaisonAnnulation

Les relations de ma requête liée à mon formulaire sont:
T_Contrats_de_vente_annulés et T_Enchérisseur sur NoEnchérisseur
T_Contrats_de_vente_annulés et T_Produits sur NoLot

J'ai créer un bouton "Supprimer enregistrement" dans mon formulaire à l'aide de l'assitant d'Access.

Le bouton en question doit supprimer les informations de la table "T_Contrats_de_vente_annulés" uniquement. Lorsque je l'utilise, il supprime les informations dans ma table "T_Produits" et ceux de la table "T_Contrats_de_vente_annulés" demeure présente. Pour la table "T_Enchérisseur" tout reste OK.

Un peu d'aide ne serait pas de refus.

Merci à l'avance

Un Non-Érudit

--
Il fut un temps...
Configuration: Windows XP Internet Explorer 6.0

20 réponses

  1. Bonjour,
    je ne sais pas si le post est toujours d'actualité, mais suite à ton dernier message, voici quelques pistes :

    D'abord, je te conseille vivement de ne pas inclure de parenthèses dans tes noms de table, de champs, ou de n'importe quel objet que tu peux créer. Si vraiment tu y tiens, alors chaque fois que tu devras utiliser ce nom, il te faudra lencadrer de crochets.
    Dans ton cas, lorsque tu fais référence à ta table T_Contrat(s)_de_vente_annulés, il faut que tu écrives [T_Contrat(s)_de_vente_annulés]. Sans cela, c'est le bazar...

    De même pour tes champs appelés No Acheteur et No Lot. L'espace n'est jamais le bienvenu dans le nommage des objets. De même que pour la table avec des parenthèses, cela t'oblige à faire référence à ton objet avec des crochets [No acheteur] et [No Lot].

    Attention aussi à ne pas confondre l'espace et _. Il s'agît de deux caractères différents et non interchangeables.

    Ensuite, dans l'instruction SQL, l'utilisation de me.No_Acheteur et me.No_Lot indiquent d'aller lire la valeur de ces deux champs dans ton formulaire. Précisons donc que ton formulaire doit effectivement contenir ces champs, nommés No_Lot et No_acheteur. Ces champs doivent afficher respectivement les données [No acheteur] et [No Lot] de ta table.
    Si, après avoir vérifié et corrigé tout cela, ça ne fonctionne pas, tu rajoutes, juste avant le DoCmd.RunSQL StrSQL une ligne Debug.Print StrSQL, puis tu fais Ctrl+G pour afficher la fenêtre de débogage. Ainsi, lorsque cette ligne s'exécutera, l'instruction SQL sera écrite dans la fenêtre de débogage, et tu pourra faire un copier/coller afin que je vois ce qui cloche.

    Bon courage.
    1
    1. Résultat final :

      Dim StrSQL As String
      StrSQL = "DELETE [T_Contrat(s) de vente annulés].* FROM [T_Contrat(s) de vente annulés] WHERE "
      StrSQL = StrSQL & "((( [T_Contrat(s) de vente annulés].[No Acheteur])=" & Me.[No Acheteur]
      StrSQL = StrSQL & ") AND (([T_Contrat(s) de vente annulés].[No Lot])=" & Me.[No Lot] & ")); "
      DoCmd.RunSQL StrSQL
      Me.Requery

      Tout fonctionne à merveille !

      Merci énormément pour l'aide et les explications que tu m'as apporté.
      0
  2. Modérateur
    Salut,

    il faut sans doute que tu actives l'intégrité référentielle au niveau de tes relations et cocher les suppressions en cascade.
    0
    1. Message d'access: "Impossible de créer cette relation et d'assurer l'intégrité reférentielle."

      J'avais déjà essayer.

      Je ne suis pas un crac en Access, mais j'ai l'impression que ma table T_Produits est "primaire" dans ma DB et que la table T_Contrats_de_vente_annulés est "secondaire" (Que la table T_Contrats_de_vente_annulés est liée à la table T_Produits).

      Ce que j'ai de besoin c'est que la table T_Produits soit liée à la table T_Contrats_de_vente_annulés.

      Toutes les autres tables de ma DB sont liées à la table T_Produits (elle est centrale si je eut dire)
      0
      1. Modérateur
        Il serait intéressant de nous dire le type des relations entre les tables : 1 à plusieurs, 1 à 1 et sur quels champs (pour savoir s'ils sont des clés primaires)...

        Tu pourrais faire une impression écran de tes relations et coller le document sur cjoint ?
        0
        1. Désolé du délai, je n'ai pas eu le temps de répondre vendredi dernier et la FDS, je suis à OFF.

          Où je joint mon fichier ?

          0
        2. Merci

          Et voilà

          http://cjoint.com/data/cbwbbLpGZA.htm

          J'ai créer une requete "info produits" que j'ai liée dans ma requête et ça fait le même problème

          J'ai mis la table T_PRODUITS pour que tu puisse voir la clé primaire de cette table.

          Il n'y a pas de relation entre ces tables dans la fenêtre "relation"
          0
          1. Modérateur
            En principe : relation 1-n entre enchérisseurs et contrats de ventes annulés.

            Quelle est la différence entre N°dossier de contrat de ventes annulés et N°dossier de R_info_produits ?

            R_info_produits est une table ou une requête ?

            Je pense malgré tout que ton modèle de données est erroné, c'est sans doute pour cela que tu ne peux pas faire ce que tu souhaites.
            0
            1. NoDossier est égal entre Contrat de vente annulé et R_Info Produits

              R_Info Produits est une requête que j'ai fait pour faire afficher les informations sur les produits dans plusieurs formulaire.

              Que veux-tu dire par mon modèle de données est erroné. De quel façon je peux corriger ?

              Merci pour le temps que tu accorde à mon problème.
              0
              1. Modérateur
                Il me faudrait les tables et non des requêtes...

                Peux-tu faire un affichage des relations, mais en mettant toutes les tables (et que les tables) ?
                0
            2. Je n'ai pas de relations "générale" entre les tables en questions.

              Les relations n'était que dans ma requête.

              https://www.cjoint.com/?cevwMjiNGh
              0
              1. Modérateur
                Tu devrais en principe avoir une relation de 1-n entre T-informations-générales sur l'ecan et T_produits. Idem pour T_type exigence, T_catégories de produits, T_carburants...

                C'est le principe : une table avec une clé primaire qui se retrouve comme nom de champ dans une autre table doit avoir une relation 1-n.

                Mais aussi intégrer la table T_no_dossier_encan dans la table t_informations générales sur l'ecan, puisqu'elles ont la même clé primaire
                0
            3. Bonjour tous,
              Sans vouloir faire mon malin, à mon avis on se fourvoie :
              Ton formulaire est basé sur une requête mettant en relation tes trois tables. Si tu as créé le bouton de suppression à l'aide de l'assistant de Access, il tente tout bêtement de supprimer la ligne de ta requête, et donc des tables qui la constituent. Or, il semblerait que la relation créée dans ta requête empêche cette suppression.

              Si tu ne veux supprimer que la ligne de la table T_contrats_de_vente_annulés, je te conseille de le faire par une commande SQL en VBA qui pourrait ressembler à :

              dim StrSQL as String
              StrSQL = "DELETE T_Contrats_de_vente_annulés.* FROM T_Contrats_de_vente_annulés WHERE "
              StrSQL = StrSQL & "((( T_Contrats_de_vente_annulés.NoEnchérisseur)=" & Me.NoEnchérisseur
              StrSQL = StrSQL & ") AND ((T_Contrats_de_vente_annulés.NoLot)=" & Me.NoLot & "));
              DoCmd.RunSQL StrSQL
              Me.Requery

              J'espère que ça répond à ton besoin
              0
              1. Bonjour Manugeo

                Message d'erreur de compilation:
                Membre de méthode ou de données introuvable

                Merci quand même...
                0
                1. Bonjour Blux

                  J'ai apporté les correctifs que tu m'as suggéré dans mes relations.

                  https://www.cjoint.com/?cfr5F0sLHq

                  J'ai ton approbation ?

                  Cependant, mon problème persiste...
                  0
                  1. Modérateur
                    Déjà, ça me semble plus joli :-)
                    Mais je ne vois pas la table T_contrat de vente annulés...

                    Dans tous les cas, lorsque tu as une base avec un modèle de données 'académique', il faut savoir que tu ne peux pas supprimer n'importe quoi n'importe quand, c'est ce qu'on appelle l'intégrité référentielle (par exemple on ne peut pas supprimer un client de la table client si des factures sont en relation avec ce client dans la table facture).
                    0
                2. Je pense que c'est la ligne SQL qui a été coupée au moment du Copier Coller.

                  La clause WHERE doit se trouver en fin de première ligne :
                  ...FROM T_Contrats_de_vente_annulés WHERE "

                  Essaye comme ça.
                  0
                  1. Manugeo

                    Voir ci-joint l'erreur de compilation

                    https://www.cjoint.com/?cfsAXkT5we

                    Merci
                    0
                    1. Modérateur
                      C'est normal, la zone surlignée doit correspondre à un contrôle à partir duquel on récupère le n° enchérisseur...

                      Existe-t'il une telle zone ?
                      0
                  2. Pour les lignes de code vous me perdez complètement.

                    Je me débrouille dans access de façon autodidacte mais la prog, je suis un gros 0
                    0
                    1. Ben oui, je te donne du code, mais c'est toi qui a créé ton formulaire, tes tables, et qui connaît le nom des tables et des champs de formulaire; je suis pas mme Soleil...

                      Pour que ça marche, il faut que ton formulaire ait un champ stockant ton n° d'enchérisseur (qui s'appelle NoEnchérisseur) et un autre qui affiche le n° de lot (NoLot)
                      Les noms sont ceux que tu as donné lorsque tu as expliqué le lien entre tes table.

                      Sur ce, je termine ma journée.
                      0
                      1. J'apprécie énormément le temps que vous m'accordez pour résoudre mon problème.

                        Vous serait-il possible d'expliquer comme si vous vous adressiez à quelqu'un qui a des connaissance limité dans le domaine. Je suis assez brillant pour comprendre, cependant si vous êtes trop technique, je vous perds.

                        Je ne suis pas programmeur, je me suis créer un outil pour m'aider dans mon travail.

                        Recevez, Interlocuteurs, mes salutations distinguées.
                        0
                        1. Bonjour Manugeo

                          Au post no6 j'ai joint une image des trois tables avec le nom des champs des tables.

                          Les lignes de codes ajusté devrait donner ceci:

                          Dim StrSQL As String
                          StrSQL = "DELETE T_Contrat(s)_de_vente_annulés.* FROM T_Contrat(s)_de_vente_annulés WHERE "
                          StrSQL = StrSQL & "((( T_Contrat(s)_de_vente_annulés.No_Acheteur)=" & Me.No_Acheteur
                          StrSQL = StrSQL & ") AND ((T_Contrat(s)_de_vente_annulés.No_Lot)=" & Me.No_Lot & ")); "
                          DoCmd.RunSQL StrSQL
                          Me.Requery

                          Cependant, à l'execution j'ai un message d'erreur '3131' - Erreur de syntaxe dans la clause FROM

                          et le débogage surligne DoCmd.RunSQL StrSQL

                          Le nom des champs de mon formulaire sont "No Lot" et "No Acheteur"

                          Merci de m'expliquer ce qui ne va pas afin de me permettre de comprendre et d'améliorer mes connaissances.
                          0