excel-中台数据库搭建(二)


继续上次的话题,完成了新增的功能


一、第二个部分是需要完成线索分配的功能

  • 功能设计: 点击线索分配 –> 弹出弹窗 –> 选择分配数据类型 –> 选择分配数量 –> 选择查询方式 –> 选择分配人–> 更新分配时间 –> 提交数据

  • 遇到的卡点:

​ 这个部分做起来相对容易一些,主要遇到的是数据库设计的问题,access数据库没有动态生成id的功能,也没有事务,表的设计最初想的麻烦了,想分成很多个表,然后根据情况调取不同的表,后来发现,这个方式实在是太复杂了,放弃了,重新设计了数据库。

​ 另外就是窗体设计和代码的编辑问题,这个部分看了教程和视频,用了chatgpt就完成了。记得之前渡一的袁老师说,程序员最重要的是思路,代码并不重要,现在发现是对的,有思路就不怕不能实现。

​ 指针问题,这个问题困扰了很久,因为不想一直重复调用数据库,提交的时候,整体调用一次,结果就是这个坑,费了很久的时间。如果用完指针,一定要恢复指针的初始位置

二、具体实现:

接下来说一说具体功能的实现

  1. 窗体展示:

img

  • 窗体设计的时候有个问题,就是viewList 这个在原本的设计中并没有,需要打开这个按钮:

  • 第一步:右击空白处,点击附加控件

  • 第二步:添加附件:

img

  1. 代码–获取列表框中的默认数据

    这个部分的设计是这样的,想从设置中获取数据

    (1)先在设置中列出数据

    img

​ (2)具体代码

窗体USERFORM 中双击窗体打开代码

这个 UserForm_Initialize()很重要,是初始化数据用的

注意,如果在提交的时候没有关闭记录集,一定要把记录集的指针调到开头,很重要(在提交代码里有)

Option Explicit
Dim myArray
Dim cnn As New ADODB.connection
Dim rs As ADODB.Recordset
Dim selectedID As Long

'初始化数据

Private Sub UserForm_Initialize()
    Dim i As Integer
    Dim ws As Worksheet
    Dim dataRange As Range
    Dim dataValues As Variant
    Dim cell As Excel.Range
    
    ' 设置工作表对象
    Set ws = ThisWorkbook.Sheets("设置")
    
    ' 定义要获取数据的区域范围
    Set dataRange = ws.Range("B3:C5")

    
    ' 将数据填充到 ComboBox1
    For Each cell In dataRange.Columns(1).Cells
    
        Me.ComboBox1.AddItem cell.Value
        
    Next cell
    For Each cell In dataRange.Columns(2).Cells
    
        Me.ComboBox2.AddItem cell.Value
        
    Next cell
    
    ComboBox1.ListIndex = 0
    ComboBox2.ListIndex = 0
    
    Me.TextBox1.Enabled = False
    Me.ComboBox3.Enabled = False
    
    Set ws = Nothing
    Set dataRange = Nothing
    
End Sub
' 获取员工数据
Public Sub employ()
    Dim sql As String, rsx As ADODB.Recordset, myDate As String, sql_employ As String
    
    '获取分配人数据
    
    sql = "select id,姓名 from 销售"
    
    Set rsx = New ADODB.Recordset
    rsx.Open sql, cnn, adOpenKeyset, adLockOptimistic
    
    ComboBox3.Clear
    
    While Not rsx.EOF
        ' 将记录集中指定列的值添加到 ComboBox 中
        ComboBox3.AddItem rsx.Fields("姓名").Value & rsx.Fields("id")
        rsx.MoveNext
    Wend
    
    rsx.Close
    Set rsx = Nothing
    
End Sub
'改变combobox 获取分配人的ID

Private Sub ComboBox3_Change()
    Dim selectedName As String
    
    ' 获取选中的员工姓名
    selectedName = ComboBox3.Value
    selectedID = ComboBox3.ListIndex + 1
    'MsgBox selectedID
