IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ Office 2010

FAQ Office 2010Consultez toutes les FAQ

Nombre d'auteurs : 2, nombre de questions : 114, dernière mise à jour : 15 juin 2021 

 
OuvrirSommaireAccess
précédentsommairesuivant
 
 

Oui.

Pour plus d'informations vous pouvez consulter :

Créé le 27 juillet 2009  par Christophe Warin

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 :

 
Sélectionnez
  SetLocalVar
    Name = "AncienNom"
    Value = "Ancien Nom : " & Old.NomClient & " => Nouveau Nom : " & NomClient
Créé le 6 septembre 2009  par Christophe Warin

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.

 
Sélectionnez
SELECT MSysNavPaneGroupToObjects.Name
FROM MSysNavPaneGroups 
   INNER JOIN MSysNavPaneGroupToObjects 
       ON MSysNavPaneGroups.Id = MSysNavPaneGroupToObjects.GroupID
WHERE MSysNavPaneGroups.Name="MonGroupe"
Créé le 14 avril 2010  par Christophe Warin

Exécutez le code VBA suivant si vous souhaitez réduire ou agrandir le ruban Access :

 
Sélectionnez
Application.CommandBars.ExecuteMso "MinimizeRibbon"
Créé le 14 avril 2010  par Christophe Warin

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 :

 
Sélectionnez
If Updated("PrenomClient") Then
  SetLocalVar
    Name = "Motif"
    Value = "Modification du prénom"
End if
Créé le 6 septembre 2009  par Christophe Warin

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.

 
Sélectionnez
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 :

 
Sélectionnez
MsgBox EvenementTable("tbl_produit")
Créé le 15 octobre 2009  par Christophe Warin

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.

 
Sélectionnez
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 :

 
Sélectionnez
MsgBox EvenementTableX("tbl_Mouvement", "afterInsert")
Créé le 15 octobre 2009  par Christophe Warin

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.

 
Sélectionnez
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
Créé le 27 juillet 2009  par Christophe Warin

Pour savoir si le champ référencé par l'objet Field est calculé vous pouvez utiliser la fonction suivante :

 
Sélectionnez
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 :

 
Sélectionnez
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
Créé le 27 juillet 2009  par Christophe Warin

Oui. Contrairement à ce qu'affirment certains bloggeurs, les évènements d'une table liée sont bien déclenchés depuis une base frontale.

Créé le 11 octobre 2009  par Christophe Warin

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.

Créé le 27 juillet 2009  par Christophe Warin

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.

Créé le 27 juillet 2009  par Christophe Warin

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.

Créé le 27 juillet 2009  par Christophe Warin

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.

Créé le 31 octobre 2009  par Christophe Warin

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.

Créé le 27 juillet 2009  par Christophe Warin

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.

Créé le 31 octobre 2009  par Christophe Warin

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.

Créé le 31 octobre 2009  par Christophe Warin

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
Créé le 11 octobre 2009  par Christophe Warin

Lien : Qu'est ce que la table USysApplicationLog ?

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.

Créé le 27 juillet 2009  par Christophe Warin

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.

Créé le 6 septembre 2009  par Christophe Warin

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.

Créé le 31 octobre 2009  par Christophe Warin

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éé.

Créé le 11 octobre 2009  par Christophe Warin

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
Créé le 27 juillet 2009  par Christophe Warin
précédentsommairesuivant
 
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.