OVH Cloud OVH Cloud

Requête SQL VBA -> MS ACCESS

2 réponses
Avatar
KIKSAN
Bonjour =E0 tous,

J'ai r=E9alis=E9 une UserForm qui permet d'attaquer une base=20
de donn=E9es Access (avec ADO) pour rapatrier des noms de=20
villes dans une listBox.

Donn=E9es :

* Base Access : C:\BASE.mdb contient une seule=20
table "tbl_Ville" avec un seul champ "Ville".=20
J'ai saisi 4 villes : TOULOUSE, TORCY, TOUCY, TOUFFLERS

* La UserForm comprend un TextBox : txt_Cherche=20
et une ListBox : lst_Trouve

Le but est de saisir dans le TextBox une partie d'un nom=20
de ville et de r=E9cup=E9rer dans la liste le nom des villes=20
filtr=E9es.
Ma requ=EAte SQL n'est pas param=E9tr=E9e pour pouvoir filtrer=20
les donn=E9es dans Access.
Exemple de r=E9sultat souhait=E9 :=20
* si je tape *OU* -> TOULOUSE + TOUCY
* si je tape *LOU* -> TOULOUSE=20

Voici le code utilis=E9 pour attaquer la base et r=E9cup=E9rer=20
la liste compl=E8te des noms de villes.

Private Sub txt_Cherche_AfterUpdate()

Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSql As String

'Ouvrir la base de donn=E9es Access
Set cn =3D New ADODB.Connection
'Ouvre la connexion
With cn
.Provider =3D "Microsoft.Jet.OLEDB.4.0"
.Open "C:\BASE.mdb"
End With
=20
strSql =3D "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER=20
BY tbl_Ville.Ville;"
=20
' Ouvre un jeu d'enregistrements.
Set rst =3D New ADODB.Recordset
=20
With rst
.Open Source:=3DstrSql, _
ActiveConnection:=3Dcn, _
CursorType:=3DadOpenForwardOnly, _
LockType:=3DadLockReadOnly
End With

Dim I As Integer
I =3D 0

lst_Trouve.ColumnCount =3D 1
lst_Trouve.Clear

Do Until rst.EOF
lst_Trouve.AddItem rst.Fields(0).Value
I =3D I + 1
rst.MoveNext
Loop

If lst_Trouve.ListCount <> 0 Then lst_Trouve.ListIndex=20
=3D 0
lst_Trouve.SetFocus
=20
'Fermer le recordset et la connexion
rst.Close
Set rst =3D Nothing
=20
cn.Close
Set cn =3D Nothing

End Sub

Quelqu'un sait-il comment am=E9liorer ma requ=EAte pour que =E7a=20
fonctionne correctement (op=E9rateur Like ?) avec la =20
syntaxe exacte :

strSql =3D "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER BY=20
tbl_Ville.Ville;"

Merci par avance

KIKSAN

2 réponses

Avatar
Denis Michon
Bonjour KIKSAN,

Pour écrire ton critère de la condition Where en utilisant ce qui est saisi dans le textbox :

Dim Critere As String

Critere = "'%" & Me.textbox1.text & "%'"

Tu dois remplacer Me par le nom de ton formulaire si ta procédure ADO est inscrite dans un module autre que le module du
formulaire.

Ta requête pourrait ressembler à ceci :

strSql = "SELECT tbl_Ville.Ville " & vbCrLf & _
" FROM tbl_Ville " & vbCrLf & _
"ORDER BY tbl_Ville.Ville " & vbCrLf & _
" Where Ville like " & Critere


Bon travail,


Salutations!




"KIKSAN" a écrit dans le message de news:1d7401c388da$90d48240$
Bonjour à tous,

J'ai réalisé une UserForm qui permet d'attaquer une base
de données Access (avec ADO) pour rapatrier des noms de
villes dans une listBox.

Données :

* Base Access : C:BASE.mdb contient une seule
table "tbl_Ville" avec un seul champ "Ville".
J'ai saisi 4 villes : TOULOUSE, TORCY, TOUCY, TOUFFLERS

* La UserForm comprend un TextBox : txt_Cherche
et une ListBox : lst_Trouve

Le but est de saisir dans le TextBox une partie d'un nom
de ville et de récupérer dans la liste le nom des villes
filtrées.
Ma requête SQL n'est pas paramétrée pour pouvoir filtrer
les données dans Access.
Exemple de résultat souhaité :
* si je tape *OU* -> TOULOUSE + TOUCY
* si je tape *LOU* -> TOULOUSE

Voici le code utilisé pour attaquer la base et récupérer
la liste complète des noms de villes.

Private Sub txt_Cherche_AfterUpdate()

Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSql As String

'Ouvrir la base de données Access
Set cn = New ADODB.Connection
'Ouvre la connexion
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Open "C:BASE.mdb"
End With

