0
votes

Comment ré-définir le SQL dans un querydef? J'ai du code qui fonctionne en supprimant et en créant le querydef, mais je ne peux pas récupérer le remplacement de travailler

On me dit (et j'accepte) qu'il est préférable de remplacer le SQL dans un querydef existant, plutôt que de supprimer et de redéfinir le requérant chaque fois que la requête doit changer. Mais mon code ne semble que travailler la deuxième manière. Voici le code que j'ai qui fonctionne:

Dim db As Database
Set db = CurrentDb
Dim QD As QueryDef
Dim mySql As String
mySql = " "
Set QD = db.CreateQueryDef(("qryX"), mySql)

mySql = "TRANSFORM COUNT(tblDocs.Document) AS CountOfDocument " & _
            "SELECT tblDocs.[Contractor Dept], " & _
            "COUNT(tblDocs.Document) AS [Total Of Document] " & _
            "FROM tblDocs " & _
            "GROUP BY tblDocs.[Contractor Dept] " & _
            "PIVOT tblDocs.[Engineering Status Code]"
QD.SQL = mySQL                                             'overwrite query SQL
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"


4 commentaires

Si vous exécutez une deuxième version, elle augmentera une erreur au moins à la deuxième exécution (vous ne pouvez pas créer une requête qui existe déjà) ou vous cachez un gestionnaire d'erreur! Vous devez vérifier si la requête utilise déjà avant de le créer! Mon conseil, utilisez un querydef temporaire et db.execute .. Supprimez également la double parenthèse, voir Stackoverflow.com/questions/51272430/...


MySQL Tag est tort que si vous utilisez Oracles MySQL Base de données comme Backend!


Oui, le gestionnaire d'erreur est affiché dans le premier code, où je supprime et re-crée la requête à chaque fois que je dois modifier la requête. Le deuxième code ne montre pas le code «Nettoyage» que j'utilise plus tard pour supprimer tous les objets temporaires, y compris la requête, de sorte qu'il ne crée pas d'erreur. Cette erreur que je connais bien. Mais changer la partie .SQL d'un querydef ne fonctionne pas pour moi, qui est le creux de mon problème.


Sur erreur CV Suivant sans vérifier que l'objet ERR-ERR-ultérieur n'est pas un gestionnaire d'erreur, il suffit d'un harpeter; (Second code l'a aussi? Cela explique pourquoi il ne vous montre pas l'erreur sur la déclaration SQL invalide (3129)!


4 Réponses :


1
votes

Vous pouvez recycler l'objet si vous ne le supprimez pas:

' On Error Resume Next
Set QD = db.QueryDefs("qryX")
QD.SQL = mySQL
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"


6 commentaires

Cela ressemble à ce que le code que j'ai essayé ne veuille pas travailler. Est-ce que je manque quelque chose? Dois-je réexaminer la ligne "Définir qd = db.querydefs (" qryrex ") à chaque fois que je dois modifier la requête?


Même ré-exécuter "Ensemble qd = db.querydefs (" qryx ") chaque fois que cela ne semble pas fonctionner. Il ne crée toujours pas Tbldocscrossstabx.


Vous avez besoin de la définir une fois seulement.


Dans le deuxième ensemble de code, le code que j'ai besoin d'aide, je ne l'ai défini qu'une seule fois. Cela n'exécute pas le SQL!


Je pense que cela devrait fonctionner, donc je ne peux pas dire pourquoi ce n'est pas le cas. Essayez de courir la requête manuellement.


Ça fait, désolé. La différence était que j'essayais d'attribuer SQL au Querydef lors de la création (Creequerydef (((Qryrex »), MySQL)), mais la chaîne que j'ai essayée d'insérer sous forme de code SQL n'est pas valide SQL. Donc, aucun querydef n'est même a été créé. Désolé pour la frustration.



0
votes

Si vous pouvez utiliser une sous-requête, vous pouvez utiliser un reque de Tempory querydef au lieu de la préoccupation avec la vérification de la vérification de QueryDef déjà existant ou non, combinez simplement la requête SELECT et INSERTE pour utiliser un QueryDef

Malheureusement, vous ne pouvez pas utiliser transformer dans une sous-requête afin que ce code conduit à Runtime-Error 3129 Instruction SQL non valide . . xxx


4 commentaires

Je vais essayer cela. Merci!


Pas de chance. Maintenant, je reçois l'erreur "Instruction SQL non valide; attendu" Supprimer "," Insérer "," Procédure "," Sélectionner "ou" Mettre à jour "."


Désolé, je n'ai pas réalisé que vous ne pouvez pas utiliser la transformation dans une sous-requête. Ensuite, vous avez besoin d'une requête enregistrée et de gérer si pour être créée ou non.


Certes, mon SQL original était assez stupide. Tout sélectionner à partir d'une requête et de le jeter dans une table temporelle est affreux lorsque je pouvais simplement utiliser la requête elle-même. J'ai corrigé ça :)



0
votes

résolu.

Dans le premier bloc de code, lorsque je supprime et recréez la requête, la chaîne MySQL contient une instruction SQL valide. L'accès est donc capable d'assigner que SQL au QueryDef lorsque je le recréve complètement avec SET. Spécifiquement, p> xxx pré>

vient avant em> p> xxx pré>

dans le second jeu de code, la chaîne mysql contient uniquement un espace lorsque la commande SET est utilisée, comme "" N'EST PAS une instruction SQL valide, la commande SET ne sera même pas exécutée, et le QueryDef QD ne sera jamais créé. P>

Spécifiquement, L'erreur dans le deuxième code se produit car p>

Set QD = db.CreateQueryDef(("qryX"), mySql)   'QD never gets created because mySql is not valid SQL


1 commentaires

Comme vous souhaitez créer un querydef vide dans votre deuxième code, puis le modifier, vous pouvez le faire en recommandant le paramètre SQL sur la création .Createequerydef ("qryrex") .



0
votes

échantillon de code réussi. xxx


0 commentaires