Access组合框:输入项不在列表时从预留供应商表添加(带搜索)
实现组合框无匹配项时从潜在供应商列表选择添加的功能
核心思路
利用Access组合框的NotInList事件(输入内容不在列表时触发),弹出带实时搜索的潜在供应商选择窗体,选中后将供应商信息插入到原供应商表,再刷新原组合框的行源并定位到新添加的项。
步骤1:修正原有实时搜索代码
先修正原代码中变量名的笔误(source应为sSource1),确保实时搜索功能正常:
Option Compare Database Dim sSource1 As String Private Sub Form_Load() ' 移除行源中的分号,提取基础SQL语句 sSource1 = Replace(Me.Suplier.RowSource, ";", "") End Sub Private Sub Suplier_Change() ' 调用实时过滤函数,实现输入时动态筛选组合框列表 Call filtercomboasyoutype(Me.Suplier, sSource1, "supliername") End Sub
步骤2:创建潜在供应商选择窗体
新建窗体frmPotentialSuppliers,添加一个组合框cboPotentialSearch,配置属性:
- 行来源:
SELECT PotentialID, PotentialName FROM PotentialSuppliers(替换为你的潜在供应商表字段) - 列数:2
- 绑定列:1
- 列宽:
0cm;5cm(隐藏ID列,仅显示供应商名称) - 限制列表:
Yes
为该窗体添加实时搜索代码:
Option Compare Database Dim sPotentialSource As String Private Sub Form_Load() ' 初始化潜在供应商列表的基础SQL sPotentialSource = "SELECT PotentialID, PotentialName FROM PotentialSuppliers" Me.cboPotentialSearch.RowSource = sPotentialSource End Sub Private Sub cboPotentialSearch_Change() ' 实时过滤潜在供应商列表 Call filtercomboasyoutype(Me.cboPotentialSearch, sPotentialSource, "PotentialName") End Sub
步骤3:实现无匹配时的弹窗选择与添加功能
在原组合框的NotInList事件中编写逻辑,处理输入不在列表的情况:
Private Sub Suplier_NotInList(NewData As String, Response As Integer) Dim strSelectedID As String Dim strSelectedName As String ' 禁用默认的"不在列表中"错误提示 Response = acDataErrContinue ' 弹出潜在供应商选择窗体(模态对话框,等待用户操作) DoCmd.OpenForm "frmPotentialSuppliers", , , , , acDialog ' 判断用户是否选中了潜在供应商 If Not IsNull(Forms!frmPotentialSuppliers!cboPotentialSearch) Then ' 获取选中项的ID和名称(注意列索引从0开始) strSelectedID = Forms!frmPotentialSuppliers!cboPotentialSearch.Column(0) strSelectedName = Forms!frmPotentialSuppliers!cboPotentialSearch.Column(1) ' 转义单引号避免SQL注入问题 strSelectedID = Replace(strSelectedID, "'", "''") strSelectedName = Replace(strSelectedName, "'", "''") ' 将选中的潜在供应商插入到正式供应商表 CurrentDb.Execute "INSERT INTO suplier (suplierid, supliername) VALUES ('" & strSelectedID & "', '" & strSelectedName & "')" ' 刷新原组合框的行源,显示新添加的供应商 Me.Suplier.RowSource = sSource1 Me.Suplier.Requery ' 将原组合框定位到新添加的供应商 Me.Suplier = strSelectedID Me.Suplier.Text = strSelectedName End If ' 关闭潜在供应商选择窗体 DoCmd.Close acForm, "frmPotentialSuppliers" End Sub
注意事项
- 确保
filtercomboasyoutype函数能正确生成过滤后的SQL,示例逻辑应为:在基础SQL后追加WHERE [字段名] LIKE '*" & 组合框文本 & "*'(Access SQL使用*作为通配符)。 - 如果潜在供应商的ID是自动编号类型,需调整
INSERT语句,去掉ID字段的插入逻辑。 - 测试时需确保用户对
suplier表和PotentialSuppliers表有读写权限。
内容的提问来源于stack exchange,提问作者Fredi Bineri
相关产品推荐
相关产品推荐

