Bonjour à tous,
Je ne parviens pas à parametrer un champ de formulaire qui se rempli tout seul en interrogeant la base chaque fois que le champ de formulaire d'à coté change de valeur.
Le champ de formulaire lié à la table impliquée dans la requete SQL du formulaire s'appelle [ID Box]

A chaque changement d'enregistrement de la table T_Box en utilisant le système de navigation du formulaire ce champ change de valeur (évidement)
Mon champ de formulaire indépendant contient pour source de données une requete sql =
=(select [T_Box]![Nom] & " | " & [T_Box]![Libelle] as Boite from [T_Box] where [T_Box]![ID Box] = [Formulaires]![F_Emprunteur]![ID Box])
Access ne comprends pas :
résultat #nom?
J'ai essayé de passer par du code au chargement du formulaire avec un autre exemple,
cette fois mon champ lié s'appelle HouseholdInvID,
le nom du champ indépendant que je souhaite mettre en place est QualifOBJ
et la requête pour alimenter ce champ est :
select [T_MAIN_Inventory]![Manufacturer] & " | " & [T_MAIN_Inventory]![Model] & " | " & [T_MAIN_Inventory]![ModelNumber] & " | " & [T_MAIN_Inventory]![SerialNumber] & " | " & [T_MAIN_Inventory]![NOM] & " | " & [T_MAIN_Inventory]![NMUS] & " | " & [T_MAIN_Inventory]![SURNOM] as QualOBJ from [T_MAIN_Inventory] where [T_MAIN_Inventory]![HouseholdInvID] = [Formulaires]![F_Emprunteur]![HouseholdInvID]
=> cela fonctionne pour le premier chargement, via la procédure Form_Load,

mais ne se met pas à jour si je change d'enregistrement.
J'ai essayé de mettre à jours comme pour le chargement du formulaire sur différents évènements,
d'abord les les évènements liés au champ HouseholdInvID qui lui mémé est lié au résultat de la requete sousjacente du formulaire

