generalquery.cls

来自「通用书店管理系统」· CLS 代码 · 共 271 行

CLS
271
字号
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "GeneralQuery"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private gConnection As ADODB.Connection                   '定义一个工作数据库连接

Private arrHeader  As Variant                       '存放表列头
Private strHeaderMerge As String                    '列头合并处理
Private arrDataFields  As Variant                   '存放数据字段
Private arrDataFieldsType As Variant                '存放数据字段的数据类型
Private strFromObjects As String                    '存放表对象
Private strSQLGroupOrder As String                  'SQL中进行分组或排序

Private arrDisplayFields As Variant                 '存放查询交互显示字段
Private arrInnerFields As Variant                   '存放查询数据字段
Private arrInnerFieldsType As Variant               '存放查询数据字段数据类型

Private strConstCondition As String                 '存放常量查询条件

Private strReturnSQL As String                      '存放返回SQL语句
Private rstReturnRecordsets As ADODB.Recordset      '存放返回数据记录集

Private strGeneralCondition As String               '存放常用查询生成的条件语句

Private defPrintInfo As New DefinePrintInfo             '定义打印信息

Private arrGroup As Variant                             '分组
Private arrResizeColWidth As Variant                    '自动列宽缩放
Private arrResizeRowHeight As Variant                   '自动行高缩放
Private arrSort As Variant                              '排序
Private arrSubtotal As Variant                          '汇总

Private blnOnlyShowNormal As Boolean    '设置是否只显示Normal窗体

'设置打印信息
Public Property Set PrintInfo(ByVal vNewValue As DefinePrintInfo)
    Set defPrintInfo = vNewValue
End Property

'设置列头合并串
Public Property Let HeaderMerge(ByVal vNewValue As String)
    strHeaderMerge = vNewValue
End Property

'得到一个数据库连接
Public Property Get Connection() As ADODB.Connection
    Set Connection = gConnection
End Property

'设置一个数据库连接
Public Property Set Connection(ByVal vNewValue As ADODB.Connection)
    Set gConnection = vNewValue
End Property

'设置表列头
Public Property Let Header(ByVal vNewValue As Variant)
    arrHeader = vNewValue
End Property

'设置数据字段
Public Property Let DataFields(ByVal vNewValue As Variant)
    arrDataFields = vNewValue
End Property

'设置字段数据类型
Public Property Let DataFieldsType(ByVal vNewValue As Variant)
    arrDataFieldsType = vNewValue
End Property

'设置表对象
Public Property Let FromObjects(ByVal vNewValue As String)
    strFromObjects = vNewValue
End Property

'设置可视用户操作字段
Public Property Let DisplayFields(ByVal vNewValue As Variant)
    arrDisplayFields = vNewValue
End Property

'设置内部用户操作字段
Public Property Let InnerFields(ByVal vNewValue As Variant)
    arrInnerFields = vNewValue
End Property

'设置内部用户字段数据类型
Public Property Let InnerFieldsType(ByVal vNewValue As Variant)
    arrInnerFieldsType = vNewValue
End Property


'设置固定条件
Public Property Let ConstCondition(ByVal vNewValue As String)
    strConstCondition = vNewValue
End Property

'调用常用查询窗体方法
Public Function ShowGeneralQuery(ByVal AdvancedQuery As Boolean) As Boolean
    Dim frm As New frmGeneralQuery
    
    With frm
        .arrDisplayFields = arrDisplayFields
        .arrInnerFields = arrInnerFields
        .arrInnerFieldsType = arrInnerFieldsType
        .strFromObjects = strFromObjects
        
        If blnOnlyShowNormal Then .cmdAdvanced.Visible = False
        
        Set .gConnection = gConnection
        .Show vbModal
    End With
    
    If frm.blnOK Then
        strGeneralCondition = frm.GeneralCondition
        Call ShowQueryResult    '显示结果
        
    ElseIf frm.blnCallAdvanced Then
        Call ShowAdvancedQuery  '调用高级查询
    End If
    
    Set frm = Nothing
    ShowGeneralQuery = True
End Function

