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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

[Article] Classe MELA pour formulaire (Nouvelle version)


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut [Article] Classe MELA pour formulaire (Nouvelle version)
    Bonjour,

    Découvrez la classe MELA (CRUD en anglais), de l'acronyme Modification, Effacement, Lecture, Ajout.

    Disponible en version 2007 ou Texte pour ceux qui ont des versions antérieures.

    C'est ici
    http://loufab.developpez.com/tutorie...s/classe-mela/

    [Edit] L'interet d'une telle classe réside dans la facilité de mise en place d'un système de gestion de fiche pour l'ensemble d'une application, simplement par la déclaration d'une classe dans l'événement d'ouverture des formulaires.

    J'attend vos commentaires.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  2. #2
    Membre confirmé
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Par défaut
    Bonjour Fabrice,

    Un grand merci. J'adore cette classe MELA.

    Une suggestion d'ajout (en rouge) dans Public Property Set Form (objForm As Form) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
           
    '...
     If Not (TypeOf ctrl Is Label Or TypeOf ctrl Is Line Or TypeOf ctrl Is Image Or _
                    TypeOf ctrl Is CustomControl Or TypeOf ctrl Is TabControl Or _
                    TypeOf ctrl Is Page Or _
                    TypeOf ctrl Is PageBreak Or TypeOf ctrl Is Rectangle) Then
    '...
    En effet, tous les contrôles de mon Form sont inclus dans un contrôle TabControl. Or comme le TabIndex de celui-ci est égal à zéro, le TabControl s'impose comme contrôle par défaut pour définir DefaultControlName.

    En pratique, cela se traduit par un bouton btnEnregistrer toujours visible et un bouton btnModifier toujours invisible.

    C'est un détail, mais ça peut éviter à d'autres de sécher comme je l'ai fait.

    Cordialement
    Ph.

  3. #3
    Membre confirmé
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Par défaut
    Encore moi.

    Une variante utile d'utilisation ou d'adaptation de la classe MELA :

    J'ai créé un sous-formulaire ne contenant que les boutons. C'est ce sous-formulaire qui appelle la classe MELA. Il suffit d'insérer le sous-formulaire dans l'entête ou le pied de n'importe quel formulaire, et ça marche très bien. Cela évite de coder dans chaque formulaire le code d'appel de la classe Mela dans les événements Open et Close.

    Il y a essentiellement deux modifications à apporter au code :

    1. Partout ou le code fait référence à des contrôles de la section Détail du formulaire, il suffit de remplacer Form par Form.Parent. Par exemple :

    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
        
    '...
    For Each ctrl In Form.Parent.Section(acDetail).Controls
            ' c'est un controle avec une propriété TabIndex        
            If Not (TypeOf ctrl Is Label Or TypeOf ctrl Is Line Or TypeOf ctrl Is Image Or _
                    TypeOf ctrl Is CustomControl Or TypeOf ctrl Is TabControl Or TypeOf ctrl Is Page Or _
                    TypeOf ctrl Is PageBreak Or TypeOf ctrl Is Rectangle) Then
    
                If ctrl.TabIndex = 0 Then
                    DefaultControlName = ctrl.Name
                    Exit For
                End If
    
            End If
        Next
    '...
    2. Dans le code ci-dessous, remplacer acHeader par acDetail (j'ai placé les boutons dans la section Détail du sous-formulaire — J'aurais aussi pu les placer dans la section En-tête et ne pas modifier ce bout de code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Property Set Form(objForm As Form)
    ' initialisation du formulaire à gérer
        On Error GoTo errSub
    
        Dim ctrl As Control
        
        Set oForm = objForm
        ' parcours l'entête de formulaire
        
        For Each ctrl In Form.Section(acHeader).Controls    ' => For Each ctrl In Form.Section(acDetail).Controls
            If TypeOf ctrl Is CommandButton Then
                ' on active l'événement
                ctrl.OnClick = "[Event Procedure]"
    '...
    Ph.

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut

    En effet beaucoup de variation possible autour de ce thème.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut
    Suite à la demande d'un lecteur sur mon blog voici une petite évolution de la classe MELA.

    Copie d'un enregistrement

    Il est facile d’ajouter des fonctions dans la classe MELA.
    Il suffit d’ajouter un bouton en utilisant la normalisation requise.

    1) Ajouter la déclaration dans l’entête de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents btnCopierEnregistrement As CommandButton
    2) Ajouter la libération dans la procédure Terminate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set btnCopierEnregistrement = Nothing
    3) Ajouter l’instanciation dans la property Form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case "btnCopierEnregistrement "
    Set btnCopierEnregistrement = Ctrl
    4) Ajouter le code de la copie dans une nouvelle procédure respectant la normalisation du nom.
    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
    Private Sub btnCopierEnregistrement _Click()
    ' copier l'enregistrement courant
    Dim rst As DAO.Recordset
    Dim fld As DAO.Field
    If Form.NewRecord And Not Form.Dirty Then Exit Sub 'pas de copie d'un enregistrement vide
    btnEnregistrer_Click ' on enregistre
    Set rst = Form.RecordsetClone 'on utilise le clone pour la source
     
    btnCreer_Click 
     
    Form.Recordset.AddNew 'et le recordset pour la destination
    For Each fld In Form.Recordset.Fields
     
         If Not fld.Attributes And dbAutoIncrField Then 'sauf les NumeroAuto
             fld.Value = rst.Fields(fld.Name)
         End If
     
    Next
    Form.Recordset.Update
    End Sub
    5) Ajouter le bouton avec le nom btnCopierEnregistrement.

    Voilà !
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut
    Nouvelle version avec le copier et la liste déroulante de recherche.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut
    Concernant ton code :
    Pense à libérer les objets que tu ouvres surtout dans des classes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim rst As Object
        Set rst = oForm.RecordsetClone  
    ...
        set rst = Nothing
    Il vaut mieux créer une fonction private qui renvoi le recordcount.
    Que se passe-t-il si le recordset est vide ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Citation Envoyé par loufab Voir le message
    Pense à libérer les objets que tu ouvres surtout dans des classes.
    Exact, merci de me l'avoir rappelé

    Citation Envoyé par loufab Voir le message
    Il vaut mieux créer une fonction private qui renvoi le recordcount.
    Pour quelle raison ?

    Citation Envoyé par loufab Voir le message
    Que se passe-t-il si le recordset est vide ?
    S'il n'y a pas d'enregistrement dans ma table, les boutons ne sont pas visibles. C'est l'intérêt de la gestion des erreurs que j'ai inclus justement : sans enregistrement, RecordCount retourne la valeur 0.

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 148
    Par défaut
    A la fin du point VI-A du tuto, il est indiqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Docmd.OpenForm "fAdherent",,,,acAdd
    On continue le verrouillage/déverrouillage tout au long des actions qui le nécessitent. De quoi s'agit-il, et où peut-on le mettre ?
    Et pourquoi placer les boutons de commande forcément dans l'en-tête ?
    C'est pour donner un exemple d'une commande qui va déclencher le mode Ajout et de mettre ceci en pratique :

    Ici le choix de l'activation ou non des contrôles est conditionné par la valeur renvoyée par la propriété NewRecord du formulaire. Ceci permet d'être immédiatement en situation de saisie si l'ouverture du formulaire est réglée sur Ajout de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' verrouille l'enregistrement dés son affichage sauf si c'est un nouvel enregistrement.
        ActiverControleDetail oForm.NewRecord
     
        ' Capte l'id de l'enregistrement
        If Not oForm.NewRecord Then
           Me.IdCurrentRecord = vIdCurrentRecord
        End If
    Donc il n'y a rien à faire ! Du moment que tu ouvres un formulaire en mode acAdd (nouvel enregistrement).

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/04/2014, 12h56
  2. 2017 : un quinquennat pour une nouvelle version du C++ ?
    Par 3DArchi dans le forum Normalisation
    Réponses: 45
    Dernier message: 02/04/2013, 09h04
  3. Firefox pour Android : première beta pour la nouvelle version
    Par Gordon Fowler dans le forum Android
    Réponses: 12
    Dernier message: 27/06/2012, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo