Numéro d'article: 462816 - Dernière mise à jour: mercredi 3 mars 2004 - Version: 3.0

Comment créer un état dynamiquement.

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Ancien nº de publication de cet article : F12816
Agrandir tout | Réduire tout

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):
  • Microsoft Access 1.0 Standard
  • Microsoft Access 1.1 Standard
  • Microsoft Access 2.0 Standard
Mots-clés : 
rpt KB462816
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.