You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Access订单表的发票下拉菜单仅显示对应供应商的发票?

解决Access订单表单发票下拉过滤及表关系问题

第一步:规范表结构与关系(核心前提)

别再用查找向导建关系,先把表结构和关联理清楚:

  • Suppliers(供应商)表:必须设主键,比如SupplierID(自动编号类型,设为主键),再补充供应商名称、联系方式等字段。
  • Invoices(发票)表:主键InvoiceID(自动编号),添加SupplierID字段(数字类型,关联Suppliers的SupplierID),再加上发票号、开票日期、金额等字段。SupplierID建普通索引即可,不用设唯一——一个供应商可以有多张发票。
  • Orders(订单)表:主键OrderID(自动编号),添加SupplierID(数字,关联Suppliers)和InvoiceID(数字,关联Invoices),再加上订单号、订单日期、金额等字段。

在关系窗口建立关联:

  • Suppliers ↔ Invoices:通过SupplierID建立一对多关系(Suppliers是父表,Invoices是子表),勾选「实施参照完整性」,可选「级联更新相关字段」。
  • Suppliers ↔ Orders:同样通过SupplierID一对多关联,勾选参照完整性。
  • Invoices ↔ Orders:通过InvoiceID建立一对多关系(Invoices是父表,Orders是子表),勾选参照完整性——这就能解决你之前关联供应商字段时的"No unique index found"错误,因为父表的主键InvoiceID是唯一索引,符合参照完整性要求,同时适配「一张发票对应多个订单」的业务逻辑。

第二步:实现订单表单的发票下拉过滤

假设你的订单表单名为frmOrders,表单上有两个组合框:

  • cboSupplier:绑定到Orders表的SupplierID,行来源是Suppliers表的SupplierID和SupplierName,用来选择供应商。
  • cboInvoice:绑定到Orders表的InvoiceID,用来选择发票。

设置cboInvoice的行来源为动态查询:

SELECT InvoiceID, InvoiceNumber, InvoiceDate
FROM Invoices
WHERE SupplierID = Forms!frmOrders!cboSupplier;

把发票号和日期显示在下拉里,方便识别。

给cboSupplier添加AfterUpdate事件的VBA代码:

Private Sub cboSupplier_AfterUpdate()
    ' 重新查询发票下拉框,只显示当前供应商的发票
    Me.cboInvoice.Requery
    ' 清空之前的发票选择,避免出现不匹配的旧数据
    Me.cboInvoice = Null
End Sub

再给表单添加Load事件的代码,确保打开已有订单时,发票下拉自动过滤:

Private Sub Form_Load()
    If Not IsNull(Me.cboSupplier) Then
        Me.cboInvoice.Requery
    End If
End Sub

为什么之前的方法不行?

你之前尝试关联订单和发票的供应商字段,提示"No unique index found",是因为参照完整性要求父表的关联字段必须是唯一索引(比如主键),但发票表的SupplierID不是唯一的(一个供应商有多张发票),所以没法用它建立强制关联。正确的做法是用发票的主键InvoiceID和订单的InvoiceID外键关联,既满足参照完整性,也适配「一张发票对应多订单」的场景。

内容的提问来源于stack exchange,提问作者iN3krO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:36:26