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 :

[ADP Access 2003/SQL Serveur 2000] Vue non "updatable"


Sujet :

Access

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut [ADP Access 2003/SQL Serveur 2000] Vue non "updatable"
    Bonjour à tous,

    J’ai une table T_BOITE_BOI : (BOI_ID,BOI_LIBELLE) connecté à une table T_PLAQUE_PLQ(PLQ_ID,BOI_ID,PLQ_LIBELLE).
    Je voudrais tout simplement faire une vue V_BOITE qui affiche un champ calculé qui donne le nombre de plaque par boite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID,BOI_LIBELLE,(SELECT ISNULL(COUNT(*),0) FROM T_PLAQUE_PLQ  WHERE BOI_ID=BOI.BOI_ID) AS NB_PLQ
    FROM T_BOITE_BOI BOI
    Hélas cette vue n’est pas “updatable” dans Access 2003. (requête corrélée)

    La seule solution que j’ai trouvé est de créer un trigger sur la table T_PLAQUE_PLQ qui mette à jour un champs supplémentaire(BOI_NB_PLQ) dans la table T_BOITE_BOI.

    Est-ce qu’il y a une autre solution à ce problème sans utiliser les triggers?


    Merci d’avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Bonjour

    Et pourquoi pas une vue du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID,BOI_LIBELLE, COUNT(PLQ_ID) as nbrePlq FROM T_PLAQUE_PLQ  INNER JOIN T_BOITE_BOI BOI ON T_BOITE_BOI.BOI_ID=T_PLAQUE_PLQ .BOI_ID
    Groupb by BOI_ID,BOI_LIBELLE

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Hélas , cette vue ne peux être mise à jour.(requête regroupement)

  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 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Avec une fonction utilisateur ça à l'air de fonctionner.
    La fonction :
    Code T-SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE FUNCTION dbo.fnNB_PLQ (@boi_id) 
    RETURNS Int
    BEGIN
    RETURN (SELECT ISNULL(COUNT(*),0) FROM T_PLAQUE_PLQ  WHERE BOI_ID=@boi_id)
    END
    Si besoin donner les droits d'exécuter la fonction aux autres utilisateurs :
    Code T-SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT EXECUTE on dbo.fnNB_PLQ TO public

    La vue :
    Code T-SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID, BOI_LIBELLE, dbo.fnNB_PLQ(BOI_ID) AS NB_PLQ
    FROM T_BOITE_BOI
    A+

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Effectivement celà fonctionne .
    Par contre au niveau performance , les temps de réponse de la vue avec la fonction sont plus longs.

    Je vais regarder si je peux l'optimiser.

    En tous cas merci pour votre aide.

  6. #6
    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 759
    Points
    7 759
    Par défaut
    Bonjour,

    Tu peux commencer en enlevant le ISNULL(..,..).
    COUNT(*) ne renvoie jamais NULL, si je ne me trompe pas.

    A+

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Bonjour ,

    J'ai essayé mais çà ne change pas grand chose au temps de réponse.

    Celà tiens du fait qu'une fonction est moins performante qu'une requête.

    J'ai pensé à une autre solution moins pratique qui est de créer 2 vues :
    1) V_BOITE sans la requête corrélée qui empêche la mise à jour dans Access
    2) V_STOCK_PLQ qui contient le(s) champs calculés avec des requêtes corrélées ainsi que la clé BOI_ID afin de faire le lien entre les 2 vues.

    Il est dommage qu'Access empêche de mettre à jour des Vues contenant des requêtes corrélées qui sont extrèmement puissantes.

    A+

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 047
    Points : 1 042
    Points
    1 042
    Par défaut
    Bonjour,
    J'ai une question est ce que tu crée une vue ou tu veux la modifier?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID,BOI_LIBELLE,(SELECT ISNULL(COUNT(*),0) FROM T_PLAQUE_PLQ  WHERE BOI_ID=BOI.BOI_ID) AS NB_PLQ
    FROM T_BOITE_BOI BOI
    sinon pour modifier je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    alter VIEW V_BOITE
    AS
    SELECT BOI_ID,BOI_LIBELLE,(SELECT ISNULL(COUNT(*),0) FROM T_PLAQUE_PLQ  WHERE BOI_ID=BOI.BOI_ID) AS NB_PLQ
    FROM T_BOITE_BOI BOI
    Bonne journée

  9. #9
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Dans l'absolue, une vue est une table virtuel. Dans une table en général on évite les champs calculés.
    Donc en reprenant la requête de DMboup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID
          ,BOI_LIBELLE
          ,COUNT(PLQ_ID) as nbrePlq 
    FROM T_PLAQUE_PLQ  INNER JOIN T_BOITE_BOI BOI 
                       ON T_BOITE_BOI.BOI_ID=T_PLAQUE_PLQ .BOI_ID
    Group by BOI_ID,BOI_LIBELLE
    Et en la modifiant légérement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE VIEW V_BOITE (ID, LB, CC)
    AS
    SELECT BOI.BOI_ID
           , BOI.BOI_LIBELLE
           , PLQ.PLQ_ID
    FROM T_PLAQUE_PLQ PLQ  INNER JOIN T_BOITE_BOI BOI 
                       ON BOI.BOI_ID= PLQ .BOI_ID
    Il suffira de faire une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ID
       , LB
       , COUNT(CC) AS Nombre
    FROM V_BOITE
    GROUP BY ID
          , LB 
    
    Ce qui devrait suffir à moins que je sois à côté de la plaque (de verglas !)

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Merci Chtulus mais ta requête ne peux pas être mise à jour sous Access(regroupement).

    Par contre j'ai pu améliorer la fonction de LedZeppII .

    Au lieu de renvoyer le nombre de plaque pour une boite donnée , j'ai modifié la fonction qui renvoie maintenant une table.
    Du coup les temps de réponse sont bien meilleurs.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE FUNCTION dbo.fnNB_PLQ () 
    RETURNS @RET_TABLE TABLE(BOI_ID INT PRIMARY KEY,NBP INT NOT NULL)
    AS
    BEGIN
       INSERT INTO @RET_TABLE 
       SELECT BOI_ID_ID,(SELECT COUNT(*) FROM T_PLAQUE_PLQ WHERE BOI_ID=BOI.BOI_ID)
       FROM T_BOITE_BOI BOI
       RETURN
    END
    Il suffit ensuite de modifier la vue qui est tout à fait "updatable" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE VIEW V_BOITE
    AS
    SELECT BOI_ID,BOI_LIBELLE,NBP
    FROM T_BOITE_BOI BOI
             INNER JOIN dbo.fnNB_PLQ ()  FCT
                      ON BOI.BOI_ID=FCT.BOI_ID

  11. #11
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour billybob2,

    Si, si la mienne l'est ! c'est le 2ème pavé...
    J'ai remis dans le premier pavé la requête de DMboup, puis la vue "Updatable" comme tu dis puis la requête qui te sort le résultat ^^


  12. #12
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Exact mais ce n'est pas ce que je veux .

    Je veux une Vue/Requête qui renvoie la liste des boites avec un champ calculé qui donne le nombre de plaques par boite.

    Ta vue renvoie la liste des plaques avec les informations de la boite associée.


  13. #13
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Oki, donc LedZepII a la bonne solution



  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Bonjour a tous,
    Je suis tombe par hazard sur votre fil. J'ai ete confronte au probleme en novembre 2008. Je n'ai trouve aucune solution satisfaisante. Ce que vous faites (qui est bien par ailleurs) est une contorsion qui n'est pas utilisable dans des cas un peu plus complexe.
    Normalement, votre cas doit etre solutionne en indiquant dans le champ "Table unique" la table que l'on veut modifier. Mais ca ne marche pas (j'avais essaye a l'epoque) quand nous voulons modifier plusieurs tables (exemple des relations 1-1).
    Il est possible de faire des vues avec des triggers au niveau de SQL puis de dire a Access d'utiliser la vue avec les regles de la base de donnee (donc les triggers). Mais, dans certains cas cela ne marchait pas, Access mettant la vue en mode read only.
    A l'epoque, j'ai ouvert un ticket aupres de MS. Ce ticket est remonte en Allemagne (centre de level 2 pour l'Europe) puis aux states. MS a ete incapable d'apporter une reponse a ce probleme. Apres analyse avec eux, ce phenomene apparait parceque Access analyse systematiquement la vue (alors qu'il ne devrait pas le faire) alors qu'ADO ne le fait pas! Comme il decouvre qu'il s'agit d'une vue avec l'un des cas suivants:
    - liaison orientee (si plus de 2 dans la vue procincipale ou 1 dans une sous requete)
    - regroupement dans la vue ou une sous requete
    - absence de cle primaire dans l'une des tables ou requete sous jacentes
    La seule solution que nous ayons trouve et qui necessite une sacree acrobatie dans certains cas est de lier la forme via un recordset avec un curseur cote serveur.
    Microsoft m'a confirme qu'il s'agissait bien d'un bug Access ADP. Quand au correctif, aller savoir quand il sortira ... mystere et boule de gomme
    En esperant vous avoir aider
    A bientot

  15. #15
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Merci bien pour ce retour d'expérience.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2009, 14h09
  2. Réponses: 8
    Dernier message: 29/08/2008, 17h29
  3. (Access 2003 - SQL 2000) requete VBA multicriteres
    Par Chris 81 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 29/08/2008, 11h47
  4. Connexion de Access 2003 à SQL Server 2000
    Par Faboul dans le forum Access
    Réponses: 1
    Dernier message: 31/05/2007, 14h45
  5. Access 2003 -> SQL Serveur 2005 Sans ODBC
    Par Destiny dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2007, 15h28

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