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 :

L'opération doit utiliser une requête qui peut être mis à jour [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut L'opération doit utiliser une requête qui peut être mis à jour
    Bonjour à tous,

    Je me permets de vous solliciter car j'ai un souci avec une requête de MAJ sur Access.

    Concrètement, je cherche à mettre à jour la table ANIMAL_MARQUE ci-dessous et plus particulièrement le champ AGE_ACTUEL. En effet, un animal marqué peut être capturé plusieurs fois. Lors de chaque capture, son âge est inscrit dans le champ AGE de la table CAPTURE.

    Je précise que mes tables ont une double clé primaire car mes données sont enregistrées sur 2 sites études et où les individus ont le même identifiant.


    Nom : Relations.jpg
Affichages : 1567
Taille : 120,1 Ko

    Pour cela, j'ai don créé une première requête qui me permet de calculer l'âge actuel (age dernière capture + (Date () - Date dernière capture).

    Le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAPTURE.SITE, CAPTURE.ID_ANIMAL, Max(CAPTURE.Date) AS DATE_CAPT_MAX, CAPTURE.AGE AS AGE_CAPT_MAX, Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25)) AS AGE_ACTUEL
    FROM ANIMAL_MARQUE INNER JOIN CAPTURE ON (ANIMAL_MARQUE.SITE = CAPTURE.SITE) AND (ANIMAL_MARQUE.ID_ANIMAL = CAPTURE.ID_ANIMAL)
    GROUP BY CAPTURE.SITE, CAPTURE.ID_ANIMAL, CAPTURE.AGE;
    Cette requête fonctionne bien et me renvoi les résultats suivants:
    Nom : R1.jpg