'调用高级查询方法
Private Function ShowAdvancedQuery()
    Dim aq As New AdvancedQuery
    With aq
        Set aq.Connection = gConnection
        .Header = arrHeader
        .DataFields = arrDataFields
        .DataFieldsType = arrDataFieldsType
        .FromObjects = strFromObjects
        .SQLGroupOrder = strSQLGroupOrder
        .ConstCondition = strConstCondition
        .DisplayFields = arrDisplayFields
        .InnerFields = arrInnerFields
        .InnerFieldsType = arrInnerFieldsType
        .HeaderMerge = strHeaderMerge
        
        .Group = arrGroup
        .Sort = arrSort
        .ResizeColWidth = arrResizeColWidth
        .ResizeRowHeight = arrResizeRowHeight
        .Subtotal = arrSubtotal
            
    Set .PrintInfo = defPrintInfo
        .ShowAdvancedQuery
    End With
        
    Set aq = Nothing
    
End Function

'调用显示查询结果方法
Private Function ShowQueryResult()
    
    Dim rstWork As New ADODB.Recordset
    strReturnSQL = ReturnResultSQL(arrHeader, arrDataFields, strFromObjects, strGeneralCondition, strConstCondition)
    Set rstReturnRecordsets = New ADODB.Recordset
    rstReturnRecordsets.Open strReturnSQL, gConnection, adOpenKeyset, adLockBatchOptimistic
    Set rstWork = rstReturnRecordsets
    
    Dim qr As New QueryResult
    If rstWork.RecordCount > 0 Then qr.InputArray = rstWork.GetRows
    
    With qr
        
        .Header = arrHeader
        .HeaderMerge = strHeaderMerge
        .DataFieldsType = arrDataFieldsType
        
        .arrGroup = arrGroup
        .arrResizeColWidth = arrResizeColWidth
        .arrResizeRowHeight = arrResizeRowHeight
        .arrSort = arrSort
        .arrSubtotal = arrSubtotal
        
        .ShowQueryResult
        
    End With
    
    Set rstWork = Nothing
End Function

'得到SQL结果
Public Property Get ReturnSQL() As String
    ReturnSQL = strReturnSQL
End Property

'得到结果记录集
Public Property Get ReturnRecordsets() As ADODB.Recordset
    Set ReturnRecordsets = rstReturnRecordsets
End Property

'得到相应的结果语句
Private Function ReturnResultSQL(arrHeader As Variant, arrDataFields As Variant, strFromObjects As String, strCondition As String, strConstCondition As String)
     
     Dim i%, tmp$, tmpHeader$, tmpCondition$
     '给字段名加上别名
     
     For i = 0 To UBound(arrHeader)
        tmpHeader = Trim(arrHeader(i))
        tmpHeader = "'" & Replace(tmpHeader, "'", "''") & "'"
        tmp = tmp & arrDataFields(i) & " AS " & tmpHeader & ","
     Next i
     If Trim(tmp) <> "" Then tmp = Left(tmp, Len(tmp) - 1)
     
     '追加表对象
     tmp = "SELECT " & tmp & " FROM " & strFromObjects
     '追加条件
     If Trim(strCondition) <> "" Then tmpCondition = tmpCondition & " WHERE " & strCondition
     If Trim(tmpCondition) <> "" Then
        If Trim(strConstCondition) <> "" Then
            tmpCondition = tmpCondition & " AND " & strConstCondition
        End If
     Else
        If Trim(strConstCondition) <> "" Then _
            tmpCondition = " WHERE " & strConstCondition
     End If
     tmp = tmp & tmpCondition
     
     '追加分组和排序
     tmp = tmp & " " & strSQLGroupOrder
     
     ReturnResultSQL = tmp
End Function

'预处理属性
Public Property Let Group(ByVal vNewValue As Variant)
    arrGroup = vNewValue
End Property
Public Property Let ResizeColWidth(ByVal vNewValue As Variant)
    arrResizeColWidth = vNewValue
End Property
Public Property Let ResizeRowHeight(ByVal vNewValue As Variant)
    arrResizeRowHeight = vNewValue
End Property
Public Property Let Sort(ByVal vNewValue As Variant)
    arrSort = vNewValue
End Property
Public Property Let Subtotal(ByVal vNewValue As Variant)
    arrSubtotal = vNewValue
End Property

'SQL中进行分组或排序--读取
Public Property Get SQLGroupOrder() As Variant
    SQLGroupOrder = strSQLGroupOrder
End Property

'SQL中进行分组或排序--设置
Public Property Let SQLGroupOrder(ByVal vNewValue As Variant)
    strSQLGroupOrder = vNewValue
End Property

'设置只显示Normal窗体
Public Property Let OnlyShowNormal(ByVal vNewValue As Boolean)
     blnOnlyShowNormal = vNewValue
End Property

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?