Ouvrir via VB une requete Access en mode SQL

Résolu/Fermé
Signaler
-
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
-
Bonjour,

comme le suggere mon titre, il s'agit bien de SQL et de VB.

J'ai commencé a programmer un code VB pour qu'il copier une reqete en la renomant via une variable, voici le code :

Function Nouveau_tag()

Dim strMaVar As String

strMaVar = InputBox("Entrez le nom de votre nouveau tag !")

DoCmd.CopyObject "", "ASC_" + strMaVar, acQuery, "ASC_TAG"

End Function


Je voudrais a présent pouvoir ouvrir la nouvelle requete en mode SQL, selectionner un mot bien particulier (qui revient plus fois) dans l'instruction et le remplacer par un autre qui sera la variable strMaVar

Je ne suis pas trés doué en VB, etre parvenue a ce resultat la me laisse deja pantois, si quelqu'un veut bien m'aider, il sera considéré comme mon hero a vie :)

20 réponses

Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
Salut,

tu ne peux pas faire ça, une requête ouverte en mode sql ne peut pas être modifiée autrement qu'à l'écran.

Mais si tu maitrises DAO ou ADO via VB, il te sera facile d'accéder au contenu de la requête, pour le modifier.

En VBA, depuis ACCESS, ça peut prendre 2 lignes...
Tout d'abord merci pour ta réponse !

Alors, je ne maitrise pas les choses dont tu parles en revanche, j'ai pas du m'exprimer correctement, parcequ'il ne s'agit pas de modifier une requete SQL deja ouverte !

En fait,

J'ai une requete SQL qui s'appel ASC_TAG dont voici l'instruction SQL :

SELECT Alliance_Shared_Contact.Company, Alliance_Shared_Contact.[Last Name], Alliance_Shared_Contact.[First Name], Alliance_Shared_Contact.[Job Title], Alliance_Shared_Contact.[E-mail Address], Alliance_Shared_Contact.[Business Phone], Alliance_Shared_Contact.[Mobile Phone], Alliance_Shared_Contact.[Fax Number], Alliance_Shared_Contact.[Web page], "Tag" AS [Origine Contact]

FROM Alliance_Shared_Contact

WHERE (((Alliance_Shared_Contact.Categories) Like "*" & "Tag" & "*"));


Le but pour moi est de pouvoir copier cette requete et de la renomer en ASC_"variable" ; variable que j'obtient grace à la programmation VB que je vous ai montré !

Pour faire simple, cela a pour effet de m'ouvrir une boite de dialogue qui me demande en quoi comment je veux nommer la copie.

Maintenant que j'ai réussit ca, il faudrait qu'a la suite de la programmation VB, je rajoute un truc qui me permette de changer l'instruction SQL de la copie de ma requete pour changer le mot "tag" par la nouvelle variable !

Merci encore pour le temps que tu m'accordes !
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
La requête est stockée sous une forme particulière par access, impossible d'y accéder autrement qu'en mode interactif (à l'écran) ou qu'avec les propriétés de l'objet requête via ado/dao.
Hum ok. Merci bcp pour l'attention que tu m'accordes !

N'y a t'il pas un moyen d'arriver au resultat que je veux ? Tu disais que ca pouvait se faire en 2 lignes ... Par contre, je n'y connais pas grande chose en VB Access :)
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
dans ton VB, il faut créer un objet adodb, puis t'y connecter, ensuite, tu peux récupérer n'importe quel objet de la base (table, requête, champ...) et le modifier...
Comment fait on pour creer un objet ADODB ?
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
ben je suppose que ça doit être un truc genre SET myobjet as new.adodb... ou dans ce goût là...

https://forums.commentcamarche.net/forum/affich-227473-visual-basic-et-base-de-donnees-access
Ha merci Blux, je vais fouiller ca !

PS : tu sembles donner bcp de toi sur ce forum pour aider les autres, merci !
Héhé ca marche !

Pour info :

Option Compare Database

Public Function test_DAO_QUERYDEF()

Dim Bdd As DAO.Database
Dim Qdf As DAO.QueryDef
Dim StrSql As String
Dim StrSqlModif As String
Dim StrTag As String

StrTag = InputBox("Quel est le nom de votre nouveau tag?")

DoCmd.CopyObject "", "ASC_" + StrTag, acQuery, "ASC_TAG"

Set Bdd = Application.CurrentDb
Set Qdf = Bdd.QueryDefs("ASC_" + StrTag)

With Qdf
StrSql = .SQL
StrSqlModif = Replace(StrSql, "tag", StrTag)
.SQL = StrSqlModif


'....


.Close
End With

Set Qdf = Nothing

Bdd.Close
Set Bdd = Nothing

End Function



Merci donc

A présent j'aimerais pouvoir inclure ma nouvelle requete dans une requete union deja existante. Cela va exiger que je puisse editer ma requete union et que j'ajoute à la partie fixe qui existe deja, une partie variable qui dependra du nom de la nouvelle requete.

Quelqu'un a un idée du code ?
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
C'est guère plus dur :-)

Tu récupères le .sql de ta requête UNION pour le mettre dans une chaine que tu traffiques avec les opérateurs de manipulation de chaine et ensuite tu réenregistres ta requête.

Juste une question : tu es sous ACCESS ou sous VB ? car je ne vois pas de séquence de connexion à la base...
je suis sur Access :)

Et bien j'ai essayé de reprendre le .SQL pour le trafiquer mais ne connaissant pas bien les bases du code VB, ca n'a pas fonctionné..

J'ai eu le droit a un message du genre " INSERT / UPDATE ou DELETE requis "
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
Donc depuis le début je crois que tu accèdes à une base ACCESS via VB (comme ton titre le suggère), c'est pour ça que je t'ai proposé une connexion avec un objet type adodb !

C'est cette phrase-là qui me pose problème : une partie variable qui dependra du nom de la nouvelle requete. parce que sinon, le reste est à ta portée (vu ce que tu as déjà créé comme code).

Un exemple serait plus parlant...
Héhé navré Blux, j'ai eu egalement un doute sur ce dont nous parlions mais n'etant pas avancé dans l'art de la VB, je n'etait pas sur de moi ...

Alors en fait :

J'ai une requete appelé ASC_TAG. Ma VB la copie et la renome par une variable determinée par une inputbox. Voici l'instruction sql de tag. Par exemple, je pourrais renomé la copie en ASC_VARIABLE

SELECT Alliance_Shared_Contact.Company, Alliance_Shared_Contact.[Last Name], Alliance_Shared_Contact.[First Name], Alliance_Shared_Contact.[Job Title], Alliance_Shared_Contact.[E-mail Address], Alliance_Shared_Contact.[Business Phone], Alliance_Shared_Contact.[Mobile Phone], Alliance_Shared_Contact.[Fax Number], Alliance_Shared_Contact.[Web page], "<gras>tag
" AS [Origine Contact]
FROM Alliance_Shared_Contact
WHERE (((Alliance_Shared_Contact.Categories) Like "*" & "tag" & "*"));</gras>

(j'ai réussi a faire en sorte que le mot "tag" soit changé en "Variable" dans l'instruction.

D'un autre coté j'ai une requete Union qui melange plein de requete comme TAG.

L'objectif pour moi est de pouvoir inclure la copie renomée de la requete TAG dans mon union, ici suivant l'exemple, ASC_VARIABLE.

Est ce que j'arrive a etre claire ? :s
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
pas trop...

mais pour moi, il ne s'agit que d'une construction de chaine, à faire avec les opérateurs classiques...
Certes, mais je connais a peine le language VB.

Tout ce que j'ai réussi a faire jusque la, c'est en observant, en faisant de nombreux essais, et en galérant.

:(
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
donc je n'ai pas trop compris, essaye d'être un peu explicite dans l'exemple.
Bon on va essayer un petit schema :)

J'ai plusieurs requete dont l'instruction n'a pas tant d'importance et une union qui vient récuper les donnés de mes requetes pour les mettre ensemble

ASC_TAG______+_______ASC_MAIN________+____ASC_MKG

= UNION_ASC



A présent, grace a un module VB, je peux créer une nouvelle requete ASC_VARIABLE et j'aimerais egalement completer ma VB pour pouvoir le mettre dans l'UNION


ASC_TAG______+_______ASC_MAIN________+____ASC_MKG_________+ASC_VARIABLE

= UNION_ASC



Pour info , voici la requete UNION actuelle

SELECT

Company,
[Last Name],
[First Name],
[Job Title],
[E-mail Address],
[Business Phone],
[Mobile Phone],
[Fax Number],
[Web page],
[Origine Contact], "sharepoint" as ID

FROM [ASC_Tag]

UNION ALL SELECT

Company,
[Last Name],
[First Name],
[Job Title],
[E-mail Address],
[Business Phone],
[Mobile Phone],
[Fax Number],
[Web page],
[Origine Contact], "sharepoint"

FROM ASC_MAIN


UNION ALL SELECT

Company,
[Last Name],
[First Name],
[Job Title],
[E-mail Address],
[Business Phone],
[Mobile Phone],
[Fax Number],
[Web page],
[Origine Contact], "sharepoint"
FROM ASC_MKG


Il y doit bien avoir une manip qui sert a dire : Tu edites UNION_ASC et tu ajoutes le truc ci dessous a l'instruction

Company,
[Last Name],
[First Name],
[Job Title],
[E-mail Address],
[Business Phone],
[Mobile Phone],
[Fax Number],
[Web page],
[Origine Contact], "sharepoint"
FROM ASC_VARIABLE



*espoir*
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
ben tu prends ton .sql actuel que tu mets dans une chaine et tu concatènes avec ce que tu veux :

toto = .sql

toto = toto & "company, ..... FROM ASC " & variable & ";"

et ensuite tu réenregistres ton .sql comme tu l'a fais avec ton code du début.
Ha merci bcp Blux, on se comprend enfin :-)

