Présentation de contexte
Se replonger dans les bases de données Access demande pas mal de persévérance.
Je souhaite élaborer une base de gestion de la collection, mais ayant tout oublié ou presque du VBA ...

Pour ce faire je combine les atouts de deux bases mises à disposition sur Developpez.com , l'une gestionnaire d'inventaire de ma maison et l'autre gestionnaire de photos stockées ,en locales. J'aurais voulu rester sur Access 2003 pour faciliter les portages âpres depuis ma clef USB, mais mon système est installé avec Office 2010, donc je travaille avec Access 2010.

Nom : Capture.PNG
Affichages : 83
Taille : 19,6 Ko


J'ai pas mal "galèré" pour me remémorer des choses toutes simples comme mettre en place un bouton d'appel de formulaire filtré. Le présent post est destiné à présenter de façon 'aide mémoire'

- la mise en place d'un bouton DBG pour positionner une sorte de variable d'environnement dans un contrôle indépendant (c'est-à-dire non lié aux tables de la base) du formulaire appelant
- la lecture dans le formulaire appelant de la valeur d'un filtre
- le code source du click sur ce bouton dont l'objectif est d'appeler un nouveau formulaire avec une requête sql constituée à partir de la valeur de filtre précédemment lue


La variable DBG
Tout d'abord je n'aime pas mettre, retirer et remettre en permanence des msgbox pour 'debugger' mes codes.
Alors dans mon formulaire maître, je mets un champ de type contrôle indépendant
-> souce du contrôle : rien
-> format : rien
-> Nom : MODEDBG

Nom : Capture.PNG
Affichages : 78
Taille : 6,6 Ko

à coté je mets un bouton nommé BTNDBG, avec pour légende DBG et avec pour code sur click :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Private Sub BTNDBG_Click()
'             ***                       BOUTON DE SWITCH DE VARIABLE D'ETAT SUR LE MODE D'EXECUTION DE L'APPLICATION                          ***
'             *** ce bouton permet à un utilisateur lambda d'activer ou desctiver les messages de traces inséré dans le code de l'application ***
' sur click 
' renvoi la valeur de numéro d'objet de l'inventaire (HouseholdInvID) présent dans le formulaire
' lecture de cette valeur : Forms!F_Inventaire_Photo.HouseholdInvID   
' decryptage :  vchamp HouseholdInvID
'            du formulaire  F_Inventaire_00 actif
' de l'occurence active (affichée) ce qu'indique Forms!
'
 
Dim dbg As Boolean     'variable d'état, mode Debug ou pas mode Debug, propre à ce formulaire
dbg = False               ' par défaut pas débug
 
Dim txtmsg As String   'pour constituer le texe à envoyer dans la msgbox
Dim MDBG  As Boolean 'pour passer en mode Debug ou en mode normal
 
' lecture du champ MODEDBG du formulaire actif Me, et conversion en texte affichable dans une MsgBox
If dbg Then MsgBox "lecture du MODEDBG du formulaire " & CStr(Me![MODEDBG]) 
 
 
'GESTION DE LA VARIABLE D'ETAT 
 
' initialisation s'il est vide; Au premier chargement du formulaire il est vide.
If IsNull(Me![MODEDBG]) Then Me![MODEDBG] = False     
 
' récupération de la valeur dans une variable temporaire
MDBG = Me![MODEDBG]
 
If dbg Then MsgBox "Valeur de MDBG " & CStr(MDBG)
 
' évaluation de cette valeur
Select Case MDBG    ' Evalue la valeur de la variable MDBG, puis en inverse la valeur
Case True     ' Action si vrai.
    MDBG = False
    If dbg Then MsgBox "V=>F"
Case False    ' Action si Faux.
    MDBG = True
    If dbg Then MsgBox "l'inverse F=>V"
Case Else    ' Other values.
    Debug.Print "erreur, variable non initialisée"
End Select
 
If dbg Then MsgBox "nouvelle Valeur de MDBG " & CStr(MDBG)
 
' envoi de la nouvelle valeur dans le champ de formulaire 
Me![MODEDBG] = MDBG
 
'Constitution du message resultant à afficher. 
' ce message permet de montrer que la lecture de la valeur du champ de formulaire receptacle d'un champ de table
' ce message permet de montrer l'équivalence des deux syntaxes pour lire cette valeur
' ce message permet de montrer que le switch de la valeur de la variable d'environnement MODEDBG s'est bien réalisé
' et que la nouvelle valeur est bien renvoyée dans le contrôle indépendant du formulaire actif
 
txtmsg = "Valeur du numéro d'objet de l inventaire (HouseholdInvID) présent dans le présent formulaire  "
txtmsg = txtmsg & Chr(13) & Chr(10) & "CStr(Forms!F_MAIN_Inventaire_00.HouseholdInvID) : "
txtmsg = txtmsg & CStr(Forms!F_MAIN_Inventory_00.HouseholdInvID)
txtmsg = txtmsg & Chr(13) & Chr(10) & "CStr(Me![HouseholdInvID]) : " & CStr(Me![HouseholdInvID])
txtmsg = txtmsg & Chr(13) & Chr(10) & "Mode Debug : " & CStr(Me![MODEDBG])
 
'RESULTAT DE LA PROCEDURE DE SWITCH
MsgBox (txtmsg)
 
End Sub
Bien j'ai créé ma variable d'État, booléenne, que je peux switcher à loisir, sans avoir à revenir dans mes sources.
Il me reste juste à l'exploiter désormais dans tous mes sources liés à ce formulaire.

Passons au coeur de mon sujet (si simple pour tout lemonde, mais qui m'a donné bien du fil à retordre)


Bouton d'appel d'un formulaire avec requete de filtre

Je suis dans le formulaire F_MAIN_Inventory_00 et j'appelle le formulaire F_MAIN_Inventory_PHOTO
remarque :
Touts mes formulaires sont préfixés de F_ (ou Fdv_ pour les formulaires qui seraient dédiés aux seuls developpeurs)
Toutes mes tables sont préfixées de T_ (ou Tdv_ pour les tables de parametres de conditions d'executions de l'application, tables de configuration dédiées aux developpeurs donc)
et
Touts mes Etats ou rapports sont préfixés de E_ ou Edv_
Toutes mes requetes sont préfixées de R_ ou Rdv_

Nom : Capture.PNG
Affichages : 80
Taille : 6,0 Ko

Le bouton d'appel présent dans F_MAIN_Inventory_00 est nommé BTN_PHOTO_Cmd

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Private Sub BTN_PHOTO_Cmd_Click()
' Appel du formulaire F_MAIN_Inventory_Photo => mise de ce nom dans une constante
Const NFORM_APPELE = "F_MAIN_Inventory_Photo"  ' Nom du formulaire a appelé
'
On Error GoTo Err_BTN_Cmd_Click       ' En cas d'erreur rendez-vous à l'etiquette Err_BTN_PHOTO_Cmd_Click
 
Dim dbg As Boolean                    ' Mode debug Dbg = vrai, Mode normal Dbg = faux
Dim WhereCondTxt As String            ' pour positionner la condition associée à l'ouverture du formulaire appelé
Dim FID As Long                       ' receptacle pour récuperer la valeur du champ HouseholeInvID dans le formulaire d'appel
 
If IsNull(Me![MODEDBG]) Then Me![MODEDBG] = False 'initialisation du champ mode debug s'il est vide
dbg = Me![MODEDBG]                    ' récupération de la valeur du champ mode debug MODEDBG dans le formulaire d'origine
FID = Me![HouseholdInvID]             ' récupération de la valeur du champ HouseholeInvID dans le formulaire d'origine (ie d'appel)
 
If dbg Then MsgBox " Procédure d'appel du formulaire  = " & NFORM_APPELE & " ," & Chr(13) & Chr(10) _
                & " Valeur du champ HouseholdInvID lu dans le formulaire d'appel  = " _
                & (CStr(FID)) & " ." & Chr(13) & Chr(10) _
                & "Cette valeur sera utilisée pour filtrer les occurences de la table des pointeurs sur photos associées à cet objet."
 
    If IsNull(FID) Then
'      Non sens : l'objet de l'inventaire issu du formulaire d'appel ne serait pas positionné ?
       MsgBox (" champ du formulaire HouseholdInvID , Me![HouseholdInvID] vide ? " _
               & Chr(13) & Chr(10) & " fin de la procedure en erreur !")
        GoTo Err_BTN_Cmd_Click
    Else
'   Préparation de la requete pour filtrer les occurences du formulaire appelé
    WhereCondTxt = FID & " = [T_MAIN_Inventory]![HouseholdInvID]"
 
'   appel du formulaire dont le nom est contenu dans NFORM_APPELE, en mode vue normale, avec cette condition
    DoCmd.OpenForm NFORM_APPELE, 0, , WhereCondTxt, , acDialog, "GotoNew"
'   syntaxe : docmd.OpenForm (FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)
 
    End If ' Fin si champ FID null
 
Exit_BTN_Cmd_Click: 'etiquette
 Exit Sub                     ' sortie normale de la procédure
 
 
Err_BTN_Cmd_Click: 'etiquette d'erreur
    MsgBox Err.Description    ' gestion de l'erreur
    Resume Exit_BTN_Cmd_Click ' sortie de la procédure en erreur
 
End Sub
Ainsi le formulaire appelé n'affichera que les occurences correspondant à l'objet affiché dans mon formulaire actif, dont le numéro est HouseholdInvID
champ visible dans ma seconde copie d'écran et qui est l'identifiant de la tables des objets concernés.

Nom : Capture.PNG
Affichages : 80
Taille : 37,1 Ko


Désormais je n'ai plus qu'à copier ce source dans les _Click des autres boutons d'appel du meme formulaire, en changeant la valeur de la constante contenant le nom du formulaire à ouvrir. Un puriste me dirait qu'il faut en faire une fonction, puisque seule cette constante sera modifiée, mais procédons par étape ....
en espèrant que ce dépôt pourra servir aux débutants

Pour une meilleur compréhension, j'ajoute l'image du shéma de base

Nom : Capture.PNG
Affichages : 80
Taille : 86,3 Ko

Dans cette base j'ai :
- l'inventaire de ma collection (adapté à partir du modèle de la base inventaire de ma maison)
- pour chaque objet de ma collection zéro ou plusieurs photos
- pour chaque objet de ma collection zéro ou plusieurs documlents associés tels que des notices, spécification détaillées ...