Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2011, 11h28   #1
Membre actif
 
Avatar de Ric500
 
Homme Richard
Ingénieur développement logiciels
Inscription : août 2004
Messages : 166
Détails du profil
Informations personnelles :
Nom : Homme Richard
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : août 2004
Messages : 166
Points : 157
Points : 157
Par défaut Objet Métier POO

Bonjour à tous,

Je viens de lire à peu près tout ce qui concerne la POO sur le forum sans trouver réponse à mon problème. Voilà j'ai développé une appli de gestion dans laquelle on trouve, très schématiquement, des affaires, des factures, du CA, du Volume d'affaires...

Chaque affaire est, bien sûr désignée par une clé unique, de même que les factures, par exemple. par contre les infos les concernant peuvent figurer dans d'autres tables (exp: entête de facture, lignes de factures et pied de facture sont 3 tables différentes).
Mon idée serait de déclarer un nouvel objet Affaire, par exemple (en lui passant son ID unique en paramètre) qui pourrait me renvoyer
- des propriétés en lecture seule comme son CA (autre table) ou le volume d'affaires concerné (encore une autre table).
- des propriétés en lecture/écriture, comme un statut (en cours, sans suite, clôturée...)
Je pourrais également lui appliquer des méthodes (suppression dans certains cas de figure...)

Mon problème est un souci de création des modules de classe correspondants.
Pourriez-vous me donner un début de piste à suivre?

(en fait je suis parvenu à créer une classe affaire grâce à laquelle je parviens à déclarer un objet affaire avec certaines propiétés, mais je ne trouve pas la syntaxe pour affecter cet objet vide à une affaire existante)

Merci d'avance...


Ci-après un proto de ce que j'ai fait (ne riez pas )

Code :
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
Option Compare Database
 
Private m_ReferenceAffaire As String
Private m_ID As Long
Private m_LibelleAffaire As String
Private m_DatDeb As Date
Private m_DatFin As Date
Property Get ID() As Long
    ID = m_ID
End Property
Property Get ReferenceAffaire() As String
    ReferenceAffaire = m_ReferenceAffaire
End Property
Property Get LibelleAffaire() As String
    LibelleAffaire = m_LibelleAffaire
End Property
Property Let LibelleAffaire(value As String)
    m_LibelleAffaire = value
End Property
Property Let ReferenceAffaire(value As String)
    m_ReferenceAffaire = value
End Property
Property Let ID(value As Long)
    m_ID = value
End Property
Property Get DateDeb() As Date
    DateDeb = m_DatDeb
End Property
Property Let DateDeb(value As Date)
    m_DatDeb = value
End Property
Property Get DateFin() As Date
    DateFin = m_DatFin
End Property
Property Let DateFin(value As Date)
    m_DatFin = value
End Property
et...

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub essaiAffaire()
    Dim UneAffaire As Affaire, rep
    Set UneAffaire = New Affaire
    UneAffaire.ID = 75
    UneAffaire.DateDeb = #12/13/2007#
    UneAffaire.ReferenceAffaire = "2007 12 S1"
    UneAffaire.DateFin = #12/13/2007#
    UneAffaire.LibelleAffaire = "loc Scooter"
    MsgBox UneAffaire.ReferenceAffaire & vbCrLf & UneAffaire.ID & vbCrLf & UneAffaire.DateDeb & vbCrLf & UneAffaire.DateFin & vbCrLf & UneAffaire.LibelleAffaire
    Set UneAffaire = Nothing
End Sub
Ric500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 12h52   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Bonjour,

Il peut être également intéressant (envisageable) d'utiliser des structures (Type).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Type g_tyAffaire
    AffaireId As Long
    AffaireDateDeb As Date
    AffaireReference As String
    AffaireDateFin As Date
    AffaireLibelle As String
    CA As Currency
End Type
 
Private Function NouvelleAffaire(ByVal ID As Long) As Boolean
Dim tNouvAffaire As g_tyAffaire
 
    With tNouvAffaire
        .AffaireId = ID
        .AffaireReference = "2007 12 S1"
        .AffaireDateDeb = #12/13/2007#
        .AffaireDateFin = #12/13/2007#
        .AffaireLibelle = "loc Scooter"
        CA = QuelChiffreAffaire(ID)
    End With
    [...]
End Function
De ma vision des choses, je pense que ton idée est bonne mais pas forcément justifiée - je parle de la complexité à laquelle tu t'exposeras avec l'usage de classes - dans le sens où cela ne t'apportera pas forcément un plus d'un point de vue consultation, mise à jour de données.

Mais ça peut être un truc intéressant ; le problème c'est que ce que tu vas mettre en place sera pas ou peu portable du fait que cela sera propriétaire (d'un point de vus sujet traité) ; or, par définition, la POO est faîte pour être réutilisable et donc générique.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 14h18   #3
Membre actif
 
Avatar de Ric500
 
