如何让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
相关产品推荐
相关产品推荐