Affichages : 1349
Taille : 159,0 Ko

    Pour les chevreuils (CHEVXXX), l'âge ne peut être calculé car il n'est pas possible de renseigner l'âge plus précisément que >1 ou <1.

    Enfin, je crée la requête de mise à jour tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ANIMAL_MARQUE INNER JOIN AGE_ACTUEL ON (ANIMAL_MARQUE.ID_ANIMAL = AGE_ACTUEL.ID_ANIMAL) AND (ANIMAL_MARQUE.SITE = AGE_ACTUEL.SITE) SET ANIMAL_MARQUE.AGE_ACTUEL = [AGE_ACTUEL]![AGE_ACTUEL];
    Les codes me semblent corrects, mais cette requête de MAJ me renvoie le message d'erreur suivant lors du lancement: "L'opération doit utiliser une requête qui peut être mise à jour".

    Je ne comprends donc pas d'où provient ce dysfonctionnement. Est-ce les erreurs dans le calcul de l'âge des individus CHVXXX ?

    Pouvez-vous m'aider svp ?

    Merci.

    JB

  2. #2
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut,
    Dans la 1ere req il faudrait remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nz(Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25)),0)
    Dans la 2nd, un truc m'interpelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET ANIMAL_MARQUE.AGE_ACTUEL = [AGE_ACTUEL]![AGE_ACTUEL]
    Esssayez avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET ANIMAL_MARQUE.AGE_ACTUEL = [AGE_ACTUEL].[AGE_ACTUEL]
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Bonjour et merci.

    Malgré ces modifications, toujours le même message...

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    Avec Access on ne peut pas utiliser une requête de regroupement pour faire de la mise à jour.
    Il faut, soit passer par les fonctions de domaine (compliqué avec plusieurs tables), soit passer par une table temporaire ou utiliser VBA.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonjour,
    Avec Access on ne peut pas utiliser une requête de regroupement pour faire de la mise à jour.
    Il faut, soit passer par les fonctions de domaine (compliqué avec plusieurs tables), soit passer par une table temporaire ou utiliser VBA.
    Bonjour.
    Ok merci.
    En vba ça pourrait donner quoi ? Je ne maîtrise pas du tout à ce niveau.
    Merci

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    d'accord avec Tee_grandbois, j'utiliserai une table temporaire

    le code
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT xxx FROM yyyy
    devient
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT xxx INTO zzz FROM yyy

    et on utilise cette tables temporaire pour les updates

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Pour les chevreuils (CHEVXXX), l'âge ne peut être calculé car il n'est pas possible de renseigner l'âge plus précisément que >1 ou <1.
    c'est ce qui provoque l'erreur de calcul dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25))
    car >1 et <1 ne sont pas des nombres
    il faudrait tester le début de l'identifiant animal pour ne pas faire le calcul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iif(Left([ID_ANIMAL,4)="CHEV",CAPTURE.AGE,Nz(Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25)),0))
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Les > et < provoquent les erreurs de calcul dans la première requête, mais ce sont ces erreurs qui bloquent la MAJ par la suite?

    Méthodologiquement, ma requête "AGE_ACTUEL" devient ma table temporaire c'est ça? Et ensuite dans ma requête de mise à jour du champ ANIMAL_MARQUE.AGE_ACTUEL, je fais quelque chose du genre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AGE_ACTUEL.AGE_ACTUEL INTO AGE_ACTUEL FROM
    ?????

    C'est cela ?

  9. #9
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut,
    Ce qui serait assez sympa pour distinguer les objets de ta bdd, d'ajouter un préfixe pour les tbl, req, form et rep
    Ta reqAGE_ACTUEL devrait avoir la syntaxe suivante
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAPTURE.SITE, CAPTURE.ID_ANIMAL, Max(CAPTURE.Date) AS DATE_CAPT_MAX, CAPTURE.AGE AS AGE_CAPT_MAX, Iif(Left([ID_ANIMAL,4)="CHEV",CAPTURE.AGE,Nz(Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25)),0)) AS AGE_ACTUEL
    FROM ANIMAL_MARQUE INNER JOIN CAPTURE ON (ANIMAL_MARQUE.SITE = CAPTURE.SITE) AND (ANIMAL_MARQUE.ID_ANIMAL = CAPTURE.ID_ANIMAL)
    GROUP BY CAPTURE.SITE, CAPTURE.ID_ANIMAL, CAPTURE.AGE;
    Comme te l'indique tee_grandbois, et j'ai manqué d'assiduité sur ce coup-là, est qu'on ne peut pas utiliser une requête de regroupement (GROUP BY) pour source d'une requête action (Update). Ce qui est ton cas.
    Donc, pour contourner la difficulté, il te faudrait créer une tbl (tblAGE_ACTUEL_tmp) avec les mêmes champs que ta reqAGE_ACTUEL.
    Tu crées ensuite une req Insert into (ajout) ayant pour source ta reqAGE_ACTUEL qui te permettra d'alimenter la tblAGE_ACTUEL_tmp.
    Une fois la tblAGE_ATUEl_tmp alimentée, tu crées ta req Update (màJ) ayant pour source ta tblAGE_ACTUEL_tmp pour mettre à jour ta tblANIMAL_MARQUE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tblANIMAL_MARQUE INNER JOIN tblAGE_ACTUEL_tmp ON (tblANIMAL_MARQUE.ID_ANIMAL = tblAGE_ACTUEL_tmp.ID_ANIMAL) AND (tblANIMAL_MARQUE.SITE = tblAGE_ACTUEL_tmp.SITE) SET tblANIMAL_MARQUE.tblAGE_ACTUEL_tmp = tblAGE_ACTUEL_tmp.tblAGE_ACTUEL_tmp;
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir
    Les > et < provoquent les erreurs de calcul dans la première requête, mais ce sont ces erreurs qui bloquent la MAJ par la suite?
    non, mais cela aurait provoqué une autre erreur si la première requête n'était pas un regroupement.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par hyperion13 Voir le message
    Salut,
    Ce qui serait assez sympa pour distinguer les objets de ta bdd, d'ajouter un préfixe pour les tbl, req, form et rep
    Ta reqAGE_ACTUEL devrait avoir la syntaxe suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAPTURE.SITE, CAPTURE.ID_ANIMAL, Max(CAPTURE.Date) AS DATE_CAPT_MAX, CAPTURE.AGE AS AGE_CAPT_MAX, Iif(Left([ID_ANIMAL,4)="CHEV",CAPTURE.AGE,Nz(Int(CAPTURE.AGE+((Date()-Max(CAPTURE.Date))/365.25)),0)) AS AGE_ACTUEL
    FROM ANIMAL_MARQUE INNER JOIN CAPTURE ON (ANIMAL_MARQUE.SITE = CAPTURE.SITE) AND (ANIMAL_MARQUE.ID_ANIMAL = CAPTURE.ID_ANIMAL)
    GROUP BY CAPTURE.SITE, CAPTURE.ID_ANIMAL, CAPTURE.AGE;
    Comme te l'indique tee_grandbois, et j'ai manqué d'assiduité sur ce coup-là, est qu'on ne peut pas utiliser une requête de regroupement (GROUP BY) pour source d'une requête action (Update). Ce qui est ton cas.
    Donc, pour contourner la difficulté, il te faudrait créer une tbl (tblAGE_ACTUEL_tmp) avec les mêmes champs que ta reqAGE_ACTUEL.
    Tu crées ensuite une req Insert into (ajout) ayant pour source ta reqAGE_ACTUEL qui te permettra d'alimenter la tblAGE_ACTUEL_tmp.
    Une fois la tblAGE_ATUEl_tmp alimentée, tu crées ta req Update (màJ) ayant pour source ta tblAGE_ACTUEL_tmp pour mettre à jour ta tblANIMAL_MARQUE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tblANIMAL_MARQUE INNER JOIN tblAGE_ACTUEL_tmp ON (tblANIMAL_MARQUE.ID_ANIMAL = tblAGE_ACTUEL_tmp.ID_ANIMAL) AND (tblANIMAL_MARQUE.SITE = tblAGE_ACTUEL_tmp.SITE) SET tblANIMAL_MARQUE.tblAGE_ACTUEL_tmp = tblAGE_ACTUEL_tmp.tblAGE_ACTUEL_tmp;
    Bonjour,

    Merci beaucoup cela fonctionne bien!

    Lorsque je lance pour la première fois la requête INSERT, puis UPDATE, c'est parfait.

    En revanche, si j'ouvre ma base demain et que je veux connaitre l'âge actuel, il faut que je relance la requête INSERT puis UPDATE pour avoir les données à jour. Je ne me trompe pas ?

    Ainsi, lorsque je ré effectue la manip une seconde fois, cela demande d'écraser les données présentes dans la table temporaire par les nouvelles et le message suivant apparaît:

    Nom : Sans titre 1.jpg
Affichages : 1053
Taille : 77,7 Ko

    Savez-vous comment remédier à cela?

    Merci.

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    il faut vider la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete * from tblAGE_ACTUEL_tmp;
    ou remplacer la requête ajout (insert into) par une requête création de table (select into)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Membre à l'essai
    Homme Profil pro
    Chargé d'étude faune sauvage
    Inscrit en
    Février 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'étude faune sauvage

    Informations forums :
    Inscription : Février 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonjour,
    il faut vider la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete * from tblAGE_ACTUEL_tmp;
    ou remplacer la requête ajout (insert into) par une requête création de table (select into)
    C'est parfait, cela fonctionne très bien.

    Pour résumé:

    1- Requête de l'âge actuel
    2- Création d'une table temporaire dont les champs sont les mêmes que la requête précédente
    3- Requête de suppression des enregistrements de la table temporaire
    4- Requête d'ajout des enregistrements de la requête AGE_ACTUEL vers la table temporaire
    5 - Requête de MAJ de la table voulue à partir des champs de la table temporaire.

    Une macro qui organise ces étapes et c'est bon.

    Encore merci tee_grandbois et hyperion13!

    Bonne fin de journée.

    JB

+ 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