添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
VBA中ListView应用2(对数据库增删改)

VBA中ListView应用2(对数据库增删改)

纪念从零开始2个月学VBA的成果。

本文主要涉及:

  • VBA 类模块
  • MySQL 增删改
  • ListView 事件

上文使用VBA编写了一个查询MySQL的数据,并用ListView显示的小窗口。

现在提出新的需求:通过ListView对MySQL数据进行增删改,效果如下:

通过ListView的双击事件,调出增删改子窗体。因此需要做两个子窗体

  1. 添加型号和业绩窗口
  2. 设计窗体的样式,窗体中除了型号编号和业绩编号,其他的字段都需要有,并且要将TextBox的名称修改成相对于的字段名。(因为型号编号和业绩编号需要计算得出)
  3. 在子窗体中,型号编号,合同编号不允许编辑,将Enabled属性设置成False

可以把相同的功能写成方法,然后在两个窗体中进行调用。两个窗体中有相同的增删改功能,只是操作的数据库不一样。

新增方法:

'在类模块编写新增方法
Sub 新增(Select_Sql, 数据表$, 字典, 窗体, Add_List)
    '将新增的数据写入数据库
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim data As New MySQL
    Dim sql$
    Dim 自动编号%
    conn.Open data.模拟数据
    rst.Open Select_Sql, conn
    自动编号 = rst.Fields("编号") + 1 '自动计算型号编号
    '使用循环编写SQL语句
    sql = "Insert into " & 数据表 & " values ('" & 自动编号 & "','"
    For Each D In 字典.keys
        sql = sql & 窗体.Controls(D) & "','"
    sql = Left(sql, Len(sql) - 2) & ")"
    conn.Execute sql    '执行SQL语句
    conn.Close: Set conn = Nothing
    '将将新增的数据写入ListView
    With Add_List.ListItems.Add()
        .Text = 自动编号
        x = 0
        For Each D In 字典.keys
            x = x + 1
            .SubItems(x) = 窗体.Controls(D)
    End With
End Sub

修改方法:

'在类模块编写修改方法
Sub 修改(数据表$, 字典, 窗体, 关键字段, Selcte_List)
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim data As New MySQL
    Dim sql$
    conn.Open data.模拟数据
    '使用循环编写SQL语句
    sql = "UPDATE " & 数据表 & " SET "
    For Each D In 字典.keys
        sql = sql & D & "= '" & 窗体.Controls(D) & "',"
    sql = Left(sql, Len(sql) - 1)
    sql = sql & " WHERE  " & 关键字段 & "= '" & Selcte_List.SelectedItem.Text & "'"
    'MsgBox sql
    conn.Execute sql    '执行SQL语句
    conn.Close: Set conn = Nothing
    '将将新增的数据写入ListView
    With Selcte_List.SelectedItem
        x = 0
        For Each D In 字典.keys
            x = x + 1
            .SubItems(x) = 窗体.Controls(D)
    End With
End Sub

删除方法

'在类模块编写删除方法
Sub 删除(数据表$, 关键字段$, Selcte_List)
    Dim conn As New ADODB.Connection
    Dim data As New MySQL
    Dim sql$
    conn.Open data.模拟数据
    On Error Resume Next
    sql = "DELETE FROM " & 数据表 & " WHERE " & 关键字段 & " = '" & Selcte_List.SelectedItem.Text & "'"
    'MsgBox sql
    conn.Execute sql
    Selcte_List.ListItems.Remove Selcte_List.SelectedItem.Index
    conn.Close: Set conn = Nothing
    Unload Me
End Sub

将这三个方法放在类模块中:

ps: 其实写方法很简单,先在两个窗口分别写增删改,然后对比两者的区别,将代码中不同的地方用变量代替。

在型号窗体中调用方法:

在业绩窗口中调用方法:

把子窗体写完后,在回到主窗体,对ListView2和ListView3添加双击事件。

双击事件的执行程序的一样的,都是双击之后,在调出对应的子窗体.show,并在子窗体中显示选中行的对应信息。

相同的执行程序,也写成带有变量的过程,然后在调用的时候写入对应的参数即可

Private Sub ListView2_DblClick()
    'listView2双击事件
    On Error Resume Next
    获取选中行资料 ListView2, B型号, Dic_型号
End Sub
Private Sub ListView3_DblClick()
    'listView3双击事件
    On Error Resume Next
    获取选中行资料 ListView3, C业绩, Dic_业绩
End Sub
Sub 获取选中行资料(表, 窗体, 字典)
    Dim Lst
    Set Lst = 表.SelectedItem    '将对象赋值给变量
    With 窗体
        If 表.ListItems.Count > 0 Then   '判断表如果不为空,则在将选中的行资料写入指定窗体
            x = 0
            For Each D In 字典.keys
                x = x + 1
                .Controls(D) = Lst.SubItems(x)
        End If