[Ac-2002 et DAO] Voici une source CBO pour voir TOUTES les requêtes et instructions SQL IHM (sauf les SQL VBA)
(à tester sur les autres versions Access svp)
Préfixes des requêtes listées dans le cbo:- ~sq_c =Requêtes des contrôles (sous forme ~sq_cNOMDUFORM_ETAT~sq_cNOMDUCONTROLE)
- ~sq_d =Sous-formulaires champs pères champ fils
- ~sq_f =Requêtes sources des formulaires
- ~sq_r =Requêtes sources des états
- <sans> =Querydefs Ordinaires
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| Function ListeQuery(oCBO As Control, num As Long, lNumLigne As Long, lNumCol As Long, iDAppel As Integer)
On Error GoTo Faute
Dim db as DataBase, oQdf As QueryDef 'correction
Static sCol() As String, i As Integer
Set db = CurrentDb
Select Case iDAppel
Case acLBInitialize
i = 0
ReDim sCol(db.QueryDefs.Count)
For Each oQdf In db.QueryDefs
sCol(i) = oQdf.Name
i = i + 1
Next oQdf
ListeQuery = True '--------------------fin-Initialisation--------------------------------
Case acLBOpen
ListeQuery = timer
Case acLBGetRowCount 'nbr de lignes
ListeQuery = i
Case acLBGetColumnCount
ListeQuery = 1 'nbr de colonnes
Case acLBGetColumnWidth
ListeQuery = -1 'largeur colon
Case acLBGetValue
ListeQuery = sCol(lNumLigne) 'Select Case lNumCol Case 0 à n-1 si plusieurs colonnes.
Case LB_END
ReDim sCol(0)
End Select
Set oQdf = Nothing
Exit Function
Faute:
Resume sortieLst
sortieLst:
On Error Resume Next
Set oQdf = Nothing
Set db = Nothing
ListeQuery = False
Exit Function
End Function |
Élémentaire mon cher Einstein
Pour faire une recherche de mot(s) dans toutes ces requêtes : utilisez un contrôle "Mot à rechercher" pour alimenter le filtre "sMotaRechercher" et modifiez la partie initialisation de la procédure précédente.
Ainsi votre CBO n'affichera plus que les requêtes ordinaires, contrôles, formulaires et états contenant une expression SQL contenant elle même le mot recherché.
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Dim sMotaRechercher as string
...
sMotaRechercher =nz(Me...
...
i = 0
For Each oQdf In db.QueryDefs
if instr(1,oQdf.sQl,sMotaRechercher) then
ReDim Preserve sCol(i)
sCol(i) = oQdf.Name
i = i + 1
endif
Next oQdf |
Pour visualiser chaque expression SQL: créez un contrôle texte indépendant [StringSql], grand et vide et sur événement après mise à jour du CBO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Private Sub cboQuery_AfterUpdate()
On Error GoTo Err_SQL
Dim db as DAO.database, oSQL As DAO.QueryDef, sNomSQL As String
sNomSQL = Nz(Me![cboQuery])
If Len(sNomSQL) > 3 Then
Set db = CurrentDb
Set oSQL = db.QueryDefs(sNomSQL)
Me![StringSql] = oSQL.sQl
End If
Set db = Nothing
Set oSQL = Nothing
Exit Sub
Err_SQL:
MsgBox err.Description, , " Err n°" & CStr(err)
Exit Sub
End Sub |
et pour mettre à jour le SQl utilisez un cmdControl (à vos risques et périls)
oSQL.sQl = Me.[StringSql]
MAIS SEULEMENT LES REQUÊTES ENREGISTREES SERONT MODIFIEES (les requêtes contrôles, formulaires, états sont en lecture seule et il ne faut surtout pas essayer de les modifier de cette façon. Editez le Form/Etat/Contrôle pour en modifier la source SQL. )
Après, à vous de peaufiner le formulaire
Exemple :visualiser l'effet du filtre (via lune étiquette : etNbrQuery).:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Case acLBInitialize
i = 0
If sMotaRechercher = "" Then
ReDim sCol(db.QueryDefs.Count)
For Each oQdf In db.QueryDefs
sCol(i) = oQdf.Name
i = i + 1
Next oQdf
Else
For Each oQdf In ldb.QueryDefs
If InStr(1, oQdf.sQl, sMotaRechercher) Then
ReDim Preserve sCol(i)
sCol(i) = oQdf.Name
i = i + 1
End If
Next oQdf
End If
Me.etNbrQuery.Caption = i
ListeQuery = True |
Ou encore :permettre une recherche multicritères, gérer un espace final dans la saisie du filtre (ici systématiquement effacé).
Voila un des onglets de mon formulaire d'administration
Alain.
Partager