Audit System 日记:Method Chaining

Aus 项目结束之后,终于有时间重新折腾 Audit System。这次的思路是完全改变了,基于 Excel VBA OOP 进行开发。

2 月底的时候有写过一点基础框架的代码,不过那个时候是基于过程去写的,各种 function 各种 sub,思路很乱。这周五重新 review 的时候,突然在想,为什么不基于 OOP 进行开发?这样可以干净整洁。

首先,每个表必须有 ID 字段做主键。

然后,不管是 pull、update、delete、insert,都是通过 ID 去操作。这样就可以避免做很多复杂的条件判断。即便要做条件判断,也可以基于 Excel 自身去做,不需要涉及到数据库。

OK,思路有了,然后就是尝试去实现。

我要做的东西,就是从某个 Table 取数据,有两种取法:

  1. 取指定列的所有数据。
  2. 对于指定列,只取指定行(即指定 ID)的数据。

指定列很简单,直接取表头第一行就行:

Col = Activesheet.Cells(1, 1)

If IsEmpty(Col) = False Then

    TotalColumns = Activesheet.Cells(1, 1).End(xlToRight).Column

End If

ColumnNames = ""

For i = 1 To TotalColumns

    If i <> TotalColumns Then
        
        ColumnNames = ColumnNames & Activesheet.Cells(1, i) & ", "
        
    Else
        
        ColumnNames = ColumnNames & Activesheet.Cells(1, i)
        
    End If

Next i

If ColumnNames = "" Then

    ErrorMsg (1)
    
End If

指定区域就稍微有所不同了:

ColumnNames = ""

For Each Cell In Selection.Columns

    ColumnNames = ColumnNames & Cells(1, Cell.Column).Value & ", "

Next Cell

ColumnNames = Left(ColumnNames, Len(ColumnNames) - 2)

If ColumnNames = "" Then

    ErrorMsg (1)
    
End If

Lines = ""

For Each Cell In Selection.Rows

    Lines = Lines & Cell.Row - 1 & ", "

Next Cell

Lines = Left(Lines, Len(Lines) - 2)

然后我希望通过一个比较 elegant 的形式,把这些东西串联起来:

Dim Table As New CTable

SQL = Table.GetColumns.Selected.SQL

建立一个 Table Class,它在被建立的时候,会自动读取表名,表名就是 Worksheet 的名字:

Public Property Get Name() As String

    Name = Activesheet.Name

End Property

然后,进入到下一个 Class,GetColumns,获取列名,有两种 Method,一种是获取指定列的所有数据(All),一种是获取指定列在指定 ID 中的数据(Selected)。

最后输出 SQL,默认按 ID ASC 排序。

这里主要涉及到怎么去做 Method Chaining,研究了很久,才基本弄明白整个思路。

其实不通过 Method Chaining 也是可以做到的,要么分成很多个 sub,然后分别一步步执行,要么是写成一个复杂函数,往里面添各种参数。但显然对比起来,Method Chaining 明显是高大上很多的。

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.