puis avec les évènements liés au formulaires.
Mais quelque soit l'évènement tenté hormis 'Form_Load', cela ne change rien : ils ne sont pas invoqués.
sources des évènements essayés sur le champ de formulaire HouseholdInvID lié
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
| Private Sub HouseholdInvID_AfterUpdate()
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub HouseholdInvID_AfterUpdate..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub
Private Sub HouseholdInvID_Change()
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub HouseholdInvID_Change..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub
Private Sub HouseholdInvID_Dirty(Cancel As Integer)
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub HouseholdInv_Dirty..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub |
Cidessous, ma fonction execution de la requête dont le résultat doit s'afficher dans le champ indépendant que je cherche à lier au champ visé de mon formulaire
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 AlimQualObj(trcdbg As Boolean)
Dim rs As Recordset
Dim RSQL As String
If trcdbg Then MsgBox " F_Emprunteur _ AlimQualObj..."
RSQL = "SELECT [T_MAIN_Inventory]![Manufacturer] & ' | ' "
RSQL = RSQL & "& [T_MAIN_Inventory]![Model] & ' | ' & [T_MAIN_Inventory]![ModelNumber]"
RSQL = RSQL & "& ' | ' & [T_MAIN_Inventory]![SerialNumber] & ' | ' & [T_MAIN_Inventory]![NOM] "
RSQL = RSQL & "& ' | ' & [T_MAIN_Inventory]![NMUS] & ' | ' & [T_MAIN_Inventory]![SURNOM] "
RSQL = RSQL & " as QualOBJ from [T_MAIN_Inventory] "
RSQL = RSQL & " where [T_MAIN_Inventory]![HouseholdInvID] = " & Me.HouseholdInvID
'This tutorial contains examples of using SQL with VBA Access. As you will see below,
'to run SQL queries in Access with VBA you can use either the
'DoCmd.RunSQL or CurrentDb.Execute methods
If trcdbg Then MsgBox RSQL
Set rs = CurrentDb.OpenRecordset(RSQL, dbOpenDynaset)
Do While Not (rs.EOF) 'Begin row processing _ tant que ce n'est pas la fin de fichier
'If Not rs.BOF And Not rs.EOF Then ' si ce n'est pas un début ni une fin de recordset
' rs.BOF provoque une erreur de compilation
'you will only be here if Rows are returned
If ((IsNull(rs)) Or (rs(0) = "") Or (rs(0) = Null) Or (IsNull(rs(0)))) Then
'Si la requête retourne une valeur nulle, alors message de trace
If trcdbg Then MsgBox " retourne une valeur vide ou null ..."
Else
'Si la requete retourne une valeur non vide, alors mise à jour du champ de formulaire QualifOBJ avec cette valeur
If trcdbg Then MsgBox " retourne une valeur non vide ...CStr(rs(0)) : " & CStr(rs(0)) & " !"
Me.QualifOBJ = CStr(rs(0))
End If
rs.MoveNext 'passe a l'occurence suivante (normalement il n'y en a pas)
Loop
'Cleanup
rs.Close
Set rs = Nothing
End Sub |
Autres sources d'évènements essayés au niveau du formulaire, le seul qui fonctionne est form_load
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Private Sub Form_Load()
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub Form_Load..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub |
résultat en trace
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
| ---------------------------
Microsoft Access
---------------------------
F_Emprunteur _ Private Sub Form_Load...
---------------------------
OK
---------------------------
---------------------------
Microsoft Access
---------------------------
F_Emprunteur _ AlimQualObj...
---------------------------
OK
---------------------------
---------------------------
Microsoft Access
---------------------------
SELECT [T_MAIN_Inventory]![Manufacturer] & ' | ' & [T_MAIN_Inventory]![Model] & ' | ' & [T_MAIN_Inventory]![ModelNumber]& ' | ' & [T_MAIN_Inventory]![SerialNumber] & ' | ' & [T_MAIN_Inventory]![NOM] & ' | ' & [T_MAIN_Inventory]![NMUS] & ' | ' & [T_MAIN_Inventory]![SURNOM] as QualOBJ from [T_MAIN_Inventory] where [T_MAIN_Inventory]![HouseholdInvID] = 1
---------------------------
OK
---------------------------
---------------------------
Microsoft Access
---------------------------
retourne une valeur non vide ...CStr(rs(0)) : Adventure Works | Deluxe | KK200 | 1234ABCDDDD1234 | | | !
---------------------------
OK
--------------------------- |
Autres évènements jamas appelés :
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
| Private Sub Form_AfterRender(ByVal drawObject As Object, ByVal chartObject As Object)
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub Form_AfterRender..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub
Private Sub Form_AfterUpdate()
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub Form_AfterUpdate..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub
Private Sub Form_DataChange(ByVal Reason As Long)
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub Form_DataChange..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub
Private Sub Form_Dirty(Cancel As Integer)
Dim MDBG As Boolean ' Statut du mode DEBUG
MDBG = False ' initialisation du Mode DEBUG
'lit le parametre de l'application dans la table des parametres (module C_PrmAppli)
'Passage en mode debug si la valeur retournée convertie en majuscule est égale à VRAI
If (Not IsNull(TmpVar) And UCase(LitPrm_AMDBG) = "VRAI") Then MDBG = True
' Trace en cas de debug
If MDBG Then MsgBox " F_Emprunteur _ Private Sub Form_Dirty..."
'alimentation du champ de formulaire QualifOBJ
AlimQualObj (MDBG)
End Sub |
Comment puis je faire pour creer mon champ d'affichage dymamique en fonction de l'occurence chargée dans mon formulaire
(si il y arrive au moment du chargement, il doit bien y avoir une solutio n au moment du changement d'occurence, et donc changement d'affichage ou rafraichissement) ?
Vos aides sont vraiment bienvenues, car la je bloque depuis pas mal de temps, et je suis vraiment à court d'idées.
Bien cordialement,
Partager