Homme Richard
Ingénieur développement logiciels
Inscription : août 2004
Messages : 166
Détails du profil
Informations personnelles :
Nom : Homme Richard
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : août 2004
Messages : 166
Points : 157
Points : 157
Merci argyronet de ta réponse rapide.

Je tiens compte de tes remarques mais je me suis mal exprimé: l'idée de base était d'avoir un property get d'un ID (IDAffaire) et de dire dans mon code:

Après déclaration de la nouvelle affaire :

et de pouvoir avoir à dispo des propriétés du genre:

Code :
Debug.print MonAffaire.CA
Et des méthodes style:

ou

Le problème c'est que j'ai du mal à concevoir le passage du paramètre ID dans le module de classe. Cela dit tu as peut-être raison en disant que tout çà çà n'est qu'une nouvelle manière (plus complexe) d'avoir ce que j'ai déjà dans des fonctions classiques. Je me voyais déjà comparant des trucs comme:

Code :
Si Affaire1.CA<Affaire2.CA Alors ...
ou

Code :
Si Affaire.Facturée Alors affaire.Cloture
Ric500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 16h18   #4
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Oui effectivement vu comme ça... Bon voici un exemple :
Dans un module, tu colles :
Code :
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
Option Compare Database
Option Explicit
 
Public cAffaire                                             As clsAffaires
 
Public Enum m_eStatut
    EstEnCours = 1                                             'En cours
    EstClos = 2                                                'Clôturé
    EstAnnule = 3                                              'Annulé
End Enum
 
Public Type g_tyAffaire
    IDAffaire                                                   As Long
    DateDeb                                                 As Date
    Reference                                               As String
    DateFin                                                 As Date
    Libelle                                                 As String
    Statut                                                  As m_eStatut
End Type
 
 
 
Private Sub TestPourVoir()
Dim tAffaire                                                As g_tyAffaire
Dim vntCA                                                   As String
Dim SQL                                                     As String
Dim lngAffaireSupprimee                                     As Long
 
    lngAffaireSupprimee = 45
    Set cAffaire = New clsAffaires
 
    With tAffaire
        .IDAffaire = 47
        .Reference = "2007 12 S1"
        .DateDeb = #12/13/2011#
        .DateFin = #12/13/2011#
        .Libelle = "location Scooter"
        .Statut = EstAnnule
    End With
 
    With cAffaire
        If .NouvelleAffaire(tAffaire) = False Then
            Err.Raise 3032, "Création échouée", "L'affaire '" & tAffaire.IDAffaire & "' n'a pas pu être créée !"
        End If
        'On simule un CA
        vntCA = InputBox("Quel CA pour l'affaire #" & tAffaire.IDAffaire & " ?", "CA")
        If Len(vntCA) And IsNumeric(vntCA) Then
            SQL = "INSERT INTO tblCAAffaires (IDAffaire, CA) VALUES (" & tAffaire.IDAffaire & ", " & vntCA & ")"
            CurrentDb.Execute SQL, dbFailOnError
        End If
        'On affiche le CA
        MsgBox "Le CA de l'affaire #" & tAffaire.IDAffaire & " est de " & Format(cAffaire.ChiffreDAffaire(tAffaire.IDAffaire), "Currency")
        'On supprime une autre affaire
        If .AnnulerAffaire(lngAffaireSupprimee) Then
            MsgBox "Cette affaire n°" & lngAffaireSupprimee & " est bien annulée !", vbExclamation
        End If
    End With
    Set cAffaire = Nothing
End Sub
Dans une classe, tu colles :
Code :
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Option Compare Database
Option Explicit
 
Private m_cChiffreDAffaire                                  As Currency
 
Public Function NouvelleAffaire(ByRef Affaire As g_tyAffaire) As Boolean
Dim oRS                                                     As DAO.Recordset
Dim SQL                                                     As String
Dim blnAffaireExiste                                        As Boolean
 
    On Error GoTo L_ErrNouvelleAffaire
 
    SQL = "SELECT * FROM tblAffaires WHERE IDAffaire =" & Affaire.IDAffaire & ";"
    Set oRS = CurrentDb.OpenRecordset(SQL, 2)
    With oRS
        blnAffaireExiste = Not (.EOF)
        If blnAffaireExiste Then
            .Edit
        Else
            .AddNew
        End If
        .Fields("IDAffaire").Value = Affaire.IDAffaire
        .Fields("DateDeb").Value = Affaire.DateDeb
        .Fields("DateFin").Value = Affaire.DateFin
        .Fields("Libelle").Value = Affaire.Libelle
        .Fields("Reference").Value = Affaire.Reference
        .Fields("IDStatut").Value = Affaire.Statut
        .Update
        .Close
    End With
    NouvelleAffaire = True
    On Error GoTo 0
L_ExNouvelleAffaire:
    Set oRS = Nothing
    Exit Function
 
L_ErrNouvelleAffaire:
    NouvelleAffaire = False
    Resume L_ExNouvelleAffaire
End Function
 