strSql = "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER
BY tbl_Ville.Ville;"

' Ouvre un jeu d'enregistrements.
Set rst = New ADODB.Recordset

With rst
.Open Source:=strSql, _
ActiveConnection:=cn, _
CursorType:­OpenForwardOnly, _
LockType:­LockReadOnly
End With

Dim I As Integer
I = 0

lst_Trouve.ColumnCount = 1
lst_Trouve.Clear

Do Until rst.EOF
lst_Trouve.AddItem rst.Fields(0).Value
I = I + 1
rst.MoveNext
Loop

If lst_Trouve.ListCount <> 0 Then lst_Trouve.ListIndex
= 0
lst_Trouve.SetFocus

'Fermer le recordset et la connexion
rst.Close
Set rst = Nothing

cn.Close
Set cn = Nothing

End Sub

Quelqu'un sait-il comment améliorer ma requête pour que ça
fonctionne correctement (opérateur Like ?) avec la
syntaxe exacte :

strSql = "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER BY
tbl_Ville.Ville;"

Merci par avance

KIKSAN
Avatar
Denis Michon
Petite correction

strSql = "SELECT tbl_Ville.Ville " & vbCrLf & _
" FROM tbl_Ville " & vbCrLf & _
"ORDER BY tbl_Ville.Ville " & vbCrLf & _
" Where Ville like " & Critere

J'aurais dû inversé les 2 derniers arguments comme ceci :

strSql = "SELECT tbl_Ville.Ville " & vbCrLf & _
" FROM tbl_Ville " & vbCrLf & _
" Where Ville like " & Critere & vbCrLf & _
"ORDER BY tbl_Ville.Ville "


Salutation!



"Denis Michon" a écrit dans le message de news:zKVeb.94410$
Bonjour KIKSAN,

Pour écrire ton critère de la condition Where en utilisant ce qui est saisi dans le textbox :

Dim Critere As String

Critere = "'%" & Me.textbox1.text & "%'"

Tu dois remplacer Me par le nom de ton formulaire si ta procédure ADO est inscrite dans un module autre que le module du
formulaire.

Ta requête pourrait ressembler à ceci :

strSql = "SELECT tbl_Ville.Ville " & vbCrLf & _
" FROM tbl_Ville " & vbCrLf & _
"ORDER BY tbl_Ville.Ville " & vbCrLf & _
" Where Ville like " & Critere


Bon travail,


Salutations!




"KIKSAN" a écrit dans le message de news:1d7401c388da$90d48240$
Bonjour à tous,

J'ai réalisé une UserForm qui permet d'attaquer une base
de données Access (avec ADO) pour rapatrier des noms de
villes dans une listBox.

Données :

* Base Access : C:BASE.mdb contient une seule
table "tbl_Ville" avec un seul champ "Ville".
J'ai saisi 4 villes : TOULOUSE, TORCY, TOUCY, TOUFFLERS

* La UserForm comprend un TextBox : txt_Cherche
et une ListBox : lst_Trouve

Le but est de saisir dans le TextBox une partie d'un nom
de ville et de récupérer dans la liste le nom des villes
filtrées.
Ma requête SQL n'est pas paramétrée pour pouvoir filtrer
les données dans Access.
Exemple de résultat souhaité :
* si je tape *OU* -> TOULOUSE + TOUCY
* si je tape *LOU* -> TOULOUSE

Voici le code utilisé pour attaquer la base et récupérer
la liste complète des noms de villes.

Private Sub txt_Cherche_AfterUpdate()

Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSql As String

'Ouvrir la base de données Access
Set cn = New ADODB.Connection
'Ouvre la connexion
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Open "C:BASE.mdb"
End With

strSql = "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER
BY tbl_Ville.Ville;"

' Ouvre un jeu d'enregistrements.
Set rst = New ADODB.Recordset

With rst
.Open Source:=strSql, _
ActiveConnection:=cn, _
CursorType:­OpenForwardOnly, _
LockType:­LockReadOnly
End With

Dim I As Integer
I = 0

lst_Trouve.ColumnCount = 1
lst_Trouve.Clear

Do Until rst.EOF
lst_Trouve.AddItem rst.Fields(0).Value
I = I + 1
rst.MoveNext
Loop

If lst_Trouve.ListCount <> 0 Then lst_Trouve.ListIndex
= 0
lst_Trouve.SetFocus

'Fermer le recordset et la connexion
rst.Close
Set rst = Nothing

cn.Close
Set cn = Nothing

End Sub

Quelqu'un sait-il comment améliorer ma requête pour que ça
fonctionne correctement (opérateur Like ?) avec la
syntaxe exacte :

strSql = "SELECT tbl_Ville.Ville FROM tbl_Ville ORDER BY
tbl_Ville.Ville;"

Merci par avance

KIKSAN