Présentation.
La semaine dernière, nous avons créé une nouvelle classe Wrapper ClsTiles, en utilisant deux fois la classe ClsArea dans le nouveau module de classe, une instance pour Floor valeurs de dimension et la deuxième instance pour Floor-Tile dimension, pour calculer le nombre de Tiles pour la pièce.
Dans le nouveau module de classe Wrapper, nous allons transformer la classe Volume (ClsVolume2) en classe Sales (ClsSales). Avec quelques changements cosmétiques, nous allons lui donner un lifting total dans la classe Wrapper, cachant sa véritable identité en tant que classe de calcul de volume et l'utiliser pour calculer le prix de vente des produits avec remise.
C'est vrai, notre classe ClsVolume2 possède toutes les propriétés nécessaires pour entrer les valeurs de données de vente requises telles que la description, la quantité, le prix unitaire et le pourcentage de remise, qui iront respectivement dans les propriétés de la classe de volume strDesc, dblLength, dblWidth, dblHeight.
Il ne faut pas oublier que la classe ClsVolume2 est une classe dérivée , construit en utilisant ClsArea comme classe de base.
Classe ClsVolume2 revisitée.
Mais, tout d'abord, le code VBA du module de classe ClsVolume2 (la classe de base de notre nouveau module de classe ClsSales) est reproduit ci-dessous à titre de référence :
Option Compare Database Option Explicit Private p_Height As Double Private p_Area As ClsArea Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) p_Height = dblNewValue End Property Public Function Volume() As Double Volume = CArea.dblLength * CArea.dblWidth * Me.dblHeight End Function Public Property Get CArea() As ClsArea Set CArea = p_Area End Property Public Property Set CArea(ByRef AreaValue As ClsArea) Set p_Area = AreaValue End Property Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub
Le seul problème qui nous empêche d'utiliser la classe ClsVolume2 directement pour les Sales l'entrée de données est que les noms de procédure de propriété dblLength, dblWidth, dblHeight ne correspondent pas aux valeurs de propriété Sales Quantity, UnitPrice, Discount Percentage. Les types de données numériques de la classe ClsVolume2 sont tous des nombres à double précision et ils conviennent à notre classe Sales et peuvent être utilisés sans changement de type de données. Les noms des fonctions publiques Area() et Volume() ne conviennent pas non plus mais leur formule de calcul peut être utilisée pour les calculs Sales sans modification.
a) Area =dblLength * dblWidth convient à TotalPrice =Quantity * UnitPrice
b) Volume =Area * dblHeight est bon pour DiscountAmount =TotalPrice * DiscountPercentage
Ici, nous avons deux choix pour utiliser la classe ClsVolume2 comme classe ClsSales.
- Le moyen le plus simple est de faire une copie de la classe ClsVolume2 et de l'enregistrer dans un nouveau module de classe avec le nom ClsSales. Apportez les modifications appropriées à la procédure de propriété et aux noms de fonction publics adaptés aux valeurs et aux calculs des ventes. Ajoutez plus de fonctions, si nécessaire, dans le nouveau module de classe.
- Créez une classe wrapper en utilisant ClsVolume2 comme classe de base et créez des procédures de propriété appropriées et des changements de nom de fonction publique, en masquant les procédures de propriété et les noms de fonction de la classe de base. Créez de nouvelles fonctions dans la classe Wrapper, si nécessaire.
La première option est assez simple et facile à mettre en œuvre. Mais, nous sélectionnerons la deuxième option pour apprendre comment traiter les propriétés de la classe de base dans la nouvelle classe wrapper et comment masquer ses noms de propriétés d'origine avec de nouveaux.
La classe ClsVolume2 transformée.
- Ouvrez votre base de données et affichez la fenêtre d'édition VBA (Alt + F11).
- Sélectionnez le module de cours de Insérer Menu, pour insérer un nouveau module de cours.
- Modifier la valeur de la propriété Nom du module de classe de Class1 à ClsSales .
- Copiez et collez le code VBA suivant dans le module et enregistrez le code :
Option Compare Database Option Explicit Private m_Sales As ClsVolume2 Private Sub Class_Initialize() 'instantiate the Base Class in Memory Set m_Sales = New ClsVolume2 End Sub Private Sub Class_Terminate() 'Clear the Base Class from Memory Set m_Sales = Nothing End Sub Public Property Get Description() As String Description = m_Sales.CArea.strDesc 'Get from Base Class End Property Public Property Let Description(ByVal strValue As String) m_Sales.CArea.strDesc = strValue ' Assign to Base Class End Property Public Property Get Quantity() As Double Quantity = m_Sales.CArea.dblLength End Property Public Property Let Quantity(ByVal dblValue As Double) If dblValue > 0 Then m_Sales.CArea.dblLength = dblValue ' Assign to clsArea, Base Class of ClsVolume2 Else MsgBox "Quantity: " & dblValue & " Invalid.", vbExclamation, "ClsSales" Do While m_Sales.CArea.dblLength <= 0 m_Sales.CArea.dblLength = InputBox("Quantity:, Valid Value >0") Loop End If End Property Public Property Get UnitPrice() As Double UnitPrice = m_Sales.CArea.dblWidth End Property Public Property Let UnitPrice(ByVal dblValue As Double) If dblValue > 0 Then m_Sales.CArea.dblWidth = dblValue ' Assign to clsArea, Base Class of ClsVolume2 Else MsgBox "UnitPrice: " & dblValue & " Invalid.", vbExclamation, "ClsSales" Do While m_Sales.CArea.dblWidth <= 0 m_Sales.CArea.dblWidth = InputBox("UnitPrice:, Valid Value >0") Loop End If End Property Public Property Get DiscountPercent() As Double DiscountPercent = m_Sales.dblHeight End Property Public Property Let DiscountPercent(ByVal dblValue As Double) ' Assign to Class .dblHeight of ClsVolume2 Select Case dblValue Case Is <= 0 MsgBox "Discount % -ve Value" & dblValue & " Invalid!", vbExclamation, "ClsSales" Do While m_Sales.dblHeight <= 0 m_Sales.dblHeight = InputBox("Discount %, Valid Value >0") Loop Case Is >= 1 m_Sales.dblHeight = dblValue / 100 Case 0.01 To 0.75 m_Sales.dblHeight = dblValue End Select End Property Public Function TotalPrice() As Double Dim Q As Double, U As Double Q = m_Sales.CArea.dblLength U = m_Sales.CArea.dblWidth If (Q * U) = 0 Then MsgBox "Quantity / UnitPrice Value(s) 0", vbExclamation, "ClsVolume" Else TotalPrice = m_Sales.CArea.Area 'Get from Base Class ClsArea End If End Function Public Function DiscountAmount() As Double DiscountAmount = TotalPrice * DiscountPercent End Function Public Function PriceAfterDiscount() PriceAfterDiscount = TotalPrice - DiscountAmount End Function
Qu'est-ce que nous avons fait dans la classe Wrapper ? Création d'une instance de la classe ClsVolume2 et modification de ses noms de propriété, noms de fonction et ajout de contrôles de validation avec des messages d'erreur appropriés et interdiction de tomber dans le contrôle de validation de la classe de base avec des messages d'erreur inappropriés, tels que 'Valeur dans dblLength la propriété n'est pas valide" peut apparaître à partir de la classe de volume.
Vérifiez les lignes que j'ai surlignées dans le code ci-dessus et j'espère que vous serez en mesure de comprendre comment les valeurs de propriété sont attribuées/récupérées vers/depuis la classe de base ClsVolume2.
Vous pouvez passer d'abord par le module de classe ClsArea et ensuite par le module de classe ClsVolume2 - la classe dérivée utilisant la classe ClsArea comme classe de base. Après avoir parcouru ces deux codes, vous pouvez revoir le code de cette classe Wrapper.
Programme de test pour la classe ClsSales dans le module standard.
Écrivons un programme de test pour tester la classe Wrapper.
- Copiez et collez le code VBA suivant dans un module standard.
Public Sub SalesTest() Dim S As ClsSales Set S = New ClsSales S.Description = "Micro Drive" S.Quantity = 12 S.UnitPrice = 25 S.DiscountPercent = 0.07 Debug.Print "Desccription", "Quantity", "UnitPrice", "Total Price", "Disc. Amt", "To Pay" With S Debug.Print .Description, .Quantity, .UnitPrice, .TotalPrice, .DiscountAmount, .PriceAfterDiscount End With End Sub
Exécutez le code.
- Gardez la fenêtre de débogage ouverte (Ctrl + G).
- Cliquez quelque part au milieu du code et appuyez sur F5 clé pour exécuter le code et imprimer la sortie dans la fenêtre de débogage.
- Vous pouvez tester davantage le code en entrant l'une des valeurs d'entrée avec un nombre négatif et en exécutant le code pour déclencher le nouveau message d'erreur. Désactivez l'une des lignes de saisie, avec un symbole de commentaire ('), exécutez le code et voyez ce qui se passe.
Calculer le prix/la remise pour une gamme de produits.
Le code de test suivant crée un tableau de trois valeurs de produits et de ventes en les saisissant directement à partir du clavier.
Copiez et collez le code suivant dans un module standard et exécutez-le pour tester davantage la classe Wrapper.
Public Sub SalesTest2() Dim S() As ClsSales Dim tmp As ClsSales Dim j As Long For j = 1 To 3 Set tmp = New ClsSales tmp.Description = InputBox(j & ") Description") tmp.Quantity = InputBox(j & ") Quantity") tmp.UnitPrice = InputBox(j & ") UnitPrice") tmp.DiscountPercent = InputBox(j & ") Discount Percentage") ReDim Preserve S(1 To j) As ClsSales Set S(j) = tmp Set tmp = Nothing Next 'Output Section Debug.Print "Desccription", "Quantity", "UnitPrice", "Total Price", "Disc. Amt", "To Pay" For j = 1 To 3 With S(j) Debug.Print .Description, .Quantity, .UnitPrice, .TotalPrice, .DiscountAmount, .PriceAfterDiscount End With Next For j = 1 To 3 Set S(j) = Nothing Next End Sub
Après la saisie réussie des valeurs correctes dans le tableau, les noms de produits et les valeurs de vente sont imprimés dans la fenêtre de débogage.
MODULES DE CLASSE.
- Module de classe MS-Access et VBA
- Tableaux d'objets de classe MS-Access VBA
- Classe de base MS-Access et objets dérivés
- Classe de base VBA et objets dérivés-2
- Classe de base et variantes d'objets dérivés
- Ensemble d'enregistrements et module de classe MS-Access
- Accéder au module de classe et aux classes wrapper
- Transformation des fonctionnalités de la classe wrapper
OBJET DE COLLECTION.
- Ms-Access et les bases des objets de collection
- Module de classe MS-Access et objet de collection
- Enregistrements de table dans l'objet et le formulaire de collection
OBJET DE DICTIONNAIRE.
- Principes de base des objets de dictionnaire
- Principes de base des objets de dictionnaire-2
- Tri des clés d'objet et des éléments du dictionnaire
- Afficher les enregistrements du dictionnaire au formulaire
- Ajouter des objets de classe en tant qu'éléments de dictionnaire
- Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire