FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Existe-t-il une autre option que FULL OUTER en SQL ?
- Comment éviter d'avoir une division par zéro dans une requête SQL ?
- Comment passer des paramètres dans des requêtes ?
- Comment trouver la date (seule) dans un champ qui contient la date et l'heure ?
- Comment connaître le temps de traitement d'une requête ?
- Comment pour chaque requête obtenir la liste des tables qu'elle utilise ?
- Comment faire pour afficher 'Oui' ou 'Non' plutôt que '0' ou '-1' dans le résultat d'une requête ?
- Quelles sont les différences de syntaxe entre SQL server et Access pour les requêtes avec jointures ?
- Comment enlever des occurrences dans un SELECT ?
- Comment incrémenter un champ dans une requête SQL ?
Un Full Outer est l'équivalent de :
Select
...
From T1
Left
Outer Join
T2
On
...
Union
Select
...
From T2
Left
Outer Join
T1
On
...
Lorsque nous avons une expression comme celle-ci :
(
[A] /
[B] )
où [B] est susceptible de prendre pour valeur 0, alors nous pouvons utiliser ceci :
iif
(
[B]=
0
, 0
, [A]/
[B] )
Pour passer des paramètres à une requête, il y a bien sûr les paramètres de la requête, voire des variables définies en VB, mais il existe aussi une solution simple :
Une table ne contenant qu'un seul enregistrement.
Cet enregistrement peut bien sûr contenir beaucoup de champs tels que TxTVA1, TxTVA2, Date_fin_periode, etc.
On insère la table dans la requête nécessitant les paramètres et on se sert des champs comme critères ou constantes.
Attention :
- garantir un seul enregistrement (il y a un post là-dessus sur ce site) sinon gare aux petits lapins comme on dit chez nous (multiplication des enregistrements) ;
- ne marche pas si on a des jointures externes dans la requête (c'est-à-dire des flèches sur les liens), mais il suffit souvent de décaler le problème en faisant une deuxième requête.
On a avec cette solution la souplesse d'utilisation des tables... et des possibilités quasi infinies puisqu'on peut facilement modifier les paramètres via des requêtes appropriées.
Nous avons dans une table, un champ de type Date qui contient la date plus l'heure, ex. : 2004-05-12 19:45:20.
Voici la requête permettant de connaître toutes les lignes d'une table dont le champ date correspond à la date du jour :
Select
*
From LATABLE Where int
(
LADATE ) =
Date
(
)
La fonction int() permet de ne sélectionner que la date et non la date suivie de l'heure.
Ce code va permettre de récupérer le temps d'exécution de la requête en prenant le moment avant exécution puis en réalisant la différence à la fin de l'exécution
Sub
TpsRequete
(
)
Dim
sngDebut As
Single
sngDebut =
VBA.DateTime.Timer
' Exécution de la requête
DoCmd.RunSQL
CurrentDb.QueryDefs
(
"MaRequete"
).SQL
MsgBox
"Temps d'exécutiuon : "
&
Str
(
VBA.DateTime.Timer
-
sngDebut) &
" secondes"
End
Sub
ATTENTION : l'utilisation des tables système (MSYSxxxxxxx) n'est pas recommandée. L'utilisation de telles procédures se fait à vos risques et péril.
SELECT
A.name
AS
Requete, B.name1
AS
Lst_Table
FROM MSysObjects AS
A INNER JOIN
MSysQueries AS
B ON
A.id
=
B.objectid
WHERE A.type
=
5
and
B.attribute
=
5
;
MSysObjects est la table qui contient tous les objets qui existent dans la base.
Dans cette table, type=5 permet d'identifier les requêtes.
MSysQueries est la table qui contient tout le détail des requêtes qui existent dans la base.
Dans cette table, attribute=5 permet de définir (par rapport à l'id) ce qui est contenu dans le FROM (table ou requête).
D'autres valeurs d'attribut vous permettent de savoir si vous êtes dans le SELECT le WHERE ou l'ORDER BY.
Pour visualiser ces tables, il faut aller dans le menu Outils->Options... l'onglet affichage et cocher Objets système.
Première solution en agissant sur la table :
Onglet Données
Source contrôle : le champ
Origine source : Liste valeurs
Contenu : -1;oui;0;non
Onglet Format
Nbre colonnes : 2
Largeurs Colonnes : 0
Seconde solution en agissant sur la requête :
Il suffit dans le Select de la requête de mettre une condition sur l'affichage de la valeur du champ.
iif
(
TonChamp;'Oui';'Non')
Les requêtes contenant des jointures peuvent être valides sous SQL SERVER et pas sous Access.
Pour résoudre ce problème, il suffit de placer le nom des tables entre crochets. Sinon vérifiez la compatibilité des mots-clés SQL.
Voici une petite fonction à intégrer dans votre SELECT pour enlever les occurrences.
Function
myRTrim2
(
vChaine As
Variant
, strSearch As
String
) As
Variant
If
Not
IsNull
(
vChaine) Then
Do
While
vChaine Like "*"
&
strSearch
vChaine =
Left
(
vChaine, Len
(
vChaine) -
Len
(
strSearch))
Loop
myRTrim2 =
vChaine
End
If
End
Function
Ce code permet d'incrémenter un champ d'une requête SQL :
SELECT
TonChamp,
(
SELECT
COUNT
(
TonChamp)
FROM
tbl_Exemple AS
LaTable_Alias2
WHERE
TonChamp <
tbl_Exemple.TonChamp)+
1
AS
Classement
FROM
tbl_Exemple
ORDER
BY
TonChamp;
Ceci permet de faire un classement
ChampNum | Champ | ChampIncrementé |
---|---|---|
1 | Test1 | 1 |
5 | Test2 | 2 |
3 | Test3 | 3 |
2 | Test4 | 4 |
4 | Test5 | 5 |