Hey, je suis en quelque sorte appris à mettre mes déclarations SQL dans VBA (ou au moins les écrire), mais je ne sais pas comment obtenir les données retournées? P>
J'ai quelques formulaires (formulaires de graphiques) basés sur des requêtes que je gère des paramètres assez réguliers contre, il suffit de modifier les délais (comme les 10 meilleurs ventes pour le mois donné de la chose). Ensuite, j'ai des procédures qui transportent automatiquement l'objet graphique en une présentation PowerPoint. J'ai donc toutes ces questions pré-construites (comme 63) et les formulaires de graphique à correspondre (euh, ouais .... 63 ... Je sais que c'est mauvais), puis toutes ces choses se sont installées sur "Ouvrir / fermer "événements déclenchant la suivante (c'est comme ma meilleure tentative d'être un piratage ... ou des dominos; quel que soit votre préférence). p>
Alors j'essayais d'apprendre à utiliser des déclarations SQL dans VBA, de sorte que, pour que je puisse finalement faire tout cela à cet endroit (je devrais toujours garder tous ces formulaires de graphique, mais je ne sais pas parce que je manque évidemment de compréhension) . p>
En plus de la question que j'ai posée au sommet, quelqu'un peut-il offrir des conseils? merci p>
6 Réponses :
C'est un peu daté, vous voudrez peut-être attraper un Réservez sur le sujet < / a>. Mais voici une tonne de Ressources d'accès et certains tutoriels et exemples aussi. Mais, fondamentalement ... par commentaire: Jetez un coup d'œil à la Classe d'enregistrement . Il contient une collection appelée champs qui sont les colonnes renvoyées de votre requête. Sans connaître votre schéma, il est difficile de dire, mais quelque chose comme ... p> Comme je l'ai dit, votre meilleur pari est de saisir un livre sur ce sujet, ils ont des tonnes d'exemples. p> p>
Tous les types de curseurs ne reviendront pas le recordcompte. Il est plus sûr de ne pas .eof ...
L'exemple de code est DAO et tous les types d'enregistrements renvoient un enregistrement d'enregistrement d'au moins 1 s'il y a des enregistrements, il n'est donc pas nécessaire de vérifier EOF et BOF, car vérifiez que les enregistreurs <> 0 sont suffisants. Si vous portez votre code sur une autre interface de données, votre point est pertinent, mais il est certainement complètement hors base de l'exemple de code actuel, ce qui est assez clairement DAO.
Je vais JP, mais je comprends la surface (comme avec tout). merci encore un homme!
Si vous avez un enregistrement précis, il sera plus efficace de l'utiliser plutôt que de tester EOF sur chaque itération. Combien de millisecondes d'efficacité pourraient être impliqués que vous devriez tester pour;)
Thank @ David-W-Fenton pour l'information est DAO, donc je vais jeter un coup d'œil à la solution de P.Campbell qui est adodb (je l'utilise).
Bien que compliqué, votre chemin est plus facile que d'essayer de construire les déclarations SQL dans VBA. N'oubliez pas que la sauvegarde des requêtes vous permet de les manipuler visuellement. En outre, il existe des avantages de la performance.
Une meilleure compréhension de SQL vous aiderait à consolider et à simplifier vos requêtes existantes (si elles doivent même être simplifiées. On dirait qu'ils font beaucoup de travail, vous pourriez donc avoir besoin de tous 64 requêtes quand même). P>
qui dit, il est assez facile d'exécuter des requêtes SQL en code: p>
Merci. La seule chose que je suis nerveuse / confuse à propos de tous ces objets dans cette affaire, et quand j'ai besoin de le jeter à l'extrémité avant / MDE. Ce sera la première fois que je le fais de cela en fait, car mon expérience limitée avec accès a toujours été simplement conservée dans un état de fond
Il est suffisant de séparer les tables de tout le reste lorsque le moment est venu, en utilisant le séparateur de base de données dans les utilitaires Outils / Base de données.
Utilisez un QueryDef paramétré et l'invoquera de VBA.
La requête est plus facile à concevoir ... facilement testable..et facilement accessible depuis VBA ou un formulaire.
dim rs as recordset set rs = qd.openrecordset()
BTW ... cela utilise les bibliothèques DAO. Assurez-vous que dans 'Références', vous avez sélectionné DAO plus haut que ADO.
Une limitation est que vous ne pouvez pas paramétrer le N dans une déclaration TOP N SQL.
Voici une fonction que vous pourriez envisager de refactoriser une chaîne, et vous serez en mesure de réutiliser n'importe où dans votre code.
Ayez donc un const ou construisez une chaîne pour votre relevé SQL et Pop Dans votre chaîne injectée non sanité, non SQL comme argument :) p>
IE P>
Sub DoStuff(strSQL) Set adoCon = Server.CreateObject("ADODB.Connection") strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db\Database.mdb") 'strConnString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db\Database.mdb") adoCon.Open strConnString Set rsMain = Server.CreateObject("ADODB.Recordset") rsMain.Open strSQL, adoCon Do While NOT rsMain.EOF customerName = rsMain("CustomerName") 'silly example RsMain.MoveNext Loop rsMain.Close Set adoCon = Nothing End Sub
Ouais cela semble cool. pas une mauvaise idée. Je sais comment appeler une fonction publique dans le sous-formulaire (événement), mais qu'en est-il des fonctions ... fonctionnent-ils de la même manière?
@Pcampbell: une raison pour laquelle vous utilisez une connexion ODBC? Vous ne bénéficierez pas de nombreux ADO que vous le feriez si vous utilisez une connexion OLE DB E.G. "Provider = Microsoft.Jet.Oledb.4.0; Source de données =" & Server.mappath ("db \ baseydatury.mdb")
... et je ne suis pas sûr de ce que cet objet "serveur" utilise pour servir des objets ADO (plus d'habitude d'utiliser le registre de la machine locale) et résoudre le chemin d'accès à votre fichier de base de données. Considérez la plupart des gens ici n'auront pas l'objet de serveur référencé et n'obtiendront que les erreurs «objet requises» sur ces lignes.
@oneday: Merci pour les commentaires. C'est juste un extrait, vraiment. Les gens devraient se sentir libres de modifier le code qu'ils trouvent sur Stackoverflow tels qu'ils se sentent correspondre à leur situation.
J'utilise Access 2016 et dispose de la chaîne de fournisseur et de DataSource suivante qui fonctionne pour un .accdb code>:
strverb = "fournisseur = microsoft.ace.oledb.12.0;" & _ "Source de données = C: /Test.accdb" code>
Une autre façon de faire cela qu'il semble que personne n'a été mentionné est de lier votre graphique à un seul querydef sauvegardé puis à l'exécution, réécrivez le querydef. Maintenant, je ne vous recommande pas de modifier les querydefs sauvegardes pour la plupart des contextes, car il provoque une gonflage frontale et n'est généralement pas nécessaire (la plupart des contextes où vous utilisez un queryDef enregistré peut être filtré d'une manière ou d'une autre dans le contexte dans lequel ils sont utilisés, par exemple, en tant que documents de forme, vous venez de passer un argument dans le document docmd.openform).
Les graphiques sont différents car la conduite SQL Les graphiques ne peuvent pas être modifiés au moment de l'exécution. P>
ont suggéré des paramètres, mais ouvrant un formulaire avec un graphique sur celui-ci qui utilise une chaîne SQL avec des paramètres permet de faire sauter la boîte de dialogue Paramètres par défaut. Une façon d'éviter que cela consiste à utiliser une boîte de dialogue pour collecter les critères, puis définissez les références aux commandes sur le formulaire de dialogue sous forme de paramètres, par exemple: p> si vous " En utilisant des références de formulaire, il est crucial que vous le faites, car à partir de l'accès 2002 activé, le service d'expression de jet ne les traite pas toujours correctement lorsque les commandes sont nuls. Les définir en tant que paramètres rectifiant ce problème (qui n'était pas présent avant l'accès XP). P> une situation dans laquelle vous devez em> réécrire le querydef pour un graphique est si vous souhaitez autoriser la utilisateur de choisir le n dans une instruction TOP N SQL. En d'autres termes, si vous voulez qu'ils puissent choisir le top 5 ou le top 10 ou le top 20, vous devrez modifier le queryDef enregistré, car le N ne peut pas être paramétré. P> P>
"Si vous souhaitez autoriser l'utilisateur à choisir le N dans une instruction TOP N SQL" - Eh bien, vous pouvez utiliser une sous-requête corrélée (au lieu de Dynamic SQL) par exemple. (ANSI-92 Syntaxe en mode requête): ... Mais la dernière fois que j'ai vérifié, le moteur d'accès n'était pas bien optimisé (pour le mettre légèrement) pour ce type de construction. p> p>
Merci! Pas sûr de ce que je sois encore là encore, mais c'est comme ça que j'apprends!
désolé j'ai toujours oublié .... j'utilise Microsoft Access 2000
@Justin, s'ils ont aidé qu'il est toujours bon de se moquer de voter les gentils personnes qui vous ont aidé ci-dessous :)