FAQ Office 2010
FAQ Office 2010Consultez toutes les FAQ
Nombre d'auteurs : 2, nombre de questions : 114, dernière mise à jour : 15 juin 2021
- Access 2010 intègre-t-il les champs calculés ?
- Comment connaître l'ancienne valeur d'un champ dans un évènement de table ?
- Comment lister les objets d'un groupe personnalisé ?
- Comment réduire le ruban ?
- Comment savoir si un champ a été modifié dans un évènement de table ?
- Comment savoir si une table possède au moins un évènement de table ?
- Comment savoir si une table possède un évènement de table donné ?
- Comment créer un champ calculé avec DAO ?
- Comment savoir si un champ DAO est un champ calculé ?
- Est-il possible d'utiliser les évènements de tables avec des tables liées
- Est-il possible d'utiliser les fonctions de regroupement (RechDom) dans un champ calculé ?
- Est-il possible d'utiliser des requêtes dans un champ calculé ?
- Est-il possible d'utiliser une fonction VBA dans un champ calculé ?
- Est-il possible d'utiliser des requêtes Action dans un évènement de table ?
- Est-il possible de faire référence à un autre enregistrement dans un champ calculé ?
- Est-il possible de faire référence à une autre base de données dans un évènement de table ?
- Est-il possible de faire référence à une table liée dans un évènement de table ?
- Où est située la table USysApplicationLog dans un environnement Dorsale/Frontale ?
- Pourquoi le générateur d'expressions n'affiche pas la totalité de mes champs ?
- Pourquoi mes évènements de tables ne fonctionnent plus ?
- Qu'est ce que la récursivité des évènements de tables ?
- Qu'est ce que la table USysApplicationLog ?
- Un champ calculé peut-il faire référence à un autre champ calculé ?
- 5.1. Contrôle WebBrowser
(21)
- Comment remplir une zone de texte dans un contrôle WebBrowser ?
- Comment savoir si une page Web contient un formulaire donné ?
- Comment savoir si une page Web contient au moins un formulaire ?
- Comment connaître le nombre de formulaires présents dans une page Web ?
- Comment lister le nom des formulaires présents dans une page Web ?
- Comment attendre la fin de chargement d'une page dans un contrôle WebBrowser?
- Comment modifier l'adresse du contrôle WebBrowser ?
- Comment connaître l'adresse de la page actuelle d'un contrôle WebBrowser ?
- Comment connaître le titre de la page actuelle d'un contrôle WebBrowser ?
- Comment revenir à la page précédente dans un contrôle WebBrowser ?
- Comment revenir à la page suivante dans un contrôle WebBrowser ?
- Comment rafraîchir la page actuelle d'un contrôle WebBrowser ?
- Comment connaître l'état d'un contrôle WebBrowser ?
- Comment récupérer le code HTML d'un WebBrowser ?
- Comment récupérer le code HTML du Body dans un WebBrowser ?
- Comment savoir si un lien existe dans une page web ?
- Comment naviguer vers un lien ?
- Comment savoir si un lien possède une url donnée dans une page web ?
- Est-il possible d'afficher un PDF dans un formulaire ?
- Comment afficher une table dans un WebBrowser ?
- Comment empêcher la navigation vers une page inexistante ?
- 5.2. Forme des contrôles en VBA
(21)
- Comment modifier la forme d'un bouton pour qu'elle soit de type Rectangle ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle à coins arrondis ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle à coins arrondis (petit apex) ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle à coins supérieurs arrondis ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle à coins supérieurs arrondis (petit apex) ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle avec un coin rogné ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type rectangle avec un coin arrondi ?
- Comment modifier la forme d'un bouton pour qu'elle soit de type ellipse ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Aucun ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Cerle ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Incrustation relâchée ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Croix ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Inclinaison douce ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Angle ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Arrondi adouci ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Convexe ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Inclinaison ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Scillage ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Riblet ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Bordure marquée ?
- Comment modifier le biseau d'un bouton pour qu'il soit de type Art Déco ?
Oui.
Pour plus d'informations vous pouvez consulter :
- Le tutoriel : Les nouveautés d'Access 2010 : les champs calculés
- La démonstration en vidéo : Access 2010 - Nouveautés - Les champs calculés
Prenons par exemple une table client(IdClient,NomClient,PrenomClient).
Dans l'évènement de table "Validate Change" (avant changement) faites appel à Old.NomClient pour connaître l'ancienne valeur du champ NomClient.
Exemple dans l'éditeur de Macro :
SetLocalVar
Name
=
"AncienNom"
Value
=
"Ancien Nom : "
&
Old.NomClient &
" => Nouveau Nom : "
&
NomClient
La requête suivante permet de lister l'ensemble des objets d'un groupe personnalisé. Rappel : les groupes personnalisés sont définis dans le panneau de navigation (pavé latéral gauche) et permettent de rassembler les objets dans l'ordre souhaité par le développeur.
SELECT
MSysNavPaneGroupToObjects.Name
FROM
MSysNavPaneGroups
INNER
JOIN
MSysNavPaneGroupToObjects
ON
MSysNavPaneGroups.Id =
MSysNavPaneGroupToObjects.GroupID
WHERE
MSysNavPaneGroups.Name
=
"MonGroupe"
Exécutez le code VBA suivant si vous souhaitez réduire ou agrandir le ruban Access :
Application.CommandBars.ExecuteMso
"MinimizeRibbon"
Prenons par exemple une table client(IdClient,NomClient,PrenomClient).
Pour déclencher une action dans l'évènement de table "Validate Change" (avant changement) si et uniquement si le prénom du client a changé, il suffit de faire appel à la fonction Updated("NomDuChamp") dans un bloc IF.
Exemple dans l'éditeur de Macro :
If
Updated(
"PrenomClient"
)
Then
SetLocalVar
Name
=
"Motif"
Value
=
"Modification du prénom"
End
if
Pour savoir si un évènement de table est présent dans une table, vous pouvez vous baser sur le contenu de la table MSysObjects et son champ LvExtra.
La fonction suivante retourne True si au moins un évènement de table est recensé dans la table passée en paramètre.
Function
EvenementTable
(
strTable As
String
) As
Boolean
Dim
oDb As
dao.Database
Dim
oRst As
dao.Recordset
Dim
n
Set
oDb =
CurrentDb
Set
oRst =
oDb.OpenRecordset
(
"SELECT lvExtra FROM MSysObjects WHERE NAME="
&
Chr
(
34
) &
strTable &
Chr
(
34
))
If
Not
oRst.EOF
Then
n =
oRst.Fields
(
0
).GetChunk
(
0
, oRst.Fields
(
0
).FieldSize
)
If
Not
IsNull
(
n) Then
EvenementTable =
(
InStr
(
1
, CStr
(
n), "</macro>"
, vbTextCompare) <>
0
)
End
If
Else
err
.Raise
15001
, , "La table n'existe pas"
End
If
End
Function
Exemple :
MsgBox
EvenementTable
(
"tbl_produit"
)
Pour savoir si un évènement de table donné est présent dans une table, vous pouvez vous baser sur le contenu de la table MSysObjects et son champ LvExtra. La recherche de l'expression Event="X" dans ce champ vous apportera la réponse désirée.
La fonction suivante retourne True si l'évènement de table strEvenement est recensé dans la table passée strTable.
Function
EvenementTableX
(
strTable As
String
, strEvenement As
String
) As
Boolean
Dim
oDb As
dao.Database
Dim
oRst As
dao.Recordset
Dim
n
Set
oDb =
CurrentDb
Set
oRst =
oDb.OpenRecordset
(
"SELECT lvExtra FROM MSysObjects WHERE NAME="
&
Chr
(
34
) &
strTable &
Chr
(
34
))
If
Not
oRst.EOF
Then
n =
oRst.Fields
(
0
).GetChunk
(
0
, oRst.Fields
(
0
).FieldSize
)
If
Not
IsNull
(
n) Then
EvenementTableX =
(
InStr
(
1
, CStr
(
n), "Event="
&
Chr
(
34
) &
strEvenement &
Chr
(
34
), vbTextCompare) <>
0
)
End
If
Else
err
.Raise
15001
, , "La table n'existe pas"
End
If
End
Function
Exemple :
MsgBox
EvenementTableX
(
"tbl_Mouvement"
, "afterInsert"
)
Si vous utilisez DAO pour créer vos champs, ce nouveau type est défini via les deux éléments suivants :
- Le type passé à la méthode CreateField qui définit le type de retour attendu (texte, entier, etc.)
- La propriété Expression qui correspond à la règle de calcul à appliquer
L'exemple suivant montre comment ajouter le champ calculé TotalLigne à la table tblLigneFacture faisant le produit du prix de l'article et de la quantité facturée.
Sub
create
(
)
Dim
oDb As
DAO.Database
Dim
oFld As
DAO.Field
Dim
oTbl As
DAO.TableDef
Set
oDb =
CurrentDb
Set
oTbl =
oDb.TableDefs
(
"tblLigneFacture"
)
Set
oFld =
oTbl.CreateField
(
"TotalLigne"
, dbCurrency)
oFld.Properties
(
"Expression"
).Value
=
"[Qte]*[PrixHT]"
oTbl.Fields.Append
oFld
End
Sub
Pour savoir si le champ référencé par l'objet Field est calculé vous pouvez utiliser la fonction suivante :
Function
IsCalculated
(
oFld As
DAO.Field
) As
Boolean
On
Error
GoTo
err
Const
CALCPROP =
"Expression"
Dim
oPrp As
DAO.Property
Set
oPrp =
oFld.Properties
(
CALCPROP)
IsCalculated =
oPrp.Value
<>
""
fin
:
Exit
Function
err
:
Resume
fin
End
Function
Exemple d'utilisation :
Function
Test
(
)
Dim
oDb As
DAO.Database
Dim
oFld As
DAO.Field
Dim
oTbl As
DAO.TableDef
Set
oDb =
CurrentDb
Set
oTbl =
oDb.TableDefs
(
"tblLigneFacture"
)
MsgBox
IsCalculated
(
oTbl.Fields
(
"TotalLigne"
))
End
Function
Oui. Contrairement à ce qu'affirment certains bloggeurs, les évènements d'une table liée sont bien déclenchés depuis une base frontale.
Non. Le moteur de base de données gère exclusivement les opérations simples telles que définies dans le générateur d'expressions. Les fonctions de regroupements DFirst, DLookup ... ne sont pas disponibles.
Non. Le moteur de base de données gère exclusivement les opérations simples telles que définies dans le générateur d'expressions. Les requêtes n'y sont pas disponibles.
Non. Le moteur de base de données gère exclusivement les opérations simples telles que définies dans le générateur d'expressions. Les fonctions VBA n'y sont pas disponibles.
Non. Ce n'est pas possible. Toute action sur les données doit être réalisée à l'aide des instructions de DataMacro fournies : EditRecord, CreateRecord, DeleteRecord. Les requêtes INSERT, UPDATE, DELETE sont interdites.
L'erreur alors levée dans la table USysApplicationLog est :
Queries that contain linked tables, action queries, and database references are not allowed in data macros.
Non. Le moteur de base de données gère exclusivement les opérations simples telles que définies dans le générateur d'expressions. Les opérations s'applique uniquement à l'enregistrement courant.
Non. Ce n'est pas possible. Les évènements de tables doivent être placés dans la base de données et il est impossible de référencer une autre base à l'aide du mot clé IN.
L'erreur alors levée dans la table USysApplicationLog est :
Queries that contain linked tables, action queries, and database references are not allowed in data macros.
Non. Ce n'est pas possible. Les évènements de tables doivent être placés dans la base de données dorsale et non dans la frontale. Pour éviter tout risque de conflit, les évènements de tables ne peuvent pas faire référence à des tables externes.
L'erreur alors levée dans la table USysApplicationLog est :
Queries that contain linked tables, action queries, and database references are not allowed in data macros.
Dans un environnement BackEnd/FrontEnd, la table USysApplicationLog est située normalement dans la base dorsale (celle contenant les données).
Seule exception : si vous avez créé des Triggers sur une table locale de la base frontale, alors vous disposerez de deux tables USysApplicationLog :
- Une dans la dorsale contenant les erreurs des triggers relatifs à la base dorsale
- Une dans la frontale contenant les erreurs des triggers relatifs à la base frontale
Lorsque vous créez un champ calculé, vous devez sauvegarder votre table avant de faire appel au générateur d'expressions sans quoi il sera incapable de lister les champs à votre disposition.
Une des causes majeures de l'echec d'un déclencheur qui fonctionnait auparavant est la modification de la structure de la base.
En effet, si le changement de nom d'un objet se propage dans tous les objets dépendants tels que les requêtes par exemple, il n'en est rien pour les évènements de table et il vous faudra les reprendre à chaque modification de la structure de votre base de données.
Inutile de vous dire qu'il est important de garder une trace écrite de tous vos déclencheurs faute de quoi il sera difficile de vous y retrouver.
Lorsque vous travaillez sur l'évènement de table ValidateChange (Sur changement), toute modification d'un des champs va de nouveau appeler cet évènement. Et pour cause : un nouveau changement a bien eu lieu. Pour éviter des boucles interminables en cas d'erreur de programmation, Microsoft a limité la récursivité à 9 rappels.
Si vous atteignez cette limite, l'erreur suivante sera répertoriée dans la table USysApplicationLog :
A data macro resource limit was hit. This may be caused by a data macro recursively calling itself. The Updated([Field]) function may be used to detect which field in a record has been updated to help prevent recursive calls.
La table USysApplicationLog est une table système servant de journal d'erreur aux évènements de table d'une base Access. Celle-ci n'existe pas tant qu'aucun évènement de table n'a été créé.
Lien : Où est située la table USysApplicationLog dans un environnement Dorsale/Frontale ?
Oui, un champ calculé peut faire référence à un autre champ calculé de la même table.
Exemple :
TblLigneFacture(ID,PrixHT,Qte,TotalLigneHT,TVA,TotalLigneTTC)
Avec :
- TotalLigneHT = [PrixHT]*[Qte]
- TotalLigneTTC=[TotalLigneHT]*TVA