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 :

Requête pour obtenir la liste des tables


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut Requête pour obtenir la liste des tables
    Bonjour,

    Dans beaucoup de systèmes, il y a une requête qui permet de faire la liste des tables.

    SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL SELECT name FROM master.dbo.sysdatabases

    En MySQL :
    ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM SYSOBJECTS

    Existe-t-il une requête en Access qui permet d'avoir l'équivalent ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    La table système MSysObjects dans Accès liste tous les objets de la base, y compris les tables. Pour sélectionner les tables, il faut filtrer sur le champ type.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Name FROM MSysObjects WHERE Type = 1
    vous ramène le nom de toutes les tables locales, y compris les tables système.

    Le souci concerne les tables liées où le type d'objet n'est plus égal à 1. Par exemple, les tables ODBC sont de type=6 de mémoire. Le plus simple est d'éditer la table MSysObjects pour avoir une idée de la valeur recherchée de type.

  3. #3
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Merci beaucoup !


    --> [Résolu]

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut solution possible
    la table systeme MSysobjects liste toutes les tables y compris elle meme
    les tables de type de données Type = 1 sont celles sur lesquelles on peut directement effectuer des requetes!
    la table MSysNameMap etant repertoriée comme donnée dans la colone Name de la table MSysObjects , stocke les noms des tables et formulaires de la base de données. le type d'un formulaire etant Type = 32768 , on ajoutera la clause where sur la colone Type egalisée à 1 pour n'extraire que le nom des tables.
    ainsi la requete a inserer sera: SELECT * FROM MSysNameMap WHERE Type = 1

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour le forum,

    je suis tombé sur ce fil et m'en suis inspiré pour faire une liste de choix :

    SELECT MSysNameMap.name
    FROM MSysNameMap
    WHERE (((MSysNameMap.[Type])=1))
    ORDER BY MSysNameMap.name;

    La requête fonctionne bien, sauf que j'ai depuis supprimé une table, et que cette table est toujours affichée dans la liste de choix.
    Là où je suis perplexe, c'est que lorsque j'exécute le petit bout de code ci-dessous, et que la table supprimée ne fait pas partie des tables parcourues...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Dim dbCurrent As DAO.Database
      Dim tdfTableDef As DAO.TableDef
     
      Set dbCurrent = Application.CurrentDb
     
      For Each tdfTableDef In dbCurrent.TableDefs
        Debug.Print tdfTableDef.Name & " - " & tdfTableDef.Attributes
      Next tdfTableDef
    Quelqu'un aurait une idée de la raison ?

    D'avance merci.

  6. #6
    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,
    je ne connais pas la table MSysNameMap et d'ailleurs elle n'existe pas dans ma version Access (2013). Personnellement, j'ai toujours utilisé MSysObjects en enlevant tous les objets commençant par MSys:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MSysobjects.*
    FROM MSysobjects
    WHERE (((MSysobjects.Name) Not Like "MSYS*") AND ((MSysobjects.Type)=1))
    ORDER BY MSysobjects.Name;
    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 ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    effectivement, mais cette méthode affiche une table que je ne connais pas, nommée "f_04E2CC4E532D4DC7995479494ECD27D3_Data". J'imagine que c'est une table système également.

  8. #8
    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
    cela doit être les tables systèmes pour les pièces jointes et les champs multi-valués. Ajoute And Flags>=0 dans le WHERE
    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 ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    effectivement, j'avais trouvé cette instruction ailleurs.

    Par ailleurs, je voulais exclure de la liste la table qui contient la requête. J'ai beau chercher je ne trouve pas d'instruction qui permette de donner le nom de la table "en cours".

    Du coup mon code ressemble à ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MSysObjects.Name
    FROM MSysObjects
    WHERE (((MSysObjects.Name)<>"tbl_LaTable") AND ((Left([Name],1))<>"~") AND ((Left([Name],4))<>"MSys") AND ((MSysObjects.Type) In (1,4,6)) AND ((MSysObjects.Flags)=0))
    ORDER BY MSysObjects.Name;

    je ne trouve pas ça très propre. Il existe un moyen propre de retourner le nom de la table en cours ?

  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
    je vois pas ce qu'est "la table en cours" ...
    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
    Développeur VBA
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    La requête est le paramètre "Contenu" d'une liste de choix (zone de liste déroulante) d'un champ de l'une de mes tables. J'aimerais exclure cette table de la liste, si possible de manière plus générique que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((MSysObjects.Name)<>"tbl_NomDeLaTableEnDur") AND ...)

  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
    si le contenu est une requête, cela ne fonctionnera pas (sauf extraire le nom de la table à partir du FROM) mais c'est possible de cette manière:
    -créer une variable globale
    -créer une fonction qui renvoie la variable globale
    -créer une autre fonction alimentant cette variable globale, le nom du contrôle de la liste étant passé en paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Global gstTblName As String
     
    ' fonction à utiliser dans le formulaire
    Function pRowSource(pNomdeLaListe As Control)
    gstTblName = pNomdeLaListe.RowSource
    End Function
     
    ' fonction à utiliser dans la requête (renvoie le contenu du contrôle)
    Function fstTblName() As String
    fstTblName = gstTblName
    End Function
    utilisation dans le formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     call pRowSource(Me.Liste1)
    utilisation dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (MSysObjects.Name)<>fstTblName()
    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 ?

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

Discussions similaires

  1. Obtenir la liste des tables dans Access 2007
    Par je_developpe dans le forum Access
    Réponses: 2
    Dernier message: 13/03/2007, 05h16
  2. [Oracle 8i] Obtenir la liste des tables vides
    Par Bahan dans le forum SQL
    Réponses: 6
    Dernier message: 13/01/2007, 22h46
  3. Obtenir la liste des tables d'une table
    Par Pigoulou dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/02/2005, 14h12
  4. Obtenir le listing des tables d'une BDD
    Par zoubidaman dans le forum Outils
    Réponses: 1
    Dernier message: 10/11/2004, 00h17
  5. Obtenir la liste des tables
    Par edamiral dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 23/04/2004, 13h33

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