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 :

Requête en lecture seule


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 172
    Points : 69
    Points
    69
    Par défaut Requête en lecture seule
    Bonsoir,

    Pourquoi alors que je n'ai rien demandé, la requête ci-dessous est en lecture seule?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT BddCoureurs.NOM, BddCoureurs.Prénom, BddCoureurs.Sexe, BddCoureurs.NAIS, BddCoureurs.CLUB, BddCoureurs.Catégorie, Catégories.CodeCatégorie
    FROM BddCoureurs INNER JOIN Catégories ON BddCoureurs.Catégorie = Catégories.Catégorie
    ORDER BY BddCoureurs.NOM, BddCoureurs.Prénom;
    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour,

    Qu'est-ce qui te fait dire que ...
    la requête ci-dessous est en lecture seule?

  3. #3
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Une requête qui unit les données de deux tables est toujours en lecture seule.
    C'est pareil pour une requête qui fait appel à des opérations.

    Dans ton cas, la requête porte sur plusieurs tables et se retrouve en lecture seule.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 172
    Points : 69
    Points
    69
    Par défaut Merci
    Bien sûr, j'avais oublié

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Oyé oyé ! (et aussi bonjour),

    Tel le chevalier blanc , je m'en viens faire éclater la vérité suprême !

    Citation Envoyé par Heureux-oli Voir le message
    Une requête qui unit les données de deux tables est toujours en lecture seule.
    C'est pareil pour une requête qui fait appel à des opérations.

    Dans ton cas, la requête porte sur plusieurs tables et se retrouve en lecture seule.
    Que nenni, mon ami !

    Ici c'est une requête sélection multi-tables (avec jointure), et non pas une requête UNION.

    Et une requête sélection multi-tables n'est pas nécessairement en lecture seule.
    Pour déterminer si elle est en lecture seule, c'est plus compliqué que ça.

    Alors, avant toute affirmation "définitive", je suggère à gbzmt d'ouvrir la requête en mode création, d'afficher la fenêtre des propiétés et d'affecter à la propriété [Type Recordset] la valeur "Feuille rép.dyn.(MAJ globale)".
    Et puis d'essayer à nouveau de modifier les données...
    Pour commencer, le mieux est d'aller faire une modif dans la feuille de données qui résulte de l'exécution de la requête.

    Ce point a déjà été vu et revu sur le forum (peut être suis-je le seul ici à y être encore sensible, avec gbzmt bien sûr ).
    Regarde ici la discussion... Impossible de mettre à jour un recordset.

    ou encore là:
    http://www.developpez.net/forums/sho...d.php?t=276671

    ou même là:
    http://www.developpez.net/forums/sho...d.php?t=416888

    Et il y a encore d'autres messages comme ça sur le forum...
    Alors !? A quand dans la FAQ ???
    _

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Je sais que ce n'est pas un union query.

    Mais c'est l'image qui m'est venue en premier.

    Mais pour des tables avec jointures et des relations de un à plusieurs ??

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Je sais que ce n'est pas un union query.

    Mais c'est l'image qui m'est venue en premier.

    Mais pour des tables avec jointures et des relations de un à plusieurs ??
    Bien sûr que ça marche !

    Supposons ceci:

    Table T_LABEL:
    champ ID_LABEL NuméroAuto, clé primaire
    champ TXT_LABEL Texte de 50 caractères

    Table T_INFO:
    champ ID_INFO NuméroAuto, clé primaire
    champ ID_LABEL Numérique long, clé étrangère sur T_LABEL.ID_LABEL
    champ TXT_LABEL Texte de 50 caractères

    Relation:
    On crée une relation 1-N entre T_LABEL.ID_LABEL et T_INFO.ID_LABEL, avec application de l'intégrité référentielle.

    Requête sélection:
    Tables jointes T_LABEL, T_INFO.
    Champs affichés:
    T_INFO.TXT_LABEL
    T_INFO.ID_LABEL
    T_LABEL.TXT_LABEL

    QUE PEUT-ON FAIRE DANS LA FEUILLE DE DONNÉES DE LA REQUÊTE ?

    La mise à jour fonctionne dans la feuille de données, aussi bien côté 1 que côté N, mais il est dangereux de modifier la clé primaire côté 1 (si toutefois le type du champ l'autorise).
    C'est pourquoi dans cet exemple je n'ai pas affiché le champ T_LABEL.ID_LABEL.

    La suppression d'une ligne n'aura de conséquence que côté N, dans T_INFO.

    Si tu ajoutes une nouvelle ligne dans laquelle les champs sont renseignés seulement côté N (ici T_INFO), pas de problème:
    >> un enregistrement est ajouté du côté N seulement, dans T_INFO.

    Si tu ajoutes une nouvelle ligne dans laquelle les champs sont renseignés des 2 côtés (1 et N) mais sans renseigner les champs sur lesquelles la relation est basée, pas de problème:
    >> un enregistrement est ajouté du côté 1, dans T_LABEL, avec une nouvelle valeur pour le champ de clé primaire (T_LABEL.ID_LABEL := nouvelle valeur auto) .
    >> un enregistrement est ajouté du côté N, dans T_INFO, pour lequel le champ clé étrangère est automatiquement renseigné avec la valeur du champ de clé primaire de T_LABEL (T_INFO.ID_LABEL := dernière valeur ajoutée T_LABEL.ID_LABEL)).

    C'est magique !

    Maintenant, si la requête contient de multiples tables jointes, la situation peut se compliquer et le moteur de bases de données peut échouer en mise à jour ou ajout.
    _

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Malheureusement, ça marche, je n'avais jamais essayé.


  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 172
    Points : 69
    Points
    69
    Par défaut
    Je reviens sur cette discussion car je viens de tomber sur un cas bizarre.
    En effet suite aux conseils de JBO j'ai affecté à la propriété TypeRecorset la valeur "Feuille rép.dyn.(MAJ Globale)" a une requête.
    Jusqu'ici aprés cette modification mes requêtes pouvaient être modifiées par le code (Edit ou AddNew)
    Cette fois la requête peut être modifiée 'manuellement en mode "ouverte" (modification ou ajout d'enregistrement), mais en VBA :
    "Erreur d'éxécution3027 Mise à jour impossible, la base de données ou l'objet est en lecture seule." j'en perds mon latin, ou plutôt mon VBA
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set CoureursEngagés = MaBase.OpenRecordset("CoureursEngagésR", dbOpenDynaset)
    CoureursEngagés.Edit
    Et le code SQL de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CoureursEngagés.Dossard, BddCoureurs.NOM, BddCoureurs.Prénom, BddCoureurs.Catégorie, BddCoureurs.CLUB, CoureursEngagés.Compétition, CoureursEngagés.CodeCoureur, CoureursEngagés.Rang, CoureursEngagés.Temps, Départs.Départ
    FROM (CoureursEngagés INNER JOIN BddCoureurs ON CoureursEngagés.CodeCoureur = BddCoureurs.CodeCoureur) INNER JOIN (Départs INNER JOIN DEFINIRCourses ON Départs.Code = DEFINIRCourses.Code) ON CoureursEngagés.Compétition = DEFINIRCourses.Désignation
    ORDER BY CoureursEngagés.Dossard;
    Cela viendrait-il de la complexité de la requête qui fait appel à 4 tables ?

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut DAO, OpenRecordset avec l'option dbInconsistent
    Bonjour,
    Citation Envoyé par gbzmt Voir le message
    Je reviens sur cette discussion car je viens de tomber sur un cas bizarre.
    En effet suite aux conseils de JBO j'ai affecté à la propriété TypeRecorset la valeur "Feuille rép.dyn.(MAJ Globale)" a une requête.
    Jusqu'ici aprés cette modification mes requêtes pouvaient être modifiées par le code (Edit ou AddNew)
    Cette fois la requête peut être modifiée 'manuellement en mode "ouverte" (modification ou ajout d'enregistrement), mais en VBA :
    "Erreur d'éxécution3027 Mise à jour impossible, la base de données ou l'objet est en lecture seule." j'en perds mon latin, ou plutôt mon VBA
    Voici mon code:
    ...
    Cela viendrait-il de la complexité de la requête qui fait appel à 4 tables ?
    Si tu peux modifier le contenu de la feuille de données (résultat de l'exécution de la requête) alors il y a sans doute un moyen d'y arriver en VBA/DAO, en utilisant les "bonnes" options d'ouvertures.

    Je te propose d'utiliser l'option dbInconsistent qui (en principe) te donne la même possibilité qu'une propriété TypeRecorset avec la valeur "Feuille rép.dyn.(MAJ Globale)".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set CoureursEngagés = MaBase.OpenRecordset("CoureursEngagésR", dbOpenDynaset, dbInconsistent)
    CoureursEngagés.Edit

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 172
    Points : 69
    Points
    69
    Par défaut
    Parfait

    Merci

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2018
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    je vais voire avec ca
    Citation Envoyé par =JBO= Voir le message
    Oyé oyé ! (et aussi bonjour),

    Tel le chevalier blanc , je m'en viens faire éclater la vérité suprême !


    Que nenni, mon ami !

    Ici c'est une requête sélection multi-tables (avec jointure), et non pas une requête UNION.

    Et une requête sélection multi-tables n'est pas nécessairement en lecture seule.
    Pour déterminer si elle est en lecture seule, c'est plus compliqué que ça.

    Alors, avant toute affirmation "définitive", je suggère à gbzmt d'ouvrir la requête en mode création, d'afficher la fenêtre des propiétés et d'affecter à la propriété [Type Recordset] la valeur "Feuille rép.dyn.(MAJ globale)".
    Et puis d'essayer à nouveau de modifier les données...
    Pour commencer, le mieux est d'aller faire une modif dans la feuille de données qui résulte de l'exécution de la requête.

    Ce point a déjà été vu et revu sur le forum (peut être suis-je le seul ici à y être encore sensible, avec gbzmt bien sûr ).
    Regarde ici la discussion... Impossible de mettre à jour un recordset.

    ou encore là:
    http://www.developpez.net/forums/sho...d.php?t=276671

    ou même là:
    http://www.developpez.net/forums/sho...d.php?t=416888

    Et il y a encore d'autres messages comme ça sur le forum...
    Alors !? A quand dans la FAQ ???
    _

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/07/2015, 17h54
  2. Etats et requêtes - Fichier en lecture seule
    Par com-ace dans le forum WinDev
    Réponses: 1
    Dernier message: 26/01/2014, 21h25
  3. requête de type "NOT IN" en lecture seule
    Par Nono23 dans le forum Bases de données
    Réponses: 6
    Dernier message: 15/06/2011, 20h58
  4. Pb Mise à jour d'une requête (lecture seule)
    Par marco361020 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/09/2008, 17h44
  5. Requête en lecture seule
    Par gbzmt dans le forum VBA Access
    Réponses: 6
    Dernier message: 16/02/2008, 06h24

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