Créer une vue sous Access

2013-01-21 #sql

Mon problème

Pour simplifier un vieux traitement, j'ai eu besoin de créer une vue légèrement compliquée sous Access.

Après avoir mis au point cette vue directement dans Access, j'ai voulu faire un script SQL pour la créer sur la base de données de production. Ce qui a donné un code tout simple :

CREATE VIEW dir_TagsByPlaces
AS
SELECT T5.Place_ID, T5.KeyPlace, T3.Tag_ID, T3.Caption
     , COUNT(T1.Link_ID) AS LinkCount
FROM   dir_Links      AS T1
     , dir_TagLinks   AS T2
     , dir_Tags       AS T3
     , dir_PlaceLinks AS T4
     , dir_Places     AS T5
WHERE  (T2.Link_ID  = T1.Link_ID)
AND    (T3.Tag_ID   = T2.Tag_ID)
AND    (T4.Link_ID  = T1.Link_ID)
AND    (T5.Place_ID = T4.Place_ID)
GROUP BY T5.Place_ID, T5.KeyPlace, T3.Tag_ID, T3.Caption
ORDER BY 2, 5 DESC

Mais quand j'ai voulu vérifier que ce script fonctionnait correctement, j'ai obtenu l'erreur Seules les requêtes SELECT simples sont autorisées dans VIEWS. (3766) !

Et même en enlevant le COUNT() et le GROUP BY ça restait trop compliqué...

Finalement, j'ai réussi à trouver le truc pour que ça marche. Je ne sais pas trop à quoi servent les vues sous Access, mais c'est pas ça qu'il faut utiliser quand on veut l'équivalent d'une vue dans les autres bases de données.

La solution, c'est de créer une procédure :

CREATE PROCEDURE dir_TagsByPlaces
AS
SELECT T5.Place_ID, T5.KeyPlace, T3.Tag_ID, T3.Caption
     , COUNT(T1.Link_ID) AS LinkCount
FROM   dir_Links      AS T1
     , dir_TagLinks   AS T2
     , dir_Tags       AS T3
     , dir_PlaceLinks AS T4
     , dir_Places     AS T5
WHERE  (T2.Link_ID  = T1.Link_ID)
AND    (T3.Tag_ID   = T2.Tag_ID)
AND    (T4.Link_ID  = T1.Link_ID)
AND    (T5.Place_ID = T4.Place_ID)
GROUP BY T5.Place_ID, T5.KeyPlace, T3.Tag_ID, T3.Caption
ORDER BY 2, 5 DESC

Et là, ça passe comme une lettre à la poste et si je regarde la liste des requêtes dans Access, j'y trouve bien ma "vue" dir_TagsByPlaces.

La documentation Access

CREATE PROCEDURE, instruction

Crée une procédure stockée.

Syntaxe

CREATE PROCEDURE procédure (typedonnées param1[, typedonnées param2][, ...]) AS instructionsql

L'instruction CREATE PROCEDURE se compose des éléments suivants :

  • procédure : Nom donné à la procédure.

  • param1, param2 : De un à 255 noms de champ ou paramètres (paramètre : valeur qui est attribuée à une variable au début d'une opération ou avant qu'une expression soit évaluée par un programme. Un paramètre peut être du texte, un nombre ou un nom d'argument affecté à une autre valeur.).

  • typedonnées : Un des types de données SQL Microsoft Access primaires ou un de leurs synonymes.

  • instructionsql : Instruction SQL telle que SELECT, UPDATE, DELETE, INSERT, CREATE TABLE, DROP TABLE, etc.

Exemple

CREATE PROCEDURE Sales_By_CountryRegion ([Beginning Date] DateTime, [Ending Date] DateTime)
AS
SELECT Customer, [Ship Address]
WHERE [Shipped Date] Between [Beginning Date] And [Ending Date]

Notes

Une procédure SQL se compose d'une clause PROCEDURE (qui spécifie le nom de la procédure), d'une liste facultative de définitions de paramètres et d'une unique instruction SQL (instruction/chaîne SQL : expression qui définit une commande SQL, telles que SELECT, UPDATE ou DELETE, et qui inclut des clauses telles que WHERE et ORDER BY. Les instructions/chaînes SQL sont généralement utilisées dans des requêtes et dans des fonctions de regroupement.).

Le nom d'une procédure ne peut être identique à celui d'une table existante