OVH Cloud OVH Cloud

Création requête Création de table

5 réponses
Avatar
jorie80
Bonsoir,

Voilà, j'ai le code suivant qui me permet de lancer une requête
paramétrée création de table.
Cependant, je souhaiterai faire un tout petit peu plus compliqué et
sans succès depuis plusieurs jours.
Voilà, je souhaiterai conserver dans ma BDD "Requête1" comme une
requête dite "de sélection" et par code VB créer cette même "Requête1"
mais en requête dite "Création de table" pour pouvoir effectuer ma Sub
test(). En effet, le "qdf.Execute" ne s'applique qu'à une requête
action et non sélection.

Merci infiniement de votre aide car là, je ne sais plus quoi tenter!


Sub test()
Dim qdf As QueryDef
Dim DATE_T As Date
Dim cnn As New ADODB.Connection


DATE_T = InputBox("Date")

Set qdf = CurrentDb.QueryDefs("Requête1")
qdf.Parameters("Date ?") = DATE_T
qdf.Execute
Set qdf = Nothing
End Sub


Voici ma requête en SQL :

SELECT [Table1].[Prénom], [Table1].[Nom], [Table2].[Adresse],
[Table2].[Ville], [Table2].[Date] INTO vide
FROM Table1 INNER JOIN Table2 ON [Table1].[Nom]=[Table2].[Nom]
WHERE ((([Table2].[Date])=[Date ?]));

5 réponses

Avatar
Raymond [mvp]
Tu peux faire comme ceci:

On Error Resume Next
Dim Matable As String
Dim qdf As DAO.QueryDef
Dim strSql As String
Dim DATE_T As Date
Matable = "Table4" 'pour l'exemple
DoCmd.DeleteObject acQuery, "Requête_Tmp"
DoCmd.DeleteObject acTable, Matable
DATE_T = InputBox("Date")
Set qdf = CurrentDb.QueryDefs("Requête1")
strSql = qdf.SQL
Set qdf = Nothing
Set qdf = CurrentDb.CreateQueryDef("Requête_Tmp")
qdf.SQL = Replace(strSql, "FROM ", " INTO " & Matable & " FROM ")
qdf.Parameters("Date ?") = DATE_T
qdf.Execute
Set qdf = Nothing

cette fonction prend le sql de la requête requête1 et le transforme en sql
création de table dont le nom est donné par la variable matable. la requête1
n'est pas modifiée.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Bonsoir,

Voilà, j'ai le code suivant qui me permet de lancer une requête
paramétrée création de table.
Cependant, je souhaiterai faire un tout petit peu plus compliqué et
sans succès depuis plusieurs jours.
Voilà, je souhaiterai conserver dans ma BDD "Requête1" comme une
requête dite "de sélection" et par code VB créer cette même "Requête1"
mais en requête dite "Création de table" pour pouvoir effectuer ma Sub
test(). En effet, le "qdf.Execute" ne s'applique qu'à une requête
action et non sélection.

Merci infiniement de votre aide car là, je ne sais plus quoi tenter!


Avatar
jorie80
Okidoki et merci... Mais, il ne reconnaît pas le "Replace"...
Je ne comprends pas exactement; pourriez-vous m'indiquer comment procéder...

Merci d'avance,
Avatar
Raymond [mvp]
Ce qui veut dire que tu es en version 97 ? qui ne supporte pas cette
fonction.
si oui, tu inclus une fonction remplacer que tu trouveras sur la page
http://access.seneque.free.fr/remplacer_texte.htm
qdf.SQL = Remplacer(strSql, "FROM ", " INTO " & Matable & " FROM ")
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Okidoki et merci... Mais, il ne reconnaît pas le "Replace"...
Je ne comprends pas exactement; pourriez-vous m'indiquer comment
procéder...


Merci d'avance,


Avatar
jorie80
Merci à vous. En effet, je travaille sous Access 97.
Voici donc comment se constitue mon prog ci-dessous. Une erreur
persite sur la ligne ==> qdf.sql = Remplacer(strSql, "FROM ", " INTO "
& TableVide & "FROM ")

Erreur d'exécution '3141' : Dans l'instruction SELECT, un mot réservé
ou un argument est mal ortographié ou manquant, ou la ponctuation est
incorrecte

Merci de votre aide pour résoudre ce souci.



Option Compare Database
Option Explicit

Function Remplacer(Chaine, AncienTexte, NouveauTexte) As String
Dim StringTmp As String, Pointer As Integer
If IsNull(Chaine) Then
Remplacer = False
Else
StringTmp = Chaine
Pointer = InStr(1, StringTmp, AncienTexte)
Do While Pointer > 0
StringTmp = Left(StringTmp, Pointer - 1) & NouveauTexte &
_
Mid(StringTmp, Pointer + Len(AncienTexte))
Pointer = InStr(Pointer + Len(NouveauTexte), StringTmp,
AncienTexte)
Loop
Remplacer = StringTmp
End If
End Function



Sub essai()

Dim strSql As String
Dim DATE_T As Date
Dim qdf As DAO.QueryDef
Dim TableVide As String
Dim chaîne1 As String
Dim chaîne2 As String

TableVide = "Table_vidage"

DoCmd.DeleteObject acQuery, "Requête_Tmp"
DoCmd.DeleteObject acTable, TableVide

DATE_T = InputBox("date ?")

Set qdf = CurrentDb.QueryDefs("Requête1")
strSql = qdf.sql
Set qdf = Nothing
Set qdf = CurrentDb.CreateQueryDef("Requête_Tmp")
qdf.sql = Remplacer(strSql, "FROM ", " INTO " & TableVide & "FROM ")
qdf.Parameters("V_DATE_T") = DATE_T
qdf.Execute
Set qdf = Nothing

End Sub
Avatar
Raymond [mvp]
tu n'as pas respecté les espaces avant le 2e from

qdf.sql = Remplacer(strSql, "FROM ", " INTO " & TableVide & " FROM ")


l'erreur ne devrait pas être sur cette ligne mais sur l'execute
j'ai retesté la procédure avec mes champs, ça fonctionne. vérifies quand
même tous les mots utilisés
pour bien voir tu places un msgbox qdf.sql après la ligne ci-dessus.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"okto" a écrit dans le message de
news:
Merci à vous. En effet, je travaille sous Access 97.
Voici donc comment se constitue mon prog ci-dessous. Une erreur
persite sur la ligne ==> qdf.sql = Remplacer(strSql, "FROM ", " INTO "
& TableVide & "FROM ")

Erreur d'exécution '3141' : Dans l'instruction SELECT, un mot réservé
ou un argument est mal ortographié ou manquant, ou la ponctuation est
incorrecte

Merci de votre aide pour résoudre ce souci.



Option Compare Database
Option Explicit

Function Remplacer(Chaine, AncienTexte, NouveauTexte) As String
Dim StringTmp As String, Pointer As Integer
If IsNull(Chaine) Then
Remplacer = False
Else
StringTmp = Chaine
Pointer = InStr(1, StringTmp, AncienTexte)
Do While Pointer > 0
StringTmp = Left(StringTmp, Pointer - 1) & NouveauTexte &
_
Mid(StringTmp, Pointer + Len(AncienTexte))
Pointer = InStr(Pointer + Len(NouveauTexte), StringTmp,
AncienTexte)
Loop
Remplacer = StringTmp
End If
End Function



Sub essai()

Dim strSql As String
Dim DATE_T As Date
Dim qdf As DAO.QueryDef
Dim TableVide As String
Dim chaîne1 As String
Dim chaîne2 As String

TableVide = "Table_vidage"

DoCmd.DeleteObject acQuery, "Requête_Tmp"
DoCmd.DeleteObject acTable, TableVide

DATE_T = InputBox("date ?")

Set qdf = CurrentDb.QueryDefs("Requête1")
strSql = qdf.sql
Set qdf = Nothing
Set qdf = CurrentDb.CreateQueryDef("Requête_Tmp")
qdf.sql = Remplacer(strSql, "FROM ", " INTO " & TableVide & "FROM ")
qdf.Parameters("V_DATE_T") = DATE_T
qdf.Execute
Set qdf = Nothing

End Sub