Alors j'ai essayé le code suivant a la suite du reste

Set Bdd = Application.CurrentDb
Set Qdf = Bdd.QueryDefs("UNION_ASC")

With Qdf

StrSql = .SQL
StrSqlModif = .SQL & "Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID FROM [ASC_ + StrTag]"
.SQL = StrSqlModif

Close
End With

Set Qdf = Nothing

Il me dit message d'erreur : " caractere trouvé apres la fin de l'instruction SQL" :-(

Une idée de ce que ca peut etre ?

ps : ( on touche au buuuuut)

Bdd.Close
Set Bdd = Nothing

End Function
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
StrSqlModif = .SQL & "UNION Company..." ?

et aussi penser à récupérer la valeur de StrTag, genre : FROM [ASC_ " & StrTag & "]"
Arf, j'aai plus de message genre " instruction sql trouvé apres la fin " mais maintenant avec ce code la :

Set Bdd = Application.CurrentDb
Set Qdf = Bdd.QueryDefs("UNION_ASC")

With Qdf

StrSql = .SQL
StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID " & vbCrLf & _
StrSqlModif = StrSqlModif & "FROM [ASC_ + StrTag];"
.SQL = StrSqlModif

Close
End With

Set Qdf = Nothing

Bdd.Close
Set Bdd = Nothing

End Function



J'ai le droit à "Instruction SQL non valide : delete insert procedure select ou update attendu " :(
Il fallait juste supprimer le ;
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
Il fallait juste supprimer le ;
Non, si tu regardes le message jusqu'au bout, tu t'en rendras compte...
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
à quel moment ? parce que là, il n'y a aucune raison, ce message d'erreur doit être lors de l'exécution de la requête...
Set Bdd = Application.CurrentDb
Set Qdf = Bdd.QueryDefs("UNION_ASC")

With Qdf

StrSql = .SQL
StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], 'sharepoint' as ID " & vbCrLf & _
StrSqlModif = StrSqlModif & "FROM [ASC_ + StrTag];"
.SQL = StrSqlModif

Close
End With

Set Qdf = Nothing

Bdd.Close
Set Bdd = Nothing

End Function

Je confirme que le reste est bon je teste tout en pas a pas, je ne comprend pas, pourquoi, pourquoiiiiii ?
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
fais un msgbox strsqlmodif, et ça te donnera une piste...

en fait, je l'ai pas vu tout de suite, mais c'est le vbcrlf qui fout la zone, il ne doit pas y en avoir (une requête est une suite de caractères, sans format de mise en page), contente toi de mettre des espaces entre les mots-clés SQL (c'est-à-dire avant le FROM ou après le ID, comme c'est le cas)...
Ok on y presque, a présent il m'ajoute bien l'union, reste quelques erreur de mise en page !

La VB fonctionne normalement reste juste un petit probleme :) :) : )

StrSql = .SQL
StrSqlModif = .SQL & "UNION ALL SELECT Company,[Last Name],[First Name],[Job Title],[E-mail Address],[Business Phone],[Mobile Phone],[Fax Number],[Web page],[Origine Contact], ""sharepoint"" "
StrSqlModif = StrSqlModif & "FROM ASC_+ StrTag"
.SQL = StrSqlModif

Lors de l'ajout à l'union est ajoutée FROM ASC_StrTag a la place de ma variable (mettons que si dans l'inpubox, j'avais ecrit TOTO ; il faudrait qu'il y ai marqué FROM ASC_TOTO)
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
2ième ligne de mon message 20...

faut lire ;-)
Hahaha excuse moi !


Je te confirme donc a toi et a tout les eventuels lecteurs qui auront besoin de cette solution un jour que ca fonctionne !!!!!

Un grand merci a toi Blux, je n'ai jamais rencontré personne sur un forum qui s'est autant attaché a aider les autres :)

ENCORE merci !
Messages postés
23778
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
26 novembre 2021
3 148
C'est parce que tu ne fréquentes pas assez les forums...

Mets le problème en résolu.