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

Access Discussion :

Requete de suppression et lecture seule


Sujet :

Access

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut Requete de suppression et lecture seule
    Ma requete m'affiche bien (en mode base de données) les valeurs à supprimer mais ensuite impossible d'exécuter la requete... Voilà ce que cela me dit lorsque je demande le détail du refus.

    Impossible de supprimer dans les tables spécifiées. (Erreur 3086)
    Vous avez essayé de supprimer des données d'une ou plusieurs tables, mais la suppression ne peut pas être menée à terme.

    Causes possibles :

    Vous n'avez pas l'autorisation de modifier la table. Pour modifier vos autorisations d'accès, consultez votre administrateur système ou le créateur de la table.
    La base de données a été ouverte enlecture seule. La base de données est en lecture seule pour l'une des raisons suivantes :
    Vous avez utilisé la méthode OpenDatabase et ouvert la base de données pour accès en lecture seule.
    Le fichier de base de données est défini en lecture seule dans le système d'exploitation du serveur de la base de données ou par votre réseau.
    Dans un environnement réseau, vous n'avez pas les autorisations d'accès en écriture pour le fichier de la base de données.
    En Microsoft® Visual Basic®, vous avez utilisé un contrôle Data dont la propriété ReadOnly a pour valeur True.
    Pour supprimer les données, fermez la base de données, résolvez le problème de lecture seule, puis rouvrez le fichier pour un accès en lecture/écriture.



    Mes autres requetes d'action (ajout et MAJ) fonctionnent.
    Je suis sous la version 2000.

    Merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Tu devrais mettre le SQL de ta requète, ça aiderai.

    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut précisions
    Donc ma requete doit en principe supprimer de ma table produits tous les produits qui ne sont pas utilisés pour réaliser mes plats.

    DELETE Produits.*, [Composition du plat].N°Pro
    FROM Produits LEFT JOIN [Composition du plat] ON Produits.N°Pro = [Composition du plat].N°Pro
    WHERE ((([Composition du plat].N°Pro) Is Null));


    Elle a l'air de "fonctionner correctement" puisqu'en mode BD j'ai bien les produits à supprimer. Mais c'est lors de l'exécution que cela bloque.
    J'ai pourtant souvenir qu'en simulant cette requete (en pressant sur le bouton d'action) j'avais bien le message habituel:Cette requete est définitive... Vous allez supprimer X enregistrements!

    J'ai essayé de recréer la meme requete mais c'est toujours pareil.
    merci d'avance

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bon je suis pas un champion du SQL mais là tu as un liaison 1 à plusieurs et ça cela fait que ta requète est en lecture seule. Tu peux donc visualiser tes données mais pas les modifier ni les détruire. Pour confirmer copie ta requète et tranforme la en 'Selection' tu devrais voir le read-only.

    Personnelement quand j'ai un truc du genre, je fais un bout de code qui fait cela. Je fais un parcourt de ma table principale et une recherche dans la table liée. C'est moins éléguant qu'une requète mais ça fait le travail.

    Si tu as de la misère avec VBA dit-le.

    A+

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut aide projet access
    Oui je veux bien de l'aide... Je suis loin d'etre douée en programmation!
    Mais je ne comprends pas vraiment pourquoi une requete de suppression ne peut pas fonctionner avec une relation I N, sachant que moi je veux supprimer des données qui n'interviennent pas dans l'autre table.

    Une question: si je fais ma requete de sélection (en fait ce qu'il m'affiche en mode bd pour le moment) et si derrière je fais une requete de suppression s'appuyant sur la 1ère requete tu crois que ça marcherait?


    J'attends tes conseils.
    Merci d'avance

    Céline

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut Re: aide projet access
    Citation Envoyé par mamoure31
    Mais je ne comprends pas vraiment pourquoi une requete de suppression ne peut pas fonctionner avec une relation I N, sachant que moi je veux supprimer des données qui n'interviennent pas dans l'autre table.
    C'est ainsi dans tous les moteurs de base de données que je connais, les requète 1 à N ne sont pas modifiables.

    Une question: si je fais ma requete de sélection (en fait ce qu'il m'affiche en mode bd pour le moment) et si derrière je fais une requete de suppression s'appuyant sur la 1ère requete tu crois que ça marcherait?
    Bonne idée mais ça change rien, tu as toujours une requète 1 à N dans le circuit.

    Bon alors le code à mettre dans un module

    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
     
    private sub SupprimerNonUtilise
      dim db as database : set  db=currentdb
      dim rProduit as recordset. rComposition as recordset
     
      set rProduit=db.openrecorset("Produit")
      set rComposition=db.openrecordset("Composition du plat", dbOpenDynaset)  'DbOpenDynaset permet d'utlilser FindFirst sur une table
      do while not rProduit.eof
         rComposition.findfisrt("[N°Pro]=" & rProduit![N°Pro])
     
         if rComposition.nomatch then
           'On a pas trouver le produit dans les compositions, on peut le détruire
           rProduit.delete
         end if
     
         rProduit.movenext
      loop
      rProduit.close:set rProduit=nothing 'Le =Nothing supprime la référence à l'objet pour libérer la mémoire vive. Normalement Access le fait tout seul mais pas toujours. C'est toujours bon de faire le ménage dérière soi.
      rComposition.close:set rComposition=nothing
      db.close:set db=nothing 
     
    end sud
    Je n'ai pas testé ce code mais il doit fonctionner. Tu auras peut-être des petites erreurs de syntaxe mais c'est une bonne base.

    Maintenant deux points importants :

    1) Ce n'est pas le code le plus efficace qui soit, FindFirst n'est pas très rapide mais si ton volume est faible ça ne paraitra pas. Un autre solution consiterai à utiliser rComposion.seek avec un index. Comme on dit dans les livres : ceci est laissé au lecteur comme exercice ;-)

    2) Après une suppression massive il est recommandé de faire un compactage de la base. Access prend de l'espace disque et ne le rend jamais :-).

    A+

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut merci
    Ok merci c'est gentil!

    Je vais essayer. Une dernière question il exécute le module quand? Au démarrage de la base ou bien lorsque je lui demande?

  8. #8
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Salut,

    Si tu veux exécuter le code de marot_r il faut le mettre dans ton evenements Click de ton bouton Supprimer, tu passe bien par un contrôle pour supprimer?

    @+

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut actuellement...
    J'ai pas encore fait de boutons (cela va venir). Donc tu dis qu'il suffit que je crée ce module et qu'ensuite je l'attribue à un bouton c'st ça?

  10. #10
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    re,

    Soit tu le met directement dans l'evenement click du bouton. Sinon sur ta requête de base :

    DELETE Produits.*, [Composition du plat].N°Pro
    FROM Produits LEFT JOIN [Composition du plat] ON Produits.N°Pro = [Composition du plat].N°Pro
    WHERE ((([Composition du plat].N°Pro) Is Null));
    Tu veux effacer toutes les données des deux tables si le champ N°Pro de la table Composition du plat est Null c'est bien cela ??

    @+

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    En fait j'ai créé la requete pour effacer de ma base les produits (table produits) que je n'utilise pas pour faire mes plats (n'interviennent pas dans la table composition plat).

    Je voulais faire une requete car le but de mon projet est de réaliser des requetes.
    Comment penses-tu que je puisses modifier ma requete (car là en mode bd je visualise bien les éléments que je voudrais effacer). Mon problème est un problème de lecture seule...

    Encore merci.
    Céline

  12. #12
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Ouhais,

    je l'ais testé chez moi j'ai le même soucis, je ne suis pas experte en SQL mais ton soucis viens surement de ta jointure.

    Si quelqu'un a une idée je sèche.

    Ps tu as essayé le code de marot_r

    @+

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 147
    Points : 172
    Points
    172
    Par défaut
    bonjour,
    Si tu souhaites supprimer uniquement les enregistrements de ta table produits tu as une erreur sur ta requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Produits.*, [Composition du plat].N°Pro 
    FROM Produits LEFT JOIN [Composition du plat] ON Produits.N°Pro = [Composition du plat].N°Pro 
    WHERE ((([Composition du plat].N°Pro) Is Null));
    Car tu indique de supprimer aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Composition du plat].N°Pro
    Donc je te propose de réécrirer ta requete de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Produits.*
    FROM Produits LEFT JOIN [Composition du plat] ON Produits.N°Pro = [Composition du plat].N°Pro 
    WHERE ((([Composition du plat].N°Pro) Is Null));
    A+

  14. #14
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Salut niclalex,

    J'ai essayé ce code IDEM. Le problème reste présent, là je Bug.

  15. #15
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    niclalex, je viens d'essayer ta solution et j'ai toujours le même problème...
    je n'ai pas encore testé la solution de marot (je vais d'abord faire mes boutons).

    Si vous trouvez une solution pour modifier ma requete existante n'hésitez pas!

  16. #16
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Pour le code tout dépend de l'usage que tu veux en faire.

    Si c'est une seule et unique fois :
    - créer un nouveau module,
    - execute directement en evironnement de dev.

    Si c'est plusieurs fois mais dans 1 seul form :
    - Glisse un boutont sur ton fom qui va appeler l'assistant de création de bouton et choisi : Fermer le form.
    - Demande l'affichage du code et remplace le docmd.close par le contenu de la procédure que je t'ai écrite.

    Alternative :

    - Glisse un boutont sur ton fom qui va appeler l'assistant de création de bouton et choisi : Fermer le form.
    - Créer un nouveau module ou utilise un existant qui est logique, puis copie et déclare la procédure que t'ai donnée Public, actuellement elle est private donc invisible en dehors du module.
    - Dans le code du form, remplace le DoCmd.Close par Call SupprimerNonUtilise

    Cette option te permets de séparer ton code Applicatif de ton code lié à l'intreface. Cette atrenitive s'applique si tu fais l'opperation de suppression à plusieurs endrois (ex dans un menu, par une icone, un form). De plus si tu changes l'interface tu peux facilement réutilser ton code sans chercher dans tous tes forms quels sont les traitements qui y sont fait.

    C'est une bonne pratique de conception que de séparer ce qui bouge de ce qui ne bouge pas. Mais il n'y a pas de bon ou de mauvais choix dans l'absolu, il faut que tu le détermine en fonction de ton appli.

  17. #17
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    Trois petites choses :
    à vue de nez, le code de marot_r semble bon
    ce qui pose pb pour la requête DELETE, ce n'est pas le JOIN, c'est le LEFT JOIN (une rq avec LEFT JOIN ou RIGHT JOIN est très souvent en lecture seule)
    Si on veut faire ça uniquement avec des rq, il faut utiliser une table tampon
    - copier la clé des enreg à virer dans la table tmp. La requete APPEND peut utiliser un LEFT JOIN
    - supprimer les enreg de produits dont la clé se trouve dans tmp
    - supprimer les données de la table tmp (vous étes priés de laisser la table dans l'état ou vous l'avez trouvée en entrant)

    Accessment,

    Yvan

  18. #18
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    ça progresse lol....

    donc voilà j'ai fait comme a dit ypicot:
    J'ai créé une table Produits non utilisés (ayant tous les champs de la table Produits sinon après ça ne marche pas).
    J'ai créé une requete qui ajoute mes produits non utilisés à la table Produits non utilisés (jusque là c'est Ok).
    Ensuite j'exécute une requete de suppression qui supprime tous les éléments de la table Produits enregistrés dans la table Produits non utilisés.
    Mais là j'ai un pb: j'ai 9 enregistrements à supprimer, je dis Ok et alors j'ai une fenetre qui me dit:
    Impossible d'effacer 3 enregistrements de la requete suppression à la suite de violation de clé
    .
    Les 6 autres ont bien été effacés.
    Où est le problème?


    Autre question: j'ai fait mes boutons mais par contre impossible d'attribuer à un bouton ma requete de suppression... Comment faire?

    Merci davance.

  19. #19
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    Tu as une intégrité référentielle sans suppression en cascade.

    Les enregistrements que tu ne peux pas supprimer sont clé primaire pour des enregistrements situés dans une autre table.

    Yvan

  20. #20
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    salut
    essai ça pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Produits.* 
    FROM Produits INNER JOIN [Composition du plat] ON Produits.N°Pro = [Composition du plat].N°Pro 
    WHERE ((([Composition du plat].N°Pro) Is Null));
    Autrement dit je ne comprends pas l(interet de l'utilisation de la jointure gauche.
    A+

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

Discussions similaires

  1. Suppression dossiers en lecture seul
    Par Lacsap21993 dans le forum Windows XP
    Réponses: 5
    Dernier message: 11/01/2010, 04h58
  2. Requete ODBC toujours en lecture seule ?
    Par Jean-Pierre49 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/04/2008, 17h52
  3. Problème de suppression : Table en lecture seule
    Par DashRendar dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/11/2007, 13h27
  4. requete en lecture seule
    Par mvg dans le forum InterBase
    Réponses: 8
    Dernier message: 04/02/2004, 17h21
  5. [firebird] Connexion impossible en lecture seule
    Par severine dans le forum Administration
    Réponses: 2
    Dernier message: 01/08/2003, 15h35

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