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

Requêtes et SQL. Discussion :

[AC-2003] L'opération doit utiliser une requête qui peut être mise à jour. (Erreur 3073)


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 20
    Points
    20
    Par défaut [AC-2003] L'opération doit utiliser une requête qui peut être mise à jour. (Erreur 3073)
    Bonjour, je viens de nouveau sur ce forum car je craque.
    Je suis un nouvel arrivant dans une structure, et je dois apprendre à manier ACCESS...

    Évidement pour les bases de données ce n'est pas le top, mais faut faire avec :/

    Et on me demande de faire une requête qui mettra à jour une table, par rapport à d'autres.
    En effet, la table saisie_carto est alimentée par station, localisation, localisation communes et observateur. Mais il arrive parfois, qu'une info change dans ces tables, et que saisie_carto n'est pas mis à jour.
    On le fait donc à la main.
    Le but de cette est donc de faire des mise à jour automatiquement. La requête repère s'il y a une différence, et la corrige.

    Mais voilà, lorsque j'exécute ma requête, j'ai cette erreur : L'opération doit utiliser une requête qui peut être mise à jour. (Erreur 3073)

    Pourtant, la requête est bonne et fonctionne (elle ne me trouve qu'un seul résultat en mode feuille de données)

    Voici la requête :

    Code sql : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     UPDATE (saisie_carto
    INNER JOIN (localisation
    INNER JOIN (observateur
    INNER JOIN station
         ON observateur.[Numéro observateur]  = station.[Code observateur])
         ON localisation.[Numéro de localité] = station.[Numéro de localité])
         ON saisie_carto.[Numéro station]     = station.[Numéro station])
    INNER JOIN [localisation communes]
         ON localisation.[Numéro de localité] = [localisation communes].[Numéro de localité]
    SET saisie_carto.observateur              =
      (SELECT DISTINCT observateur.observateur
         FROM (observateur
      INNER JOIN (saisie_carto
      INNER JOIN station
           ON saisie_carto.[Numéro station]    = station.[Numéro station])
           ON observateur.[Numéro observateur] = station.[Code observateur])
      ),
      saisie_carto.[Numéro perso station] =
      (SELECT DISTINCT station.[Numéro perso station]
         FROM station
      INNER JOIN saisie_carto
           ON saisie_carto.[Numéro station] = station.[Numéro station]
      ),
      saisie_carto.dept =
      (SELECT DISTINCT FIRST([localisation communes].dept) AS PremierDedept
         FROM [localisation communes]
      INNER JOIN (localisation
      INNER JOIN (station
      INNER JOIN saisie_carto
           ON saisie_carto.[Numéro station]     = station.[Numéro station])
           ON localisation.[Numéro de localité] = station.[Numéro de localité])
           ON localisation.[Numéro de localité] = [localisation communes].[Numéro de localité]
      ),
      saisie_carto.insee =
      (SELECT DISTINCT FIRST([localisation communes].insee) AS PremierDeinsee
         FROM [localisation communes]
      INNER JOIN (localisation
      INNER JOIN (station
      INNER JOIN saisie_carto
           ON saisie_carto.[Numéro station]     = station.[Numéro station])
           ON localisation.[Numéro de localité] = station.[Numéro de localité])
           ON localisation.[Numéro de localité] = [localisation communes].[Numéro de localité]
      ),
      saisie_carto.commune =
      (SELECT DISTINCT FIRST([localisation communes].commune) AS PremierDecommune
         FROM [localisation communes]
      INNER JOIN (localisation
      INNER JOIN (station
      INNER JOIN saisie_carto
           ON saisie_carto.[Numéro station]     = station.[Numéro station])
           ON localisation.[Numéro de localité] = station.[Numéro de localité])
           ON localisation.[Numéro de localité] = [localisation communes].[Numéro de localité]
      ),
      saisie_carto.[Lieu dit] =
      (SELECT DISTINCT localisation.[Lieu dit]
         FROM localisation
      INNER JOIN (station
      INNER JOIN saisie_carto
           ON saisie_carto.[Numéro station]     = station.[Numéro station])
           ON localisation.[Numéro de localité] = station.[Numéro de localité]
      )
      WHERE (((saisie_carto.observateur)      <>[observateur].[observateur])
    AND ((saisie_carto.[Numéro perso station]) ='JW08/07/17-2'))
    OR (((saisie_carto.[Numéro perso station])<>[station].[Numéro perso station]
    AND (saisie_carto.[Numéro perso station])  ='JW08/07/17-2'))
    OR (((saisie_carto.[Numéro perso station]) ='JW08/07/17-2')
    AND ((saisie_carto.dept)                  <>[localisation communes].[dept]))
    OR (((saisie_carto.[Numéro perso station]) ='JW08/07/17-2')
    AND ((saisie_carto.insee)                 <>[localisation communes].[insee]))
    OR (((saisie_carto.[Numéro perso station]) ='JW08/07/17-2')
    AND ((saisie_carto.commune)               <>[localisation communes].[commune]))
    OR (((saisie_carto.[Numéro perso station]) ='JW08/07/17-2')
    AND ((saisie_carto.[Lieu dit])            <>[localisation].[Lieu dit]));

    J'ai mis en forme cette requête avec la mise en forme automatique d'Oracle (Access est aussi une horreur en mise en forme :/)

    Je fais un test avec saisie_carto.[Numéro perso station]) ='JW08/07/17-2' pour voir déjà avec cette ligne là avant de faire pour les autres.

    J'ai lu sur ce site : http://www.ms-news.net/f1361/requete...-10774190.html que ce n'était pas possible de faire un UPDATE avec ACCESS.

    J'aurais aimé avoir votre avis, et avoir plus de précision sur une solution.

    Je vous remercie par avance.
    PS : ça fait 3 jours que je suis dessus :/

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Dark_mouette,

    Les UPDATE sont tout à fait possibles sur Access, comme dans tous les systèmes gérant le SQL en général.

    Je te renvoie sur ce fil.

    J'ai mis en forme cette requête avec la mise en forme automatique d'Oracle (Access est aussi une horreur en mise en forme :/)
    ==> il faut utiliser les assistants graphique et, ensuite, éventuellement, récupérer le code. Surtout pas l'inverse...

    En regardant, vite fait, ta requête (qui sera diffcilement maintenable, dans le temps), je te suggère de créer plusieurs sous-requêtes (via l'assistant) : la requête finale fera, alors, le boulot.

    Si tu ne t'en sors pas, il y a toujours la possibilité de créer une requête "création de table" qui contiendra les clés à mettre à jour (ainsi que les données). Ensuite, tu crées une requête "mise à jour" (via l'assisant) en partant de la table ainsi créée, liée avec la table à mettre à jour.

    Voilà quelques pistes...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 206
    Points : 243
    Points
    243
    Par défaut
    J'ai déjà été confronté à ce problème, il me semble que c'était un problème de droits de modification sur le dossier.
    En espérant ne pas dire de bêtise et que ça puisse aider.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 20
    Points
    20
    Par défaut
    J'ai déjà essayé en prenant qu'une partie des requêtes.
    J'ai testé avec un UPDATE que sur saisie_carto.observateur

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     UPDATE (saisie_carto
    INNER JOIN (observateur
    INNER JOIN station
         ON observateur.[Numéro observateur]  = station.[Code observateur])
         ON saisie_carto.[Numéro station]     = station.[Numéro station])
    SET saisie_carto.observateur              =
      (SELECT DISTINCT observateur.observateur
         FROM (observateur
      INNER JOIN (saisie_carto
      INNER JOIN station
           ON saisie_carto.[Numéro station]    = station.[Numéro station])
           ON observateur.[Numéro observateur] = station.[Code observateur])
      )
      WHERE (((saisie_carto.observateur)      <>[observateur].[observateur])
    AND ((saisie_carto.[Numéro perso station]) ='JW08/07/17-2'))

    Et ça continuait à me mettre l'erreur.
    Mais si je changeais en ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     UPDATE (saisie_carto
    INNER JOIN (observateur
    INNER JOIN station
         ON observateur.[Numéro observateur]  = station.[Code observateur])
         ON saisie_carto.[Numéro station]     = station.[Numéro station])
    SET saisie_carto.observateur              = ''
      WHERE (((saisie_carto.observateur)      <>[observateur].[observateur])
    AND ((saisie_carto.[Numéro perso station]) ='JW08/07/17-2'))

    Et bien là, la requête fonctionne.

    C'est que j'ai les droits pour changer dans les tables.
    Mais on dirait qu'il n'aime pas la requête imbriquée lors de la séléection des données. Alors qu'il les trouve bien en mode feuille de données.

    Cette requête me déprime totalement

    Si tu ne t'en sors pas, il y a toujours la possibilité de créer une requête "création de table" qui contiendra les clés à mettre à jour (ainsi que les données). Ensuite, tu crées une requête "mise à jour" (via l'assisant) en partant de la table ainsi créée, liée avec la table à mettre à jour.
    Je ne vois pas trop comment faire cela (je ne touche à ACCESS que depuis lundi, avant c'était MySQL et Informix).

    Surtout que la requête devrait normalement fonctionner :/
    Merci d'avance pour vos futurs réponses

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Tu ne veux donc pas découper ta requête en plusieurs requêtes, via l'assistant : OK.

    Pour la requête "création de table", transformes ta requête UPDATE en requête SELECT et sélectionner les champs suivants :
    - saisie_carto.ID (clé primaire de saisie_carto) ;
    - saisie_carto.observateur (valeur actuelle) ;
    - observateur (nouvelle valeur à affecter).

    Via l'assistant, tu modifies le type de ta requête :
    - click droit à un endroit libre de l'emplacement des tables ;
    - "Type de requête" => "Requête création de table" ;
    - donner un nom à ta table temporaire ;
    - lancer la requête.
    ==> une nouvelle table devrait être générée dans l'onglet "Table".

    Via l'assistant, créer une requête R1 :
    - click droit à un endroit libre de l'emplacement des tables ;
    - "Type de requête" => "Requête mise à jour" ;
    - ajouter la table temporaire (FROM) ;
    - ajouter la table saisie_carto (FROM) ;
    - lier les deux tables via saisie_carto.ID (JOIN) ;
    - sélectionner le champ "observateur" de "saisie_carto" (SET) ;
    - "Valeur" = tableTemporaire.observateur (SET xxx=) ;
    - sauvegarder.
    ==> lancer R1 : cela devrait mettre à jour ta table saisie_carto avec le nouvel observateur (!...).

    A tester.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 20
    Points
    20
    Par défaut
    Alors pendant que le site était down (je n'avais qu'une page blanche un petit moment) j'ai continué mes tests.
    Et je ne sais pas si ACCESS est intelligent ou non (si c'est le cas, il est plus intelligent sur les requêtes imbriquées), mais avec ce code, ça aurait l'air de fonctionner (du moins pour le test) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE DISTINCTROW saisie_carto INNER JOIN (observateur INNER JOIN station ON observateur.[Numéro observateur]  = station.[Code observateur]) ON saisie_carto.[Numéro station]     = station.[Numéro station] 
    SET saisie_carto.observateur = observateur.observateur
    WHERE saisie_carto.observateur <> observateur.observateur
    AND saisie_carto.[Numéro perso station] = 'PM06/09/29-01';

    Moi personnellement je trouve ça étrange, il faut enlever les jointures dans la requête imbriquées. Il a l'air de les prendre dans le UPDATE, et les sauvegarder en gros.

    Je ne sais pas si c'est normal ou non, mais du moins ça fonctionne ainsi...
    Mais j'aimerais avoir la confirmation avant de me dire "ouf enfin trouver" et "mais quelle dob ACCES à rien faire comme les autres"

    Ah non cette dernière réflexion je l'ai depuis Lundi...

  7. #7
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    .../... Mais j'aimerais avoir la confirmation avant de me dire .../...
    Visiblement, tu ne lis pas les solutions proposées. Il n'y a donc aucun intérêt à confirmer ou infirmer quoi que ce soit.


    D'autre part, comme tout logiciel, Access nécessite un minimum de formation. D'ailleurs, une quantité importante de tutoriels existe sur ce forum. Une FAQ complète le tableau.


    Enfin,
    .../... je ne touche à ACCESS que depuis lundi .../...
    et déclarer mercredi
    "mais quelle dob ACCES à rien faire comme les autres"...
    puis
    .../... Ah non cette dernière réflexion je l'ai depuis Lundi...
    me paraît léger... mais bon, ce n'est que mon humble avis. Précision : je ne détiens aucune action Microsoft...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 698
    Points : 57 254
    Points
    57 254
    Billets dans le blog
    41
    Par défaut
    bonjour à tous,

    ahhhhh la la, encore le fameux:
    L'opération doit utiliser une requête qui peut être mise à jour. (Erreur 3073)
    ou
    Operation must use an updatable query (Error 3073)
    je vous mets un lien qui m'a semblé intéressant sur le sujet:
    Dealing with Non-Updateable Queries and the Use of Temporary Tables in Microsoft Access

    J'ai l'impression qu'on est pile-poil dans la problématique:
    Reasons why a Query or Recordset is not Updateable...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 20
    Points
    20
    Par défaut
    Si je juge aussi vite ACCES (point de vu SQL) c'est parce que j'ai fait du Mysql, Oracle et Informix.
    Ils avaient tous la même structure pour les requêtes.
    Alors qu'ici avec ACCESS, tout est complétement différent...
    Je ne suis ni pro microsoft, ou pro linux, j'aime beaucoup bosser sur Excel ou XP/Seven, mais il faut avouer que point de vu SQL, ACCESS n'est pas à la hauteur...

    Merci tout de même pour les réponses, mais ce n'étaient pas des solutions envisageable. Je suis admin SI sur ce site que depuis 3 semaines, et je touche à ce SI que depuis Lundi, je ne peux pas créer une table comme bon me semble.

    Je cherchais une solution dans la requête, savoir pourquoi elle ne voulait pas fonctionner.

    Merci f-leb, je vois que même les anglais s'arrachent les cheveux sur les UPDATE (pourtant facile sous un autre SGBD).
    Mais il semblerai (je ne suis toujours pas sur à 100%) que la solution que j'ai trouvé règle le problème.
    ACCESS a l'air de prendre en compte les jointure dès le départ, et ainsi pas besoin de les mettre dans les sous requêtes. C'est tordu (point de vu SQL pur) mais justement ACCESS a son propre langage SQL...
    Maintenant à voir si cela fonctionne avec plusieurs UPDATE et non 1 seul...

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/02/2010, 07h41
  2. Réponses: 0
    Dernier message: 17/01/2010, 17h42
  3. Réponses: 1
    Dernier message: 18/12/2009, 10h29
  4. Réponses: 1
    Dernier message: 23/05/2008, 11h45
  5. Réponses: 7
    Dernier message: 29/04/2008, 12h16

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