ms access rq dyn

Upload: narcisse-tuina

Post on 29-Feb-2016

219 views

Category:

Documents


0 download

DESCRIPTION

Tuina doc

TRANSCRIPT

1. AvertissementCe tutoriel n'ayant pas pour but l'apprentissage du Visual Basic pour Application ni du langage SQL, mais la dmonstration que certaines impossibilits d'ACCESS peuvent tre contournes, j'ai choisi de ne pas agrmenter le code du traitement des erreurs et autres vrifications d'usages, ni la zone liste d'une liste dynamique. L'utilisation de la touche F1 est vivement conseille tous les stades de l'utilisation d'ACCESS. L'amlioration constante de l'aide en fait un partenaire de choix dans l'apprentissage permanent d'ACCESS. Personnellement je ne peux m'en passer, ne serait-ce que pour mmoire. 2. Pr requis - Les objets ACCESS ncessaires pour l'exercice.Pour raliser cet exercice ACCESS nous aurons besoin de crer une petite IHM simple compose d'un formulaire contenant une zone de liste et deux boutons de commandes.IHM : Interface Homme-Machine tout ce qui permet l'utilisateur d'exploiter des donnes. Les formulaires et tats sont les composants d'une IHM. 2.1. Formulaire et zone liste modifiablePour commencer nous allons dfinir les objets ncessaires pour la ralisation de l'exercice.Ouvrez un fichier de base de donnes Microsoft ACCESS vierge. Commencez par crer un formulaire que vous nommerez Analyse Croise. Dans ce formulaire ajoutez une zone de liste droulante nomme Zl_critere. Celle-ci contiendra le critre pour la requte d'analyse croise.Les proprits de Zl_critere sont les suivantes : PropritValeur

NomZl_critere

Origine sourceListe de valeurs

Contenu2001;2002

Nbre colonnes1

Sauvegardez le formulaire, passez-le en mode utilisation et slectionnez la valeur 2001 dans la zone liste. La valeur de cette zone liste constituera notre critre. Voici Zl_critere !Ne fermez pas le formulaire avant la fin de l'exercice. 2.2. La tableCrez une table nomme Vente avec les champs suivants : Nom des champsTypelongueur/type

VendeurTexte50

MontantMontaire

AnneNumriqueEntier

Et comme une table ACCESS n'est jamais vide, saisissez les enregistrements ci-dessous. Vu de la table3. La requte d'analyse croise3.1. CrationPour la requte d'analyse croise nous allons faire trs simple. Ce n'est qu'un exercice.

Ouvrez une nouvelle requte et insrez la table Vente. Fermez le panneau d'insertion de table.Slectionnez dans le menu Requte l'item Analyse Croise. Puis faites glisser les champs de la table un un comme l'exemple prsent ci-dessous : Vu de la requte en mode cration.Testez la requte et sauvegardez-la sans la fermer. 3.2. Le critre de slectionNous allons tenter prsent de lier la zone liste contenant le critre notre belle requte. Pour cela nous allons devoir rajouter du code dans la cellule Critre de la dernire colonne la place du 2001. Le lien vers notre critreSlectionnez

[formulaires]![Analyse Croise].[Zl_Critere]

Excutez la requte... Une erreur se produit dont le message est plus qu'explicite. Le vilain message d'erreur !Nous venons de dmontrer que la requte d'analyse croise dans Access ne supporte pas les critres lis. Si vous remplacez le critre "[forms]![Analyse Croise].[zl_critere]" par "2001" vous verrez que cela fonctionne. Vous pouvez essayer avec une requte Select intermdiaire pour le critre, le rsultat est malheureusement identique, cause de la rfrence faite un contrle de formulaire.Ce problme peut tre contourn de trois manires.La premire consiste utiliser le tableau des paramtres clic droit / Paramtres de la requte et d'y inscrire les liens vers les contrles. [forms]![Analyse Croise].[zl_critere] n'oubliez pas de mettre le type de donnes dans la 2me colonne !Il arrive que sur de grosses requtes trop complexes, Access prouve des problmes d'excution. Dans ce cas il faut utiliser d'autres mthodes.La deuxime est base de requtes. En pleine contradiction avec notre dmonstration ?!. Pas tout fait puisqu'elle consiste crer une table temporaire ne contenant que les enregistrements concerns pour l'analyse. Facile mettre en oeuvre car sans utilisation du VBA, elle peut tre automatise dans une macro.L'autre fait appel au VBA et l'avantage d'tre plus rapide excuter sur de gros volumes de donnes car ne mettant en oeuvre qu'une seule requte. 4. Mthode "Full Queries"Pour mettre en oeuvre cette mthode vous devez crer une requte cration de table, une requte d'analyse croise et une procdure en Visual Basic pour Application (possible par macro). 4.1. Les objets requtesPour crer la premire requte, procdez de la mme manire que pour la cration d'une requte de type Select, suivant le modle prsent ci-dessous. La requte Select transformer.Cette requte permet de slectionner les enregistrements traiter dans la requte d'analyse croise. A l'aide du menu Requte transformez-la en Requte Cration de table...Un menu prcieux.Sauvegardez la requte sous le nom suivant : Gen_Temp_ACEn Choisissant un nom explicite lors d'un dveloppement multi-utilisateur, indiquant qu'il s'agit d'un objet temporaire, vous pourrez dterminer rapidement les tables garder dans l'ihm et celles inclure dans le fichier de donnes partag. La requte finale.Sauvegardez celle-ci sous Analyse Rsultat par AnNos objets sont prt : Liste des objets

Gen_Temp Permet de copier les enregistrements de Vente analyser.

Temp_AC Table cre avec les enregistrements issues de Vente.

Analyse Rsultat par An Requte d'analyse croise finale base sur Temp_AC.

4.2. La procdure Visual BasicBien que cette procdure puisse tre ralise dans une macro, nous allons plutt la raliser en VBA.Passez le formulaire Analyse Croise en mode cration. Crer un bouton de commande que vous nommez Btn_FullQueries et qui porte Analyse Croise Full Queries comme lgende.Sur l'vnement Sur Clic slectionnez [Procdure vnementielle] puis cliquez sur le bouton pour crer une procdure VBA. Code insrer dans la procdure Private Sub Btn_FullQueries_Click()Slectionnez

DoCmd.SetWarnings False ' message off DoCmd.DeleteObject acTable, "Temp_AC" ' supprime la table temporaire DoCmd.OpenQuery "Gen_Temp_AC", acViewNormal ' cration de la table temporaire DoCmd.OpenQuery "Analyse Croise", acViewNormal ' affiche l'analyse croise docmd.setWarnings True ' message on La mthode base de requte est maintenant termine. En slectionnant le critre dans la zone liste et en cliquant sur le bouton vous aurez une belle requte d'analyse croise base sur le critre de la liste. 5. Mthode Visual Basic pour ApplicationLa mthode base de Visual Basic pour Application est beaucoup plus simple mettre en oeuvre pour un peu qu'on connaisse le langage VBA et les requtes. Il est conseill de crer une requte d'analyse croise l'aide du gnrateur, cela vite les erreurs potentielles. 5.1. Cration de la requteCrez la requte d'analyse croise identique la premire ralise. Tiens !? un air de dj vu...Passez en mode SQL l'aide du bouton liste de la barre d'outils requte. Le code SQL apparat faites en une copie l'aide de la combinaison de touches Ctrl+C.

Enregistrez la requte sous le nom AnalyseAnne. 5.2. Cration de la procdure Visual BasicDans le formulaire crez un deuxime bouton que vous nommez Btn_FullVBA avec la lgende Analyse Croise Full VBA. Crez de la mme manire que pour le premier bouton une procdure VBA sur l'vnement Sur Clic Insrez la chane SQL prcdemment copie. La chaine SQL insre.Slectionnez

