Access查询中基于订购量的产品双价格自动匹配IF语句实现
Access 订单明细双档定价自动带出实现方案
核心逻辑说明
- 整套需求不需要复杂的VBA代码,靠Access内置功能就能实现,新手也可以快速搭建完成
- Access环境下的条件判断函数不是常规编程语言的
IF,在查询、宏、控件表达式场景下必须用IIF()函数,基础写法为:IIF(判定条件, 满足条件时的返回值, 不满足条件时的返回值) - 对应双档定价规则的核心判断逻辑:
- 当订购数量
Qty_Ordered大于10时,取产品表的Prod_Price2 - 当订购数量小于等于10、或是未输入数量时,取产品表的
Prod_Price1
- 当订购数量
表单端实时自动带出的零代码实现
这套方法完全靠Access自带的宏功能触发,不需要写代码:
- 打开订单明细表单,切换到设计视图,先确认表单上三个绑定控件的名称属性(不是控件上显示的标签文字,是属性表“全部”选项卡下的“名称”项):
- 选择产品的下拉框控件:默认名称一般为
Prod_code,绑定订单明细表的Prod_code外键,关联产品表的产品编码 - 输入订购数量的文本框:默认名称一般为
Qty_Ordered,绑定订单明细表的Qty_Ordered字段 - 存储订单价格的文本框:默认名称一般为
Price,绑定订单明细表的Price字段
- 选择产品的下拉框控件:默认名称一般为
- 给两个触发控件加更新后自动计算的宏:
- 先选中“订购数量”文本框,打开属性表→事件选项卡→找到“更新后”选项,点右侧的…按钮,选择“宏生成器”,点确定进入宏设计界面
- 在宏操作里选择
SetValue,按如下填写参数:- 项目:填
[Price](即价格输入框的控件名称) - 表达式:填
IIF(Nz([Qty_Ordered],0)>10, DLookup("Prod_Price2","产品表","Prod_code='" & [Prod_code] & "'"), DLookup("Prod_Price1","产品表","Prod_code='" & [Prod_code] & "'"))
- 项目:填
- 保存这个宏,退回到表单设计界面
- 再选中“产品选择”下拉框,用完全一样的方法,给它的“更新后”事件加一模一样的宏操作——覆盖“先选产品、再输数量”的常见操作顺序,避免出现选了产品没跳价格、改了数量不切价格的问题
- 保存表单,切换到窗体视图测试:
- 选任意一个产品,输入数量5,检查价格框是否自动带出对应产品的Prod_Price1
- 把数量改成15,检查价格是否自动切换成Prod_Price2
- 把数量改回8,检查价格是否切回Prod_Price1
查询层面的兜底校验方案
如果遇到手动改了明细行价格、或是之前存的价格和规则不匹配的情况,可以在做订单汇总查询时,实时按规则计算对应价格,不需要改动表里存储的历史值:
- 新建选择查询,添加订单明细表、产品表,把两个表通过共同的
Prod_code字段建立关联 - 把需要展示的字段(Order_Detail_ID、Order_ID、Prod_code、Prod_name、Qty_Ordered)依次拖到查询设计网格里
- 在新的列里添加计算字段,写法为:
规则匹配价格: IIF([Qty_Ordered]>10, [Prod_Price2], [Prod_Price1]) - 注意事项:
- 这个计算字段只用来做查询展示校验,不要把它的值强制覆盖到订单明细表的Price字段——因为产品的定价会随时间调整,历史订单必须记录成交当时的实际价格,不能跟着产品表的新定价变动,否则历史账目会错乱
- 如果你的Prod_code是数字类型而非文本类型,上面的DLookup和查询关联的写法要去掉单引号,比如DLookup的条件要写成
"Prod_code=" & [Prod_code],否则会报类型不匹配的错误
新手常见踩坑点
- 不要把价格判定逻辑直接存在产品表里,因为价格是和订单订购量绑定的交易属性,不是产品本身的固定属性
- 碰到价格带不出来、显示空值的情况,先检查有没有在数量还没输入时就触发判断——加
Nz([Qty_Ordered],0)把空值转成0,就能避免空值触发错误判定分支的问题 - Access环境下写条件判断不要直接写
IF(...),不管是在查询、宏还是简单的控件表达式里,都要用IIF(...),否则会报“表达式无效”的错误
内容的提问来源于stack exchange,提问作者diikuun
相关产品推荐
相关产品推荐

