2010-02-12 4 views
2

J'ai une base de données Access avec une seule requête. Je peux actuellement copier la requête via VBA, en utilisant DoCmd.CopyObject. Cependant, j'ai besoin de pouvoir éditer le SQL dans chaque instance de la requête individuellement. Tous les exemples que j'ai vus cependant, impliquent un jeu d'enregistrements, ce que je n'utilise pas.Microsoft Access VBA pour modifier les requêtes SQL

Des idées?

Avec grâce,

Est-ce

Répondre

1

La question est un peu mince sur ce type de requête que vous souhaitez modifier, mais que c'est une requête de sélection qui n'a pas besoin de paramètres dynamiques. Puis, en utilisant la méthode CopyObject, copiez la requête comme vous l'avez fait. Utilisez l'objet Catalogue (vous devrez faire référence à l'extension ADO). Ensuite, vous pouvez simplement modifier le SQL de la copie comme ci-dessous. Selon votre requête, il peut s'agir d'une vue ou d'une procédure, mais une requête de sélection doit être répertoriée en tant que vue.

Espérons que cela aide.

Siva

Dim catDB As ADOX.Catalog 
Dim cmd As ADODB.Command 
Dim sQueryName As String 
Dim sSQL As String 

Set cn = CurrentProject.Connection 
Set catDB = New ADOX.Catalog 

catDB.ActiveConnection = cn 
DoCmd.CopyObject , "Query1_c", acQuery, "Query1" 
sQueryName = "Query1_c" 
sSQL = "SELECT a,b,c FROM Table1" 

Set cmd = New ADODB.Command 
Set cmd = catDB.Views(sQueryName).Command 
cmd.CommandText = sSQL 
Set catDB.Views(sQueryName).Command = cmd 

Set catDB = Nothing 
cn.Close 
+1

Merci pour votre réponse et mes excuses pour les détails omis. Je viens de réussir à résoudre en passant par ce lien: http://bytes.com/topic/access/answers/211550-query-vba – Gaioshin

+0

@Gaioshin, j'ai trouvé le lien que vous avez fourni ici d'une grande utilité. Cela m'a conduit à l'information dont j'avais besoin, ce qui m'a permis de trouver le reste des informations dont j'avais besoin pour utiliser une boîte de dialogue modale pour fermer une requête existante, apporter quelques améliorations, puis la rouvrir. Fantastique. – Zahhar

2

que je fais ce genre de chose tout le temps! J'ai utilisé VBA pour réécrire les requêtes Access ainsi que les requêtes qui "passent" à une base de données MySQL. La réécriture d'une requête dans VBA dépend de la complexité que vous souhaitez obtenir.

J'ai toujours utilisé DAO, qui est plus ancienne technologie (voir les commentaires ci-dessous pour clarifcation sur DAO vs ADO), mais il a travaillé pour moi dans ce cas. Vous devrez ajouter une référence à DAO dans VBA en allant dans Outils> Références, puis ajoutez "Bibliothèque d'objets Microsoft DAO 3.6".

Vous pouvez écrire une procédure qui ressemble à ceci:

Sub RewriteQuerySQL(strQueryName As String, strParameter As String) 
    Dim db As DAO.Database 
    Dim qdf As DAO.QueryDef 
    Set db = CurrentDb() 
    Set qdf = db.QueryDefs(strQueryName) 

    qdf.SQL = "SELECT [Table].Field1, [Table].Field2 " & vbCrLf & _ 
      "FROM [Table] " & vbCrLf & _ 
      "WHERE ([Table].Field1 = " & chr(34) & strParameter & chr(34) & ");" 
End Sub 

Le code ci-dessus va changer SQL pour la requête que vous spécifiez avec la requête SQL dans le code VBA avec le strParameter intégré dans le SQL question.

Voici une autre façon de le faire. Ceci est du code que j'utilisé dans une application de déclaration des ventes de réécrire une requête basée sur un numéro de vendeur:

Sub rewriteAccountsBySalesRepSortSQL(lngSalesRep As Long) 
Dim db As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim strSQL As String 
Dim strOriginal As String 
Dim strReplacePart As String 
Dim strSQLReplace As String 
Dim lngLocSalesperson As Long 
Dim lngLocMyRoundUp As Long 
Dim lngLocParen As Long 
Dim lngLocEndParen As Long 

Set db = CurrentDb() 
Set qdf = db.QueryDefs("qryS Accounts by Sales Rep Sorted by Diff DESC") 
strSQL = qdf.SQL 

lngLocSalesperson = InStr(strSQL, "Salesperson1)=") 
lngLocEndParen = InStr(lngLocSalesperson + 14, strSQL, ")") 
strOriginal = Mid(strSQL, lngLocSalesperson, lngLocEndParen - lngLocSalesperson) 
'lngLocParen = InStrRev(strSQL, "(", lngLocSalesperson) 

strReplacePart = "Salesperson1)=" & lngSalesRep 

strSQLReplace = Replace(strSQL, strOriginal, strReplacePart) 
qdf.SQL = strSQLReplace 




End Sub 

au lieu d'écrire toute requête, le code trouve simplement le numéro de représentant des ventes et le remplace par le nouveau nombre. En fait, je préfère la dernière méthode. La dernière méthode a été utilisée pour envoyer une requête directement à MySQL, donc la syntaxe avec une requête Access peut être légèrement différente.

+0

DAO n'est pas "ancienne technologie" sauf dans le sens où il a été créé il y a plus longtemps que ADO. ADO est mort, remplacé par ADO.NET, qui n'est pas utilisable dans Access (et a très peu de choses en commun avec ADO à part le nom et quelques structures de base communes à chaque interface d'abstraction de données). DAO, en revanche, est en plein développement depuis A2007 lorsque l'équipe Access a obtenu sa propre version privée du moteur de base de données Jet, maintenant appelé ACE. DAO continuera à être mis à jour et amélioré parallèlement aux améliorations d'ACE, c'est donc l'interface de choix actuelle et préférée. –

+0

@David merci pour la clarification! La raison pour laquelle j'ai mentionné que DAO était «plus ancien» était parce que, si je me souviens bien, Access 2002 Developer's Handbook ou VBA Developer's Handbook, 2e édition, traitent ADO comme si c'était le nouvel enfant sur le bloc et DAO comme si ça sortait de la classe. Je pense qu'ils ont même DAO dans une annexe et ont essayé d'utiliser ADO tout au long du livre. Merci d'avoir clarifié les choses. maintenant je ne me sens pas si mal en utilisant DAO tout le temps :-). –

+0

Classic ADO est maintenant mort, et a été pendant plus d'une demi-décennie. La campagne ADO-everywhere de Microsoft dans le délai A2000/2002 était une erreur énorme, et a été reconnue par les développeurs les plus expérimentés d'Access (qui ne sont jamais passés à ADO pour interagir avec les données Jet). Il est triste que tant de documentation à MS et ailleurs incorpore encore ces hypothèses erronées sur l'avenir de DAO/ADO. MS aurait vraiment dû mieux savoir en premier lieu. –

2

Je ne suis pas d'accord avec toutes les réponses données ici, même si elles répondent à la question posée. Je suis en désaccord parce que je pense que la question est basée sur des hypothèses incorrectes - il n'est pas nécessaire de réécrire le SQL du tout.

La question semble supposer que les requêtes dans Access doivent être sauvegardées. Ils ne le font pas. Vous pouvez exécuter n'importe quelle chaîne SQL arbitraire à tout moment, soit dans le code, soit (pour le SQL non-DML) comme la source d'enregistrements d'un formulaire ou d'un rapport. Les chaînes SQL peuvent être créées à la volée et attribuées selon les besoins au moment de l'exécution. Le seul avantage d'un QueryDef enregistré est si vous devez l'utiliser dans plusieurs emplacements.

Un QueryDef enregistré est fondamentalement identique à un VIEW dans des bases de données de serveur.

Si QueryDef a des paramètres, cela équivaut à une simple PROCEDURE STOCKEE (c'est-à-dire, ceux qui manquent de code, comme IF/THEN ou CASE SELECT).

Si vous souhaitez implémenter le SQL en tant que VIEW sur une base de données de serveur, enregistrez-le en tant que QueryDef dans Access. Si vous le faites en tant que SPROC dans votre base de données de serveur, implémentez-le en tant que requête de paramètre enregistrée.

Mais tout d'abord, déterminez s'il doit être sauvegardé du tout.

Pour ce que ça vaut, j'ai programmé professionnellement dans Access depuis 1996 et je n'économise généralement pas beaucoup de requêtes, et en particulier ne pas enregistrer critères dans les requêtes. Les critères sont spécifiques au contexte d'exécution et doivent être fournis au moment de l'exécution plutôt que sauvegardés dans QueryDef. J'utilise QueryDefs sauvegardé pour le SQL complexe que j'ai besoin de réutiliser ou pour définir des "vues" (en particulier celles avec des jointures complexes) qui sont utilisées à plus d'un endroit dans l'application.

La question initiale n'identifie pas le contexte dans lequel le changement des critères est nécessaire, il est donc vraiment impossible de suggérer la meilleure approche. C'est un cas où je reprocherais à la question d'exclure une discussion appropriée car elle propose une SOLUTION spécifique et demande comment la mettre en œuvre, au lieu de décrire le PROBLÈME et de demander l'éventail des solutions réalisables. Pour ce faire, nous devons connaître le contexte (le SQL DML ou un SELECT? Est-il utilisé dans le code ou comme source de données pour un formulaire ou un rapport? Etc.), mais cela fait complètement défaut ici , donc une gamme complète de solutions ne sera jamais proposée.