End Sub
' 根据选项卡调取数据
Private Sub OptionButton3_Click()
    Dim tableTitle As String
    Dim allocation As String, entry As Integer
    Dim sql As String, myDate As String
    
    If cnn.State = adStateOpen Then
        ' 关闭记录集
        rs.Close
        ' 关闭连接
        cnn.Close
        
        Set rs = Nothing
        Set cnn = Nothing
    End If
        
    
    myDate = ThisWorkbook.Path & "\中台数据库.accdb"
    
    '建立数据库连接
    With cnn
        .Provider = "Microsoft.ACE.OLEDB.16.0;"
        .Open myDate
    End With
    
    Call employ

    ReDim myArray(1 To 5) As Variant
    myArray(1) = "数据总表.id"
    myArray(2) = "数据总表.学校名称"
    myArray(3) = "数据总表.地址信息"
    myArray(4) = "数据总表.学校级别"
    myArray(5) = "数据总表.学校性质"
    tableTitle = Join(myArray, ", ") ' 构建新的列名部分
    
    '获取选框数据
    allocation = ComboBox1.ListIndex   ' 获取选中的第几个数据
    entry = ComboBox2.Value  ' 获取选中的条数
    
    Select Case allocation
        ' 获取发送快递的数据
        Case 0

            sql = "SELECT TOP " & entry & " " & tableTitle & " FROM (数据总表 " _
            & "inner JOIN 快递数据 ON 数据总表.学校名称 = 快递数据.学校名称) " _
            & "WHERE 数据总表.跟进人id = 0"
            
            Set rs = New ADODB.Recordset
            rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
            Call ListView1_data
            
            
        ' 获取所有的数据
        Case 1
            
            sql = "SELECT TOP " & entry & " " & tableTitle & " FROM 数据总表 " _
            & "LEFT JOIN 快递数据 ON 数据总表.学校名称= 快递数据.学校名称 " _
            & "WHERE 数据总表.跟进人id = 0"

            Set rs = New ADODB.Recordset
            rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
            
            Call ListView1_data
            
        '获取未发快递数据
        Case 2

            sql = "SELECT DISTINCT TOP " & entry & " " & tableTitle & " FROM 数据总表,快递数据 " _
            & "WHERE 数据总表.学校名称 <> 快递数据.学校名称 and 数据总表.跟进人id = 0 " _

            Set rs = New ADODB.Recordset
            rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
            
            Call ListView1_data
            
        Case Else
            MsgBox "其他"
    
    End Select
    Me.ComboBox3.Enabled = True
    Me.TextBox1.Value = Now
End Sub
'获取listview里的数据

Public Sub ListView1_data()
    Dim field As field, i As Long, j As Long, lvwItem As ListItem
    On Error Resume Next
    
    If rs.EOF Or rs.BOF Then
        MsgBox "Recordset is empty."
        Exit Sub
    End If
    
     ' 清除 ListView1 中的所有项
    ListView1.ListItems.Clear
    With ListView1
    
        .ColumnHeaders.Clear '清除表头
        .ListItems.Clear '清除记录
        .View = lvwReport ' 设置显示方式未报表
        .FullRowSelect = True '允许选中整行
        .Gridlines = True ' 显示网格线
        
        '循环方式为listbox1 添加标题
        For i = 0 To rs.Fields.Count - 1
            .ColumnHeaders.Add , , rs.Fields(i + 1).Name
        Next i
        
         ' 循环遍历记录集中的数据
        i = 1
        While Not rs.EOF
            ' 添加新的项
            Set lvwItem = ListView1.ListItems.Add(, , rs.Fields(1).Value) ' 第一列数据
        
            ' 添加子项
            For j = 1 To rs.Fields.Count - 1
                lvwItem.ListSubItems.Add , , rs.Fields(j + 1).Value ' 其他列数据
            Next j
        
            rs.MoveNext
            i = i + 1
        Wend

    End With
    
    
End Sub
'提交
Public Sub CommandButton1_Click()
    Dim sql As String, nowDate As Date, i As Long, result As Integer

    '确认弹窗
    result = MsgBox("是否确认提交数据?", vbQuestion + vbYesNo, "确认提交")
    
    ' 根据用户选择的按钮执行不同的操作
    If result = vbYes Then
        nowDate = Me.TextBox1.Value
        
        rs.MoveFirst    '将记录集指针移动到开头
        
        If rs.EOF Or rs.BOF Then
            MsgBox "Recordset is empty."
            Exit Sub
        End If
        
        While Not rs.EOF
            
            sql = "update 数据总表 " _
            & "set 跟进人id=" & selectedID & "," & "分配时间=" & "'" & nowDate & "'," & "更新时间=" & "'" & nowDate & "' " _
            & "where 数据总表.id = " & CInt(rs.Fields("id").Value)
            
            cnn.Execute (sql)
            rs.MoveNext
        Wend
        
        ' 关闭记录集
        rs.Close
        ' 关闭连接
        cnn.Close
        
        Set rs = Nothing
        Set cnn = Nothing
        
        Unload Me
    
    Else
        ' 关闭记录集
        rs.Close
        ' 关闭连接
        cnn.Close
        
        Set rs = Nothing
        Set cnn = Nothing
        
    End If

End Sub

具体实现:

excel-中台数据库搭建(一)

excel-中台数据库搭建(三)

excel-中台数据库搭建(四)

销售系统搭建(一)

销售系统搭建(二)