Le grenier Access

Aller au contenu | Aller au menu | Aller à la recherche

Requêtes graphiques

Fil des billets - Fil des commentaires

mercredi 11 mars 2009

Calcul d'arrondis

Comment arrondir des calculs dans une requête (dans un formulaire ou un état aussi, d'ailleurs !) ?

Depuis Access 2000

Depuis Access 2000, une fonction nommée Round() est désormais intégrée à Access. Elle s'écrit :
Round(expression_à_arrondir; nombre_de_décimales)
.

Pour utiliser cette fonction :

Dans une requête,si vous souhaitez par exemple calculer un arrondi sur le TTC, définissez le champ calculé suivant : TTC: Round(HT * 1.196; 2)
Dans un formulaire ou un état, créez une zone de texte et tapez : =Round(HT * 1.196; 2)
Dans du code VB, tapez : x = Round(HT * 1.196, 2)

Avant Access 2000

Avant Access 2000, il n'existait pas de fonction dédiée au calcul des arrondis. En voici une qui peut faire l'affaire :

' ---
' ARRONDI D'UN NOMBRE
' ---
' Entrée : dbNombre  <- Le nombre à arrondir
'          intDigits <- Le nombre de chiffres après la virgule
'
Function Arrondi(dbNombre As Double, intDigits) As Double
  Dim lngPow As Long, dbTemp as double

  lngPow = 10 ^ intDigits
  dbTemp = dbNombre * lngPow + 0.5
  Arrondi = Int(dbTemp) / lngPow
End Function
  1. Recopiez la fonction dans un module standard de votre base de données Access 97.
  2. Utilisez-la de la même manière que dans les exemples ci-dessus, en remplaçant simplement le mot Round par le mot Arrondi.

mardi 10 mars 2009

Cumul dans Access

Comment calculer un cumul ligne à ligne dans Access ?

Lire la suite...

lundi 9 mars 2009

Hasard dans une requête

Comment tirer des nombres aléatoires dans une requête ? La fonction Rnd() semble ne pas fonctionner : elle produit toujours le même nombre.

Solution

En fait, la fonction Rnd() sort bien un nombre aléatoire différent à chaque appel. La nuance est que, dans une requête, cette fonction n'est appelée qu'une seule fois, pour des raisons de performance.

Une astuce consiste à appeler une fonction en lui passant une valeur qui change à chaque fois, par exemple un champ de la requête. Voici par exemple une nouvelle fonction ForceAlea(), à taper dans un module classique :

' ---
' FONCTION ALEA POUR REQUETE
' ---
' Entrée :    intInf <- Borne inférieure
'             intSup <- Borne supérieure
'                  v <- Une valeur quelconque, ou un champ de requête
' Sortie : ForceAlea -> Nombre entier entre intInf et infSup compris
'
Function ForceAlea( _
  ByVal intInf As Integer, _
  ByVal intSup As Integer, _
  ByVal v As Variant) As Integer

  Randomize
  ForceAlea = Int(Rnd * (intSup - intInf + 1)) + intInf
End Function

Exemple

Voici un exemple d'utilisation de cette fonction dans une requête (la requête est basée sur une table tblEssai, contenant le champ Quantité) : 

Deux appels successifs de la requête produisent des résultats différents :

   

vendredi 6 mars 2009

Améliorer une requête paramétrée

Dans une requête, j'ai défini des paramètres du style : Entre [Montant minimum] et [Montant maximum]. Mais cela produit 2 boîtes de dialogue, qui ne sont pas personnalisables. Que faire ?

Solution

La solution consiste à passer par un formulaire, et à remplacer les critères paramétrés par des champs de ce formulaire. Il y a au moins 2 avantages :

  • Tous les paramètres à saisir se retrouvent sur une seule boîte (le formulaire), ce qui est plus ergonomique.
  • Un champ de formulaire peut être plus sophistiqué qu'une simple boîte de saisie : on peut imaginer des cases à cocher, des listes déroulantes, etc.
Voici comment procéder :
  1. Créez un formulaire, en mode Création par exemple.
  2. Placez 2 zones de texte sur ce formulaire.
  3. Nommez les zones respectivement txtMontantMin et txtMontantMax.
  4. Enregistrez le formulaire (nommez-le par exemple frm Paramètres).
  5. De retour à la requête, remplacez le critère par :
    Entre Forms![frm Paramètres]!txtMontantMin Et Forms![frm Paramètres]!txtMontantMax
  6. Pour finaliser tout ça, ajoutez sur le formulaire un bouton de commande.
    En première étape de l'Assistant Bouton de commande, choisissez la catégorie Divers et l'action Exécuter une requête, vous pourrez ensuite choisir la requête concernée.

Notes :

  • Access va traduire la mention Forms par [Formulaires]. Pas grave !
  • La requête ne marche que si le formulaire est ouvert en mode d'utilisation normale (et pas en mode Création).
  • Vous pouvez faire encore mieux en construisant un état à partir de la requête. Faites en sorte, dans ce cas, que votre bouton de commande ouvre l'état au lieu d'exécuter la requête. L'état s'ouvre, évalue la requête au démarrage, laquelle requête est filtrée via le formulaire. Magique non ?
  • Si le nombre de paramètres est important, et que vous souhaitez faire des tests plus approfondis ("si tel critère n'est pas rempli, alors..."), vous devriez plutôt jeter un oeil sur les instructions OpenForm et OpenReport.

jeudi 19 février 2009

Calculer un total de colonne

Dans une table, comment calculer le total d'une colonne (d'un champ) ?

Dans l'exemple ci-dessous, il s'agirait de totaliser la colonne nommée [La Durée], dans la table [tbl Durées]. Plusieurs méthodes sont envisageables, tout dépend du résultat souhaité et de l'endroit où l'utiliser.


Méthode 1 : requête de regroupement

  1. Créez une requête basée sur la table [tbl Durées].
  2. Dans la grille de requête, placez uniquement le champ [La Durée].
  3. Cliquez sur l'icône Opérations en haut de l'écran.
    Une ligne nommée également Opération doit apparaître dans la grille de requête.
  4. Dans la liste déroulante Opérations, sous le champ [La Durée], sélectionnez Somme.


  5. Exécutez la requête : le résultat apparaît (un peu synthétique : il n'y a que le chiffre voulu !).

Méthode 2 : état

  1. Créez une requête basée sur la table [tbl Durées].

  2. Dans le pied d'état, ajoutez le calcul : =somme([La Durée])
    (la procédure est détaillée dans la fiche Etats de regroupement.

Méthode 3 : fonction de domaine

  1. Dans un formulaire ou un état ouvert en mode Création, ajoutez une zone de texte .
  2. A l'intérieur de cette zone (ou dans sa propriété Source Contrôle, tapez le calcul suivant :
=DSum("[La Durée]"; "tbl Durées"; "")

Il est possible d'aménager toutes ces méthodes pour effectuer le calcul seulement sur une partie des enregistrements. Je vous laisse tester !

lundi 29 septembre 2008

Extraire seulement les premières lignes d'une requête

Est-il possible à l'aide d'une requête de ne récupérer que 30 (ou n'importe quel nombre) enregistrements d'une table ?

Le principe

Une liste déroulante appelée "Premières valeurs" est disponible en mode Création de requête, elle  permet d'extraire seulement x enregistrements (ou x% de tous les enregistrements). Vous pouvez choisir l'une des valeurs proposées, ou taper une valeur manuellement.

Sur Access 2007

  1. Ouvrez votre requête en mode Création.
  2. Sous l'onglet Créer du ruban, la liste est précédée du mot "Renvoyer".

  • Combinée à un tri croissant ou décroissant, cette option permet de sélectionner les x premiers ou derniers enregistrements.
  • Pour sélectionner x lignes au hasard, il faut en plus trier la requête sur un critère aléatoire.

Sur Access 2003 et inférieur

  1. Ouvrez votre requête en mode Création.
  2. La liste "Premières valeurs" se trouve à droite de l'icône "Sigma".

En SQL

En SQL, vous obtenez la même chose grâce à la directive TOP.
Pour afficher les 7 premiers acteurs américains (sans ordre précis), par exemple, vous écririez :
SELECT TOP 7
FROM [tbl Acteurs]
WHERE [Code Pays] = 'US';

vendredi 2 novembre 2007

Autoriser des critères vides dans une requête paramétrée

J'ai défini des critères paramétrés dans une requête. Quand je ne renseigne pas les paramètres, la requête n'affiche rien ; je souhaiterais plutôt qu'elle affiche tous les enregistrements. Comment faire ?

Un petit exemple ?

Le formulaire ci-dessous permet de renseigner une année (liste déroulante cmbAnnee) et un pays (liste déroulante cmbPays). Une fois que les zones sont renseignées, le bouton Afficher les films ouvre une requête qui donne les films correspondant aux critères (ce serait mieux d'afficher un formulaire, mais c'est une autre histoire :-)).

formulaire

La requête elle-même contient des critères qui font appel aux champs du formulaire (je rappelle que la requête ne peut fonctionner que si le formulaire est ouvert).

requête

Le problème : si on ne remplit pas l'année par exemple, la requête n'affiche aucun résultat. On s'attendrait plutôt à ce qu'elle renvoie tous les films du pays sélectionné, toutes années confondues (sous-entendu : ne pas choisir d'année équivaut à ne pas filtrer sur ce critère).

Ce phénomène est normal : Access extrait tous les films dont l'année vaut Null, en d'autres termes dont l'année est vide (soit aucun film, ici !).

La solution

Si le critère Année est vide (si elle vaut Null), l'idée est de le remplacer dynamiquement par l'année du film (le champ Année de la table). Le critère :

Forms![frm Choix Films]![cmbAnnee]

...devient :

Nz(Forms![frm Choix Films]![cmbAnnee]; [Année])

A partir de maintenant, si la liste déroulante cmbAnnee est vide, le critère est remplacé par l'année du film.

Rappel sur Nz
La fonction Nz() transforme une valeur Null en une valeur de remplacement (donné par le second paramètre de la fonction). Vous trouverez d'autres exemples d'utilisation de Nz() sur ce site (cliquez sur le tag nz pour retrouver les articles en question).

Un peu de SQL

Tout ça est sans doute plus facile à expliquer si vous jetez un oeil au code SQL de la requête :

SELECT *
FROM [tbl Films]
WHERE [Année] = Nz(Forms![frm Choix Films]![cmbAnnee], [Année])

Concrètement, si la liste déroulante cmbAnnee est renseignée, le filtre est appliqué en fonction du formulaire, soit :

WHERE [Année] = Forms![frm Choix Films]![cmbAnnee]

Si au contraire la liste est vide, le filtre devient :

WHERE [Année] = [Année]

Vous voyez que, dans ce cas, la condition est toujours vraie, et donc l'enregistrement est toujours affiché. Tout est là !

Si ce n'est toujours pas clair, visionnez le screencast associé à cet article :-)

mardi 30 octobre 2007

Extraire les enregistrements pairs ou impairs

Dans une table, j'ai un champ numérique qui prend des valeurs quelconques. Je souhaiterais extraire seulement les valeurs paires ou impaires. Comment faire ?

Reprenons notre base Vidéoclub. Dans la table des films, on dispose du titre du film et de l'année de sortie (1999, 2001, 2002, 2006...). On va construire une requête pour extraire les films des années paires ou impaires, au choix.

  1. Créez une nouvelle requête, basée sur la table des films.
  2. Placez les champs qui vous intéressent sur la grille de requête, dont le champ Année, pour l'exemple.
  3. Ajoutez le champ calculé suivant, sur la grille :
Pair/Impair:[Année] Mod 2
La nouvelle colonne Pair/Impair calcule le modulo 2 de chaque année. En d'autres termes, elle affiche le reste de la division de l'année par 2. Si l'année est 2007, le reste de la division par 2 est 1 ; si l'année est 2008, le reste est 0. On obtient donc une suite de 0 pour les années paires, et de 1 pour les années impaires.

Il ne reste plus qu'à ajouter un critère sous le champ calculé. Tapez 0 pour obtenir les années paires, et 1 pour les années impaires. Si la colonne Pair/Impair n'est pas utile à l'affichage, vous pouvez "décocher" sa case Afficher.

samedi 20 octobre 2007

Requête paramétrée et *

Dans une requête paramétrée, comment faire en sorte de déclencher une recherche du type *[Paramètre]* ?

Pour un paramètre classique, vous tapez par exemple :
=[Ville à rechercher]
... mais il faut que l'utilisateur tape le nom exact de la ville pour que des enregistrements soient trouvés.

Solution 1

Si vous voulez permettre la recherche d'une ville sur quelques caractères seulement, tapez ceci comme critère :
Comme [Ville à rechercher] & "*"
Dans ce cas, si l'utilisateur tape MA, la recherche se fait sur MA* (par exemple : Marseille, Maroilles...).

Solution 2

Si vous voulez étendre la recherche, tapez :
Comme "*" & [Ville à rechercher] & "*"
Cette fois, si l'utilisateur tape MA, la recherche se fait sur les villes contenant MA, n'importe où dans le mot (par exemple : Marseille, Saint Amand).

mardi 16 octobre 2007

Remplacer un champ par un autre à l'affichage

Dans une table Personnes, j'ai 2 champs : Téléphone fixe et Téléphone mobile. Dans un état imprimé par exemple, je voudrais que le téléphone fixe soit affiché systématiquement, sauf s'il n'est pas renseigné. Dans ce cas, il doit être remplacé par le téléphone mobile. Comment faire ?

La table de départ

Votre table pourrait avoir la forme suivante.
Pour la 3ème personne, il faudrait que le téléphone mobile s'affiche, en remplacement du téléphone fixe.

La requête

Vous pourriez intervenir à différents endroits d'Access (dont l'état qui est l'objectif). Mais il est plus efficace de travailler au niveau de la requête : de cette manière, plusieurs états pourront réutiliser la formule que vous allez mettre en place.

  1. Créez une requête en mode Création, basée sur votre table des personnes.
  2. Placez les champs qui vous intéressent sur la grille de requête.
  3. Ajoutez le champ calculé suivant :
Téléphone: Nz([Téléphone fixe]; [Téléphone mobile])

La fonction Nz() convertit une valeur vide (Null) en une seconde valeur. En d'autres termes, si [Téléphone fixe] est vide, on le remplace par [Téléphone mobile].

On aurait également pu faire appel à une condition Si, mais c'est juste un peu plus lourd :

Téléphone:Iif(IsNull([Téléphone fixe]); [Téléphone mobile]; [Téléphone fixe])

Et voici la requête finale (il ne reste plus qu'à construire un état à partir d'elle, en utilisant le champ calculé Téléphone plutôt que les autres champs) :

- page 1 de 2