2012-06-04 1 views
2

J'ai une base de données très cookie-cutter (requêtes très similaires, très répétitives) qui vont dans un rapport modulaire (ie ils retournent tous les mêmes choses avec des critères différents).Obtenir la liste des requêtes dans le projet - MS Access

Il y aura ~ 100 de ces requêtes, donc j'utilise une zone de liste déroulante pour afficher les requêtes, qui sont envoyées au rapport (via OpenArgs).

J'ai besoin de générer une liste de requêtes (juste les noms) que j'ai dans mon projet. J'aimerais que la source de contrôle de la liste déroulante soit cette liste de requêtes.

Peu importe si je dois faire une source de chaîne concaténée Value List ou un type de source Query/Table, la seule chose qui importe est que la colonne liée contient le "qryName"

Ce que je jusqu'à présent:

For Each qry In CurrentDb.QueryDefs 
    list = list & ";" & """" & qry.Name & """" 
    'String in the form "qryName";"qryAnotherQuery";"qryNextQuery" 
Next 

mais apparemment il y a une limite de caractères de ~ 2000 sur les listes de valeurs, donc si j'ai beaucoup de requêtes, je ne peux pas utiliser une liste de valeurs? Notez également: qry.Name renverra quelque chose comme "~ sq_cTableName", pas seulement mes requêtes .. ce qui est un problème. Je voudrais juste des questions.

Des idées? Je suis ouvert à d'autres façons de montrer cette information sans une zone de liste déroulante, aussi longtemps que je peux envoyer le nom de la requête à l'OpenArgs de mon rapport.

Répondre

5

Si vous avez des droits de lecture sur MSysObjects, vous pouvez utiliser cette requête comme source de ligne pour votre zone de liste modifiable.

SELECT m.Name 
FROM MSysObjects AS m 
WHERE m.Type=5 AND m.Name Not ALike "~%" 
ORDER BY m.Name; 

Le critère, m.Name Not ALike "~%", exclut les requêtes temporaires et cachées du jeu de résultats.

Si vous n'avez pas l'autorisation de lecture sur MSysObjects, vous devrez créer une fonction de rappel que vous utiliserez ensuite comme source de ligne pour la zone de liste déroulante. Si vous devez suivre cette route, consultez cet exemple d'Allen Browne qui répertorie les objets du rapport et le remplace par la liste des requêtes à la place: List Box of Available Reports.

+0

C'est exactement ce dont j'avais besoin; affiche les choses exactes que je veux et me permet d'ajouter rapidement et facilement des exceptions (plus d'affirmations "Pas semblable" "') si j'ai des requêtes de mon côté que l'utilisateur n'a pas besoin de voir. Fonctionne bien. Merci! – StuckAtWork

1

Une zone de liste vous permet d'utiliser Me.lstBox.AddItem qryName lorsque vous parcourez vos requêtes.
Vous pouvez alors utiliser une combinaison de ItemsSelected et ItemData pour trouver le nom de la requête

For Each varItm In lstBox.ItemsSelected 
    Debug.Print lstBox.ItemData(varItm) 
Next varItm 

ou si vous ne permettez pas à plusieurs select,

lstBox.ItemData(lstbox.ItemsSelected(0)) 

vous donnera le seul article

+0

Je vais essayer, mais je n'ai toujours pas le moyen de "boucler mes requêtes". Je ne suis pas sûr quelle syntaxe est pour trouver tous les noms de requête pour votre base de données. Mon code ci-dessus trouve toutes les tables, etc, qui ne devraient pas être affichées. – StuckAtWork

+2

méthode rapide et sale - vous devrez regarder ce qui est retourné pour voir ce qu'il faut exclure: 'Select Name, Type de MSysObjects où Type = 5;' - la raison de ne pas l'utiliser comme source pour une zone de liste déroulante est-il inclut également certaines requêtes TMP – SeanC

+0

L'approche 'AddItem' peut ne pas aider dans ce cas parce que' AddItem' nécessite "Value List" comme type de source ligne (voir la rubrique d'aide Access). L'OP nous a déjà dit que la longueur combinée de ses requêtes dépasse la capacité d'une liste de valeurs. La seule façon dont cela pourrait fonctionner est s'il peut obtenir cette limite en excluant les noms des requêtes cachées. – HansUp