sql >> データベース >  >> RDS >> Access

ラッパークラスの機能変換

    はじめに。

    先週、新しいクラスモジュールでClsAreaクラスを2回使用して、新しいラッパークラスClsTilesを作成しました。1つは Floor 寸法値、および床タイルの2番目のインスタンス 寸法、部屋のタイル数を計算します。

    新しいラッパークラスモジュールでは、ボリュームクラス(ClsVolume2)をセールス(ClsSales)クラスに変換します。いくつかの外観上の変更を加えて、ラッパークラスで全体的なフェイスリフトを行い、ボリューム計算クラスとしての真のアイデンティティを隠し、割引付きの製品の販売価格の計算に使用します。

    そうです、ClsVolume2クラスには、説明、数量、単価、割引率などの必要な販売データ値を入力するために必要なすべてのプロパティがあり、それぞれボリュームクラスのプロパティstrDesc、dblLength、dblWidth、dblHeightに入力されます。

    ClsVolume2クラスが派生クラスであることを忘れてはなりません。 、基本クラスとしてClsAreaを使用して構築されています。

    ClsVolume2クラスの再訪問

    ただし、最初に、ClsVolume2クラスモジュール(新しいClsSalesクラスモジュールの基本クラス)のVBAコードを参照用に以下に複製します。

    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
    

    販売にClsVolume2クラスを直接使用できない唯一の問題 データ入力は、プロパティプロシージャ名dblLength、dblWidth、dblHeightがSalesプロパティ値Quantity、UnitPrice、DiscountPercentageと一致しないことです。 ClsVolume2クラスの数値データ型はすべて倍精度の数値であり、セールスクラスに適しており、データ型を変更せずに使用できます。パブリック関数Area()およびVolume()の名前も適切ではありませんが、それらの計算式は変更なしで売上計算に使用できます。

    a)面積=dblLength*dblWidthはTotalPrice=数量*UnitPrice

    に適しています

    b)ボリューム=面積*dblHeightはDiscountAmount=TotalPrice * DiscountPercentage

    に適しています

    ここでは、ClsVolume2クラスをClsSalesクラスとして使用するための2つの選択肢があります。

    1. 最も簡単な方法は、ClsVolume2クラスのコピーを作成し、それをClsSalesという名前の新しいクラスモジュールに保存することです。販売額と計算に適したプロパティプロシージャとパブリック関数名に適切な変更を加えます。必要に応じて、新しいクラスモジュールに関数を追加します。
    2. ClsVolume2を基本クラスとして使用してラッパークラスを作成し、適切なプロパティプロシージャとパブリック関数名の変更を作成して、基本クラスのプロパティプロシージャと関数名をマスクします。必要に応じて、ラッパークラスに新しい関数を作成します。

    最初のオプションはやや単純で、実装が簡単です。ただし、2番目のオプションを選択して、新しいラッパークラスで基本クラスのプロパティをアドレス指定する方法と、元のプロパティ名を新しいプロパティ名でマスクする方法を学習します。

    変換されたClsVolume2クラス。

    1. データベースを開き、VBA編集ウィンドウ(Alt + F11)を表示します。
    2. クラスモジュールを選択します 挿入から メニュー、新しいクラスモジュールを挿入します。
    3. クラスモジュールのNameプロパティの値をClass1からClsSalesに変更します 。
    4. 次のVBAコードをコピーしてモジュールに貼り付け、コードを保存します。
      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
       

    ラッパークラスで何をしましたか? ClsVolume2クラスのインスタンスを作成し、そのプロパティ名、関数名を変更し、適切なエラーメッセージを含む検証チェックを追加し、「dblLength プロパティが無効です'ボリュームクラスからポップアップする場合があります。

    上記のコードで強調表示した行を確認してください。プロパティ値が基本クラスClsVolume2との間でどのように割り当て/取得されるかを理解できることを願っています。

    ClsAreaクラスモジュールを最初に、次にClsVolume2クラスモジュール(基本クラスとしてClsAreaクラスを使用する派生クラス)を通過することができます。これらの両方のコードを確認した後、このラッパークラスのコードをもう一度確認できます。

    標準モジュールのClsSalesクラスのテストプログラム。

    ラッパークラスを試すためのテストプログラムを作成しましょう。

    1. 次のVBAコードをコピーして標準モジュールに貼り付けます。
      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

      コードを実行します。

    2. デバッグウィンドウを開いたままにします(Ctrl + G)。
    3. コードの途中をクリックして、 F5を押します。 キーを押してコードを実行し、デバッグウィンドウに出力を出力します。
    4. 負の数で入力値を入力し、コードを実行して新しいエラーメッセージをトリガーすることにより、コードをさらにテストできます。コメント記号(')を使用して入力行を無効にし、コードを実行して、何が起こるかを確認します。

    一連の製品の価格/割引を計算します。

    次のテストコードは、キーボードから直接入力して、3つの製品と販売値の配列を作成します。

    次のコードをコピーして標準モジュールに貼り付け、実行してラッパークラスをさらにテストします。

    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
    

    アレイに正しい値が正常に入力されると、製品名と売上値がデバッグウィンドウに出力されます。

    クラスモジュール。

    1. MS-AccessクラスモジュールとVBA
    2. MS-AccessVBAクラスオブジェクト配列
    3. MS-Accessの基本クラスと派生オブジェクト
    4. VBA基本クラスと派生オブジェクト-2
    5. 基本クラスと派生オブジェクトのバリアント
    6. Ms-Accessレコードセットとクラスモジュール
    7. アクセスクラスモジュールとラッパークラス
    8. ラッパークラスの機能変換

    コレクションオブジェクト。

    1. Ms-Accessおよびコレクションオブジェクトの基本
    2. Ms-Accessクラスモジュールとコレクションオブジェクト
    3. コレクションオブジェクトとフォームのテーブルレコード

    辞書オブジェクト。

    1. 辞書オブジェクトの基本
    2. 辞書オブジェクトの基本-2
    3. 辞書オブジェクトのキーとアイテムの並べ替え
    4. 辞書からフォームへのレコードの表示
    5. クラスオブジェクトをディクショナリアイテムとして追加
    6. フォームのクラスオブジェクトディクショナリアイテムを更新する

    1. SQLite Strftime()関数の有効なフォーマット文字列置換

    2. MySQL:列が存在しない場合はALTER TABLE

    3. rewriteBatchedStatements=trueを使用したMySQLおよびJDBC

    4. UnicodeデータをOracleに保存する方法は?