TRANSFORM Sum(Vente.Montant) AS SommeDeMontantSELECT Vente.VendeurFROM VenteWHERE (((Vente.Anne)=2001))GROUP BY Vente.VendeurPIVOT Vente.Anne;Modifiez le code comme suit en respectant bien les espaces aprs les double-ctes Code modifiSlectionnez

Dim Sql As String ' declare la variable SqlSql = "TRANSFORM Sum(Vente.Montant) AS SommeDeMontant"Sql = Sql & " SELECT Vente.Vendeur"Sql = Sql & " FROM Vente"Sql = Sql & " WHERE (((Vente.Anne) = 2001))"Sql = Sql & " GROUP BY Vente.Vendeur"Sql = Sql & " PIVOT Vente.Anne;" ' compose la chane SQLDoCmd.DeleteObject acQuery, "AnalyseAnne" ' supprime la requte AnalyseAnne

CurrentDb.CreateQueryDef "AnalyseAnne", Sql ' cre la nouvelle requeteDoCmd.OpenQuery "AnalyseAnne" ' ouvre la requeteDernire modification du code et la plus importante ; elle concerne le remplacement du critre statique (2001) par le critre dynamique Me.Zl_critere. Cette instruction fait rfrence la valeur de la zone liste Zl_critere du formulaire courant (me).Elle peut galement tre crite ; Me.Zl_critere.value ou bien Zl_critere.value. Dernire modification effectuer.Slectionnez

'Remplacez cette ligneSql = Sql & " WHERE (((Vente.Anne) = 2001))"'Par celle-ciSql = Sql & " WHERE (((Vente.Anne) = " & Me.Zl_critere & "))"Notez que l'on peut galement modifier le code SQL d'une requte en faisant rfrence la proprit SQL de l'objet DAO.QueryDef dont un excellent exemple est prsent dans la FAQ. 6. ConclusionSi la premire mthode, "Full Queries", est ralisable sans aucune connaissance du VBA, elle pose quelques problmes importants. AvantagesInconvnients

Peut tre mise en oeuvre par un rfractaire au VBA.Ncessite l'excution de 2 requtes (slection et analyse croise) qui peut tre rdhibitoire sur un gros volumes de donnes.

Traage d'erreurs plus simple puisque ne faisant appel qu'au gnrateur de requtes.Implique la cration d'une table temporaire sur le poste client, toujours contraignante en terme d'occupation disque.

Je n'en vois pas d'autres...Ncessite l'intervention sur 2 objets requtes en cas de modification.

La deuxime mthode, "VBA", est de loin ma prfre. AvantagesInconvnients

Excution d'une seule requte permettant un gain de temps.Ne peut tre mise en oeuvre par un rfractaire au VBA.

Pas de cration de table temporaire.Traage d'erreurs ncessitant l'intervention 2 niveaux ; VBA et Requte.

Modification plus simple ; remplacement de la requte dans le code.Je n'en vois pas d'autres...

Si le traage des erreurs dans le code SQL est pour vous un gros problme sachez que les points d'arrts (F9) ainsi que le passage en mode cration de la requte finale vous permettra de la dboguer par le gnrateur de requte. 7. RemerciementsJe tiens remercier : GreyBird, Anomaly, Loulou24, srjd, ChristopheJ, FRED.G et Super.Nono40 pour les prcieuses informations dispences dans l'utilisation de l'diteur XML et les diffrents outils et procdures de Developpez.com.Maxence HUBICHE pour son acceuil et ses conseils aviss ainsi que l'quipe du forum ACCESS.A FRED.G (encore et toujours) pour la pertinence de ses corrections, sous oublier les relecteurs de l'ombre. A l'quipe de Developpez.com pour la qualit du site. Je prsente mes plus plates excuses ceux que j'aurais omis de remercier. "Access ne nous rend que ce qu'on lui donne."