Private Function GetValueFromTable(ByVal KeyName As String, ByVal Value As Long, ByVal Table As String, ByVal FieldIndex As Integer) As Variant
'Envisager un GROUP BY en plus... Là c'est pour le fun
Dim oRS                                                     As DAO.Recordset
Dim SQL                                                     As String
    SQL = "SELECT * FROM [" & Table & "] WHERE [" & KeyName & "] = " & Value & ";"
    Set oRS = CurrentDb.OpenRecordset(SQL, 2)
    With oRS
        If Not (.EOF) Then
            GetValueFromTable = .Fields(FieldIndex).Value
        Else
            GetValueFromTable = Null
        End If
        .Close
    End With
    Set oRS = Nothing
End Function
 
Public Property Get ChiffreDAffaire(ByVal IDAffaire As Long) As Currency
Dim vntValue As Variant
    vntValue = Nz(GetValueFromTable("IDAffaire", IDAffaire, "tblCAAffaires", 2), 0)
    m_cChiffreDAffaire = CCur(vntValue)
    ChiffreDAffaire = m_cChiffreDAffaire
End Property
 
Public Property Let ChiffreDAffaire(ByVal IDAffaire As Long, ByVal cChiffreDAffaire As Currency)
    m_cChiffreDAffaire = cChiffreDAffaire
End Property
 
Public Function AnnulerAffaire(ByVal IDAffaire As Long) As Boolean
'Prévoir un retour de l'erreur pour un usgae externe
Dim oRS                                                     As DAO.Recordset
Dim SQL                                                     As String
    On Error GoTo L_ErrAnnulerAffaire
 
    SQL = "UPDATE tblAffaires SET IDStatut = " & EstAnnule & ";"
    CurrentDb.Execute SQL, dbFailOnError
    SQL = "DELETE * FROM tblCAAffaires WHERE IDAffaire = " & IDAffaire & ";"
    CurrentDb.Execute SQL, dbFailOnError
    AnnulerAffaire = True
 
    On Error GoTo 0
L_ExAnnulerAffaire:
    Exit Function
 
L_ErrAnnulerAffaire:
    AnnulerAffaire = False
    '''ErrDescription = Err.Description & "|" & Err.Number
    Resume L_ExAnnulerAffaire
End Function
Tu créés les tables :
tblAffaires avec les champ d de l'instruction Type (voir code)
tblCAAffaires avec les champs IDAffaire(Long) et CA(Monnaie)
tblStatut avec les champs IDStatut(Long) et Statut(Texte) et les valeurs 1, 2 et 3 respectivement pour En cours, Clôturé et Annulé

En espérant que cela t'aide dans ton projet...

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 17h19   #5
Membre actif
 
Avatar de Ric500
 
Homme Richard
Ingénieur développement logiciels
Inscription : août 2004
Messages : 166
Détails du profil
Informations personnelles :
Nom : Homme Richard
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : août 2004
Messages : 166
Points : 157
Points : 157
Re-Bonjour Argy!

Effectivement, j'ai réussi à "bidouiller" un truc équivalent en créant un module de classe "Affaire" qui contient:


Code :
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
Option Compare Database
Option Explicit
 
Private ReferenceAffaire As String
Private LibelleAffaire As String
Private DatDeb As Date
Private DatFin As Date
Private IDduContact As String
Private CA As Currency
Public Function LoadAffaire(LID As Long)
    Dim rs As dao.Recordset
    Dim StrSQL As String
    LoadAffaire = False
    StrSQL = "SELECT* FROM REF_AFF WHERE AUnik=" & LID & ";"
    Set rs = CurrentDb().OpenRecordset(StrSQL, dbOpenForwardOnly)
    With rs
        If .RecordCount = 0 Then
            MsgBox ("Pas d'affaire existante...")
            GoTo Fin
        End If
        ReferenceAffaire = !ANumAff
        LibelleAffaire = !ALibAff
        DatDeb = !ADatDeb
        DatFin = !ADatFin
        IDduContact = IDContact_02(!IDunik)    'Fonction donnant le nom du client dans la table clients à partir de son UDUnik
        CA = CalculCAAff(LID)                           'Fonction Calculant le CA d'une Affaire
        .Close
    End With
    Set rs = Nothing
    LoadAffaire = True
Fin:
    Exit Function
 
End Function
testé depuis un Sub dans un module:

Code :
1
2
3
4
5
6
Sub essaiAffaire2()
    Dim UneAffaire As Affaire, rep
    Set UneAffaire = New Affaire
    rep = UneAffaire.LoadAffaire(230)
    Stop
End Sub
çà donne dans la fenêtre des variables locales:

UneAffaire
CA 15536.89
Datdeb #29/06/2008#
DatFin #14/08/2008#
IDduContact "KRAMER Terry Allen : ALLEN COMPANY"
LibelleAffaire "Ca"
ReferenceAffaire "2008 01 L13"


C'est exactement ce que je voulais!!! Merci argy tu m'as mis sur la piste...
Ric500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h49.


 
 
 
 
Partenaires

Hébergement Web