继续上次的话题,完成了新增的功能
一、第二个部分是需要完成线索分配的功能
功能设计: 点击线索分配 –> 弹出弹窗 –> 选择分配数据类型 –> 选择分配数量 –> 选择查询方式 –> 选择分配人–> 更新分配时间 –> 提交数据
遇到的卡点:
这个部分做起来相对容易一些,主要遇到的是数据库设计的问题,access数据库没有动态生成id的功能,也没有事务,表的设计最初想的麻烦了,想分成很多个表,然后根据情况调取不同的表,后来发现,这个方式实在是太复杂了,放弃了,重新设计了数据库。
另外就是窗体设计和代码的编辑问题,这个部分看了教程和视频,用了chatgpt就完成了。记得之前渡一的袁老师说,程序员最重要的是思路,代码并不重要,现在发现是对的,有思路就不怕不能实现。
指针问题,这个问题困扰了很久,因为不想一直重复调用数据库,提交的时候,整体调用一次,结果就是这个坑,费了很久的时间。如果用完指针,一定要恢复指针的初始位置
二、具体实现:
接下来说一说具体功能的实现
- 窗体展示:
窗体设计的时候有个问题,就是viewList 这个在原本的设计中并没有,需要打开这个按钮:
第一步:右击空白处,点击附加控件
- 第二步:添加附件:
代码–获取列表框中的默认数据
这个部分的设计是这样的,想从设置中获取数据
(1)先在设置中列出数据
(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