Access
 sql >> Base de données >  >> RDS >> Access

Transformation de fonctionnalité de classe wrapper

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.

  1. 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.
  2. 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.

  1. Ouvrez votre base de données et affichez la fenêtre d'édition VBA (Alt + F11).
  2. Sélectionnez le module de cours de Insérer Menu, pour insérer un nouveau module de cours.
  3. Modifier la valeur de la propriété Nom du module de classe de Class1 à ClsSales .
  4. 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.

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

  2. Gardez la fenêtre de débogage ouverte (Ctrl + G).
  3. 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.
  4. 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.

  1. Module de classe MS-Access et VBA
  2. Tableaux d'objets de classe MS-Access VBA
  3. Classe de base MS-Access et objets dérivés
  4. Classe de base VBA et objets dérivés-2
  5. Classe de base et variantes d'objets dérivés
  6. Ensemble d'enregistrements et module de classe MS-Access
  7. Accéder au module de classe et aux classes wrapper
  8. Transformation des fonctionnalités de la classe wrapper

OBJET DE COLLECTION.

  1. Ms-Access et les bases des objets de collection
  2. Module de classe MS-Access et objet de collection
  3. Enregistrements de table dans l'objet et le formulaire de collection

OBJET DE DICTIONNAIRE.

  1. Principes de base des objets de dictionnaire
  2. Principes de base des objets de dictionnaire-2
  3. Tri des clés d'objet et des éléments du dictionnaire
  4. Afficher les enregistrements du dictionnaire au formulaire
  5. Ajouter des objets de classe en tant qu'éléments de dictionnaire
  6. Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire