如何在MS Access表单中基于另一表的值显示对应价格?
解决MS Access发票表单自动显示对应价格的问题
嘿,作为常年跟Access打交道的老玩家,我来帮你搞定这个自动价格显示的需求,其实分几步就能实现,很清晰:
第一步:确保表单能获取客户的SalesType
首先你的frmInvoice得能拿到当前选中客户的SalesType值,最简单的方式是:
- 在表单上添加一个隐藏文本框(命名为
txtSalesType),把它的控件来源绑定到tblCustomers.SalesType(如果表单的记录源是包含客户信息的查询,直接选这个字段就行); - 如果表单是通过客户选择组合框(比如
cboCustomer)来选客户的,那也可以用DLookup在客户选中后获取SalesType,后面会提到。
第二步:配置产品选择组合框
你的产品组合框(比如cboProduct)需要能同时获取产品的现金价和成交价,所以得调整它的行来源:
- 行来源设为查询:
SELECT ProductID, ProductName, CashPrice, TradePrice FROM tblProducts;(把ProductName换成你实际的产品名称字段); - 打开组合框的属性窗口,把列数设为4,列宽设为
2cm;5cm;0cm;0cm(前两列显示产品ID和名称,后两列隐藏用来存价格); - 确保绑定列设为1(对应ProductID,用来存储选中的产品ID)。
第三步:编写VBA代码实现自动更新价格
我们需要在几个关键事件里触发价格更新,先写一个通用的更新函数,再绑定到事件上:
1. 通用更新函数
打开表单的VBA编辑器(按Alt+F11),粘贴下面的代码:
Private Sub UpdatePriceFields() ' 获取当前客户的销售类型,用Nz处理空值,默认设为Cash Sale Dim salesType As String salesType = Nz(Me.txtSalesType, "Cash Sale") ' 从组合框的隐藏列获取选中产品的两个价格 Dim cashPrice As Double, tradePrice As Double cashPrice = Nz(Me.cboProduct.Column(2), 0) tradePrice = Nz(Me.cboProduct.Column(3), 0) ' 根据销售类型设置文本框的值,还可以禁用不需要的文本框提升体验 If salesType = "Cash Sale" Then Me.txtCashPrice = cashPrice Me.txtTradePrice = "" Me.txtCashPrice.Enabled = True Me.txtTradePrice.Enabled = False ElseIf salesType = "Trade Sale" Then Me.txtTradePrice = tradePrice Me.txtCashPrice = "" Me.txtTradePrice.Enabled = True Me.txtCashPrice.Enabled = False End If End Sub
2. 绑定到事件
接下来把这个函数绑定到几个必要的事件上:
- 产品组合框的AfterUpdate事件:选完产品后自动更新价格
Private Sub cboProduct_AfterUpdate() UpdatePriceFields End Sub
- 表单加载事件:如果表单打开时已有选中的产品,自动显示对应价格
Private Sub Form_Load() If Not IsNull(Me.cboProduct) Then UpdatePriceFields End If End Sub
- 客户选择组合框的AfterUpdate事件(如果有客户选择控件的话):切换客户时自动更新价格
Private Sub cboCustomer_AfterUpdate() ' 先更新隐藏文本框的SalesType值 Me.txtSalesType = DLookup("SalesType", "tblCustomers", "CustomerID = " & Me.cboCustomer) ' 如果已有选中的产品,更新价格 If Not IsNull(Me.cboProduct) Then UpdatePriceFields End If End Sub
一些小细节提醒
- 组合框的列索引是从0开始的,所以
Column(2)对应我们查询里的第三个字段CashPrice,Column(3)对应TradePrice,别搞混顺序; - 用
Nz函数处理空值,避免因为没有选中产品或者SalesType为空导致报错; - 如果不需要显示未选中的价格文本框,除了清空值,还可以设置
Visible = False来隐藏,更美观。
内容的提问来源于stack exchange,提问作者Rob Thomson
相关产品推荐
相关产品推荐

