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

VBA Access Discussion :

Problème dans une requete suppression.


Sujet :

VBA Access

  1. #1
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut Problème dans une requete suppression.
    Bonjour aux forums,

    Je vous explique mon problème.

    J'ai une base sql Server.

    J'insere tres simplement une ligne dans une table

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into MCD_Rib values ('nom', '00','00','00','00','00)

    Pour supprimer :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Delete from MCD_Rib where nom = 'x' and Rib_complet = 'xxxxx'

    Aucune problème.

    Sous Access:

    J'ai un formulaire avec un bouton, et quand je clik sur le bouton il doit executer ma requete delete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Set Vdatabase = CurrentDb()
     
    sqlStr = "delete from MCD_Rib_Partenaires where FOUR_Code ='" + code_four + "' and RIB_Complet = '" + num_rib + "'"
     
    Vdatabase.Execute (sqlStr)
    Et j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Impossible de supprimer dans les tables spécifiées. (Erreur 3086)

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour

    Si MCD_Rib_Partenaires est une table liée ODBC dans Access, il faut qu'il y ait un index unique
    ou une clé primaire pour pouvoir faire des modifications (UPDATE) ou des suppressions (DELETE).
    Ça se fait automatiquement si la table SQL Serveur a une clé.
    Sinon ça se fait manuellement au moment où on crée la table liée dans Access.

    A+

  3. #3
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Oui, la liaison est faite par ODBC.

    Tu peux m'expliquer d'avantage stp? Car je ne vois vraiment pas comment faire.

    As tu un lien? tuto? ou un exemple?

    Je te remercie d'avance pour ta réponse

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    1. Si tu ouvres la table, tu peux voir si les données sont modifiables.
    2. Pour vérifier la présence d'un index (unique ou clé primaire), tu ouvres la table en mode création (malgré le message d'avertissement).
    Affichage -> Index

    S'il n'y a pas d'index unique, ni de clé primaire, le plus simple est de détruire la table liée et de le recréer.
    A un moment donné, Access liste les champs de la table et demande quels sont les champs qui permettent d'identifier un enregistrement de manière unique.
    Sélectionner le ou les champs formant une combinaison unique, et valider.
    Les données de la table doivent maintenant être modifiables.

    A+

  5. #5
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Bonjour LedZeppII,

    merci pour ta réponse. J'ai suivi tes étapes ce qui m'a fait avancé.

    Cependant je suis confronté à un autre problème similaire.

    Lorsque j'exécute à nouveau ma requete, je tombe sur l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La mise à jour/suppression d’une ligne unique a affecté plus d’une ligne dans une table attachée. L'index unique contient des doublons. (Erreur 3362)
    Je met à disposition un screen, pour montrer l'architecture :



    Le problème sur SQL Server, c'est que l'on constate bien que cette table ne possède aucune contrainte/dépendance... !?

    Merci d'avance pour votre aide.

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Autre solution
    Il y a très souvent des problèmes lors de l'utilisation de Bases de données Relationnelles inhérentes à sa structure, et tu viens d'en faire les frais. D'une manière plus simple, dans ce type de base, on efface pas un enregistrement! Soit, on détruit la table et on la reconstruit, mais dans ton cas on détruit aussi les relations, soit on met un champs Booléen (Oui/Non) que tu pourrais nommer "Effacé", puis après on requête la table avec une clause Select ... where [Effacé]=0.
    De plus, ça permet de remonter vers le passé! Ah! nostalgie quand tu nous tiens!

    Voili, voilou, voilà

  7. #7
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Merci de ta réponse.

    Un paramètre qui rentre en compte : je ne peux pas modifier la structure de la base de donnée sous SQL Server ... ce qui complique ma tache.

    Il devrait bien avoir une solution pour exécuter ma requete à partir de mon traitement VB. J'ai beau cherché sur le net, je ne trouve aucune réponse..

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Autre solution, suite
    Je viens de jeter un coup d'oeil sur la copie d'écran. Le message que tu as posté dit qu'il y a un doublon, je ne vois pas comment l'effacement d'un enregistrement peut créer un doublon!
    Il semble qu'il y ait un bug:
    sqlStr = "delete from MCD_Rib_Partenaires where FOUR_Code ='" + code_four + "' and RIB_Complet = '" + num_rib + "'"
    Il faut un astérix !

    sqlStr = "delete * from MCD_Rib_Partenaires where FOUR_Code ='" + code_four + "' and RIB_Complet = '" + num_rib + "'"
    Donne moi une réponse avant de voir d'autres possibilités. A+

  9. #9
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Je viens d'ajouter l' * à la requete, mais sans succès.. toujours le meme message d'erreur :

    La mise à jour/suppression d’une ligne unique a affecté plus d’une ligne dans une table attachée. L'index unique contient des doublons. (Erreur 3362)

    Votre requête demise à jour ou desuppression a affecté plusieurs enregistrements dans la table SQLattachée. Une requête de mise à jour ou de suppression ne peut affecter qu'un seul enregistrement à la fois.

  10. #10
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Il y a une autre possibilité : Créer une requête SQL-Direct.

    Voir ici : Créer une requête SQL Direct

    Pour la propriété chaîne de connexion ODBC, tu peux récupérer celle de la table liée.
    Dans la fenêtre d'exécution de l'éditeur VB, taper
    ? currentdb.TableDefs("Nom Table liee").Connect
    Dans la requête tu entres le code SQL (Transact-SQL) de ta requête.

    Sinon, fai le avec ADO.

    Un exemple à moi
    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
    23
    24
    25
    26
    27
    28
    Function DeleteReqNum(Num As Long) As Boolean
    Dim oCn As adodb.Connection
    Dim lgAffRecs As Long
    Dim SQLstr As String, CONNstr As String
     
    DeleteReqNum = True
     
    ' SQL Server connection string
    CONNstr = "Provider=SQLOLEDB" & _
                ";DATA SOURCE=Nom serveur SQL" & _
                ";INITIAL CATALOG=NomBDD" & _
                ";USER ID=NomUtilisateur" & _
                ";PASSWORD=MotDePasse"
     
    SQLstr = "DELETE FROM mm_chg_req" & vbCrLf & _
             "WHERE ReqNum=" & CStr(Num)
     
    ' Ouverture connexion ADO
    Set oCn = New adodb.Connection
    oCn.Open CONNstr
     
    ' Exécution requête 
    oCn.Execute SQLstr, lgAffRecs, adExecuteNoRecords
     
    oCn.Close
    Set oCn = Nothing
     
    End Function
    A+

  11. #11
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par LedZeppII Voir le message

    Sinon, fai le avec ADO.

    Un exemple à moi
    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
    23
    24
    25
    26
    27
    28
    Function DeleteReqNum(Num As Long) As Boolean
    Dim oCn As adodb.Connection
    Dim lgAffRecs As Long
    Dim SQLstr As String, CONNstr As String
     
    DeleteReqNum = True
     
    ' SQL Server connection string
    CONNstr = "Provider=SQLOLEDB" & _
                ";DATA SOURCE=Nom serveur SQL" & _
                ";INITIAL CATALOG=NomBDD" & _
                ";USER ID=NomUtilisateur" & _
                ";PASSWORD=MotDePasse"
     
    SQLstr = "DELETE FROM mm_chg_req" & vbCrLf & _
             "WHERE ReqNum=" & CStr(Num)
     
    ' Ouverture connexion ADO
    Set oCn = New adodb.Connection
    oCn.Open CONNstr
     
    ' Exécution requête 
    oCn.Execute SQLstr, lgAffRecs, adExecuteNoRecords
     
    oCn.Close
    Set oCn = Nothing
     
    End Function
    A+
    Je prend cette méthode, j'ai développé en DOTNET, et c'est identique.

    Enfin ca marche!!! j'en pleure de joie, ca fait 2jours que je bataille avec ce problème!!!

    Mais, parce que j'aime comprendre, pk? pourquoi en passant par un lien odbc ca ne voulait faire mon delete, et par ADO, aucun problème?

  12. #12
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    pourquoi en passant par un lien odbc ca ne voulait faire mon delete, et par ADO, aucun problème?
    Je ne sais pas si la limitation vient d'Access ou d'ODBC.
    Je pencherai plus pour Access, car la requête suppression en SQL-Direct fonctionne.

    La différence ?
    • Avec une requête sur une table liée ODBC, c'est Access qui exécute la requête.
      Pour y parvenir, je suppose qu'il utilise des fonctions de l'API ODBC au lieu d'une instruction SQL.
      Une des conditions est de pouvoir identifier une ligne à l'aide d'un identificateur unique (http://msdn.microsoft.com/en-us/libr...69(VS.85).aspx)
      Peut-être que si ton index était constitué de plusieurs champs ça marcherai.
      Par exemple FOUR_code + RIB_Agence + RIB_Banque + RIB_Compte + RIB_Cle
      ou FOUR_code + RIB_Complet
      *
    • Avec une requête SQL-Direct ou avec ADO, c'est le serveur qui exécute la requête, cette dernière étant écrite avec du SQL natif (Transact-SQL pour SQL Server).


    Voila.
    Pour l'explication Access (requête sur table liée ODBC), ce sont des suppositions, mais je ne dois pas être loin de la vérité.

    A+

  13. #13
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    ok merci des explications.

    Pour l'index, j'avais tenté de mettre plusieurs champs sous Access, mais il m'a envoyé une autre erreur!

    Merci a tout le monde, et passé de bonne fete

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

Discussions similaires

  1. [AC-2003] Problème dans une requete
    Par tyjez dans le forum IHM
    Réponses: 1
    Dernier message: 18/06/2014, 13h46
  2. problème dans une requete SELECT
    Par sky88 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/09/2009, 13h25
  3. Problème dans une requete HQL
    Par cyclopsnet dans le forum Hibernate
    Réponses: 15
    Dernier message: 17/07/2009, 16h43
  4. Problème dans une requete de mise à jour
    Par marsupilami34 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/08/2007, 22h55
  5. encore un probléme dans une requete
    Par sarah_s dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/05/2007, 13h56

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