Numéro d'article: 462816 - Dernière mise à jour: mercredi 3 mars 2004 - Version: 3.0 Comment créer un état dynamiquement.
Ancien nº de publication de cet article : F12816 Résumé
Cet article suppose que vous êtes familier avec le langage de développement ACCESS BASIC et avec la création d'application MICROSOFT ACCESS. INFORMATION TECHNIQUE : Avec Microsoft Access version 1.X, il est possible de créer dynamiquement des états basés soit sur une requête analyse croisée soit sur une table contenant le résultat d'une requête analyse croisée. L'exemple suivant utilise des paramètres de type date saisis dans un formulaire pour extraire à partir de la requête analyse croisée un jeu d'enregistrements et affiche dans l'état créé le nom de l'adhèrent, ainsi que le titre et le nombre d'ouvrage emprunté pour une période déterminée. Pour suivre cet exemple, vous devez être familier avec la programmation Access Basic et la création d'état Microsoft Access. Lorsqu'un des boutons du formulaire est choisi, une fonction Access basic est lancée permettant: De créer un jeu d'enregistrements dynamique qui sera affiché dans l'état. Fonction Appercu_Etat() De créer dynamiquement des tables contenant le résultat de l'analyse croisée. Fonction Creation_Table() De créer dynamiquement un état basé: Sur la requête analyse croisée. Sur une table contenant le résultat de l'analyse croisée. Fonction Creation_Etat() Une fonction Temps() est utilisée permettant de calculer le temps de traitement de chaque procédure. A) Ouvrez la base de données BIBLIO.MDB B) CREATION DE REQUETE: Requête Analyse Croisée Créez une nouvelle requête analyse croisée basée sur les tables ADHERENTS, EMPRUNTS et OUVRAGES. Pour cela procédez comme suit: 1) Choisir le bouton Requête dans la fenêtre base de données, puis le bouton nouveau. 2) Ajouter les tables ADHERENTS, EMPRUNTS et OUVRAGES 3) Dans la grille d'interrogation de la reqûete, glissez-déplacez les champs suivants: Note: Pour afficher dans la grille le champ analyse, choisissez la commande Analyse croisée du menu requête. Champ: Nom de l'adherent: T_ADH_NOM Table: ADHERENTS Opération: Regroupement Analyse: Ligne Champ: T_OUV_TITRE Table: OUVRAGES Opération: Regroupement Analyse: Colonne Champ: T_EMP_NUMREF Table: EMPRUNTS Opération: compte Analyse: Value Champ: T_EMP_NUMREF Table: EMPRUNTS Opération: compte Analyse: Ligne Champ: T_EMP_NUMREF Table: EMPRUNTS Opération: compte Analyse: Ligne Champ: T_EMP_DATEEMP Table: EMPRUNTS Opération: Où Analyse: Critère: Entre [Forms]![Formulaire Exemple]![Date Début] Et [Forms]![Formulaire Exemple]![Date Fin] 4) Activez la commande Paramètres du menu requête et ajoutez les paramètres suivant: Paramètre Type de données Forms!Formulaire Exemple!Date Début Date/heure Forms!Formulaire Exemple!Date Fin Date/heure 5) Sauvegardez la requête sous le nom: Requête Analyse croisée C) CREATION DU FORMULAIRE: Formulaire Exemple 1) Créez deux contrôles de type texte avec les propriétés suivantes: (TEXT1) Nom Contrôle: Date début (TEXT2) Nom Contrôle: DateFin 2) Ajoutez deux boutons au formulaire avec les propriétés suivantes (BOUTON1) Légende: Création de l'état avec table Sur pression: = Appercu_Etat(1) (BOUTON2) Légende: Création de l'état avec requête Sur pression: = Appercu_Etat(2) 3) Sauvegardez le formulaire sous le nom: Formulaire Exemple D) CREATION D'UN MODULE: Option Compare Database 'Utilise l'ordre de la base pour les comparaisons de chaînes Option Explicit Dim MesChamps() Dim nColumns As Integer Const TYPE_SOURCE_TABLE = 1 Const TYPE_SOURCE_REQUETE = 2 Function Appercu_Etat (TypeSource As Integer) Dim MaDatabase As Database, Matable As Table Dim MonDynaset As Dynaset, MaQueryDef As QueryDef Dim MonSnapShot As Snapshot, i As Integer Dim MaForm As Form Dim NomSource As String Temps 1, TypeSource Set MaForm = Forms![Formulaire exemple] Set MaDatabase = CurrentDB() '************************************************************************ ' Création d'un jeu d'enregistrements dynamique -MonDynaset- à partir de ' la requête ' Analyse croisée. '************************************************************************ 'Ouverture de la requête. Set MaQueryDef = MaDatabase.OpenQueryDef("Requête Analyse croisée") 'Passage des paramètres entre le formulaire et la requête. MaQueryDef![Forms!formulaire exemple!Date Début] = MaForm![Date Début] MaQueryDef![Forms!formulaire exemple!Date Fin] = MaForm![Date Fin] '************************************************************************ 'Création du jeu d'enregistrements dynamique en fonction de la requête 'analyse croisée. '************************************************************************ Set MonDynaset = MaQueryDef.CreateDynaset() 'Fermeture de la requête Analyse Croisée MaQueryDef.Close '************************************************************************ ' Création d'un jeu d'enregistrements statique -MonSnapShot- à partir du ' jeu d'enregistrements ' dynamique -MonDynaset- pour obtenir la liste des champs de ce dernier. '************************************************************************ Set MonSnapShot = MonDynaset.ListFields() ' Atteindre le dernier enregistrement du jeu d'enregistrements ' pour obtenir le nombre total MonSnapShot.MoveLast nColumns = MonSnapShot.RecordCount MonSnapShot.MoveFirst ' Redimension du tableau globale MesChamps() en fonction du ' nombre de champs trouvé à l'aide de la fonction ListFields() ReDim MesChamps(nColumns) i = 0 ' Boucle balayant le jeu d'enregistrements -MonSnapshot- pour ' remplir le tableau MesChamps() du nom des champs obtenus à ' l'aide de la fonction ListFields() While Not MonSnapShot.Eof MesChamps(i) = MonSnapShot!Name ' Cette Expression peut aussi s'ecrire de la manière suivante MesChamps(i)=MonSnapShot("Name") i = i + 1 MonSnapShot.MoveNext Wend ' Fermeture du jeu d'enregistrements MonSnapShot.Close Select Case TypeSource Case TYPE_SOURCE_TABLE ' Création de la table croisée à partir du nombre de colonnes ' Cette Fonction retourne le Nom de la source qui sera ' associée à l'état. NomSource = Creation_table() '************************************************************************ ' Création d'un jeu d'enregistrements dynamique à partir de la table ' croisée '************************************************************************ Set Matable = MaDatabase.OpenTable(NomSource) ' Sauvegarde des noms de champs du jeu d'enregistrements -MonDynaset- ' dans la table croisée. Cette table doit obligatoirement posséder des ' noms de colonnes nommés Col#. While Not MonDynaset.Eof Matable.AddNew For i = 0 To nColumns - 1 Matable("Col" & i) = MonDynaset(MesChamps(i)) Next i Matable.Update MonDynaset.MoveNext Wend ' Fermeture des jeux d'enregistrements Matable.Close Case TYPE_SOURCE_REQUETE ' associe à la variable NomSource le nom de la requête de ' l'analyse croisée. NomSource = "Requête Analyse croisée" End Select MonDynaset.Close ' Création de l'état i = Creation_Etat(NomSource, TypeSource) End Function '******************************************************************* 'Fonction créant une table de manière dynamique dépendant du résultat 'de la requête analyse croisée '******************************************************************* Function Creation_table () As String Dim MaQueryDef As QueryDef Dim MaBase As Database Dim MonSnapShot As Snapshot Dim Requete As String Dim BufferColumn As String Dim TableExiste As String Dim NomTable As String Dim i As Integer Set MaBase = CurrentDB() '**************************************************************** 'Test si la table existe dans la base de donnée courante '**************************************************************** On Error Resume Next i = 1 Do NomTable = "TableCroisée" & Trim$(Str$(i)) Set MonSnapShot = MaBase.CreateSnapshot("Select [Name] from MsysObjects where [Name] = " & Chr$(34) & NomTable & Chr$(34)) TableExiste = MonSnapShot("Name") i = i + 1 MonSnapShot.Close Loop While Err = 0 On Error GoTo 0 '****************************************************************** 'Construction de la requête Sql permettant la création de la table '****************************************************************** For i = 0 To nColumns - 1 If i = 0 Then BufferColumn = BufferColumn & " '' As Col" & Trim$(Str$(i)) Else BufferColumn = BufferColumn & " ,'' As Col" & Trim$(Str$(i)) End If Next i Requete = "SELECT " & BufferColumn & " INTO " & NomTable & ";" Set MaQueryDef = MaBase.CreateQueryDef("Requête Création de table", Requete) MaQueryDef.Execute ' Execute la requête qui créée la table MaQueryDef.Close ' Fermeture de la requête MaBase.DeleteQueryDef ("Requête Création de table") ' Suppression de la requête Creation_table = NomTable ' Retourne le nom de la table créée End Function Function Page_Entete (col) If (col < nColumns) Then Page_Entete = MesChamps(col) Else Page_Entete = "" End If End Function ' Fonction permettant de calculer le temps de traitement Sub Temps (Flag As Integer, TypeSource As Integer) Static Depart As String Dim Titre As String Dim TotalTemps As Integer Select Case Flag Case 1 Depart = Time$ Case 2 Select Case TypeSource Case TYPE_SOURCE_TABLE Titre = "Création de l'état à partir d'une table" Case TYPE_SOURCE_REQUETE Titre = "Création de l'état à partir de la requête analyse croisée " End Select TotalTemps = DateDiff("s", Depart, Time$) MsgBox TotalTemps & " Seconde(s)", 64, Titre End Select End Sub '************************************************************************ 'Fonction créant un état de manière dynamique dépendant: ' -D'une table croisée ' ou ' -De la requête Analyse croisée 'Le nombre de contrôles associé, dépendra du nombre de colonnes crée par 'la requête analyse croisée (Voir la fonction Appercu_Etat()). 'Le nombre de colonnes est enregistré dans la variable nColumns ' 'Variables: ' NomSource: Contient le nom de la source à ' associé à la propriété "Source" de l'état ' ' TypeSource:Contient la constante TYPE_SOURCE_TABLE ou ' TYPE_SOURCE_REQUETE '************************************************************************ Function Creation_Etat (NomSource As String, TypeSource As Integer) Dim MonEtat As Report Dim MonControl As Control Dim GD As Integer 'Nombre entier indiquant les coordonnées de l'angle supérieur 'gauche du contrôle. Dim HL As Integer 'Nombre entier indiquant la largeur et la hauteur du contrôle. Dim NomEtat As String Dim i As Integer Dim ModeleEtat As String On Error Resume Next Const INCHTAILLE = 1 / 72 'la taille du caractère est donnée en point 'Sachant qu'un point = 1/72 de pouce Const TWIPSVALUE = 1 / 1440 'Création d'un Etat par défaut en fonction d'un style d'etat pré-etabli ModeleEtat = Screen.activeForm![Lst_style] If Err = 94 Then Set MonEtat = CreateReport("", "") ModeleEtat = "Standard" Err = 0 Else Set MonEtat = CreateReport("", ModeleEtat) End If 'Récuperation du nom de l'état ainsi crée NomEtat = MonEtat.FormName 'Associe à la Source de l'Etat la table croisée ou la requête 'Analyse croisée MonEtat.RecordSource = NomSource GD = 100 HL = 100 'Boucle permettant de créer nColumns contrôles For i = 0 To nColumns - 1 'Création de la section -Entête de page- Section N°3 Set MonControl = CreateReportControl(NomEtat, 109, 3, "", "", GD, HL) If Err = 0 Then MonControl.ControlSource = "=Page_Entete(" & i & ")" Else Err = 0 End If 'Création de la section -Détail- Section N°0 Set MonControl = CreateReportControl(NomEtat, 109, 0, "", "", GD, HL) Select Case TypeSource Case TYPE_SOURCE_TABLE 'Association des champs de la table créée aux contrôles 'si le Bouton -Création de l'état avec table- a été activé MonControl.ControlSource = "Col" & Trim$(Str$(i)) Case TYPE_SOURCE_REQUETE 'Association des champs de la requête si le Bouton ' -Création de l'état avec requête- a été activé MonControl.ControlSource = MesChamps(i) End Select GD = GD + MonControl.Width + 100 Next i 'Creation dans la section Entête d'Etat du titre de l'état. Set MonControl = CreateReportControl(NomEtat, 100, 1, "", "Modèle d'état " & ModeleEtat, 200, 200) If Err = 0 Then MonControl.FontItalic = True MonControl.FontName = "Arial" MonControl.FontWeight = 300 MonControl.FontSize = 12 MonControl.Height = (INCHTAILLE * MonControl.FontSize) / TWIPSVALUE MonControl.Width = 5000 End If 'Affiche en mode création l'Etat crée DoCmd Restore Temps 2, TypeSource End Function REMARQUES : Le code proposé en exemple ci-dessus utilise des méthodes et propriétés des versions du moteur de base de données JET 1.x utilisables avec JET 2.x. Le principe de résolution de ce problème reste le même pour la version ACCESS 7.0 pour Windows 95, il faudra adapter les modifications nécessaires à la DAO avec JET 3.0 pour porter le code et une exécution correcte. Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT. | Autres ressources Autres sites d'aide
CommunautésObtenir de l'aide
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email
Retour au début
