无需用户输入的特殊周期日期范围查询条件更新方案
解决方案:Access非标准周期(12.1-次年11.30)自动累计工时设置
一、核心:自动计算当前周期的起止日期
你的周期是当年12月1日至次年11月30日,用Access内置日期函数就能自动判断当前所属周期,完全不需要用户干预:
- 周期开始日期表达式:
IIf(Month(Date())>=12, DateSerial(Year(Date()),12,1), DateSerial(Year(Date())-1,12,1)) - 周期结束日期表达式:
IIf(Month(Date())>=12, DateSerial(Year(Date())+1,11,30), DateSerial(Year(Date()),11,30))
逻辑说明:如果当前月份≥12,周期是「当年12月1日 → 下一年11月30日」;否则是「上一年12月1日 → 当年11月30日」,每年12月1日会自动切换到新周期。
二、查询中设置自动日期筛选
在你的工时数据表查询里,给「工时日期」字段添加以下条件,就能自动筛选当前周期的记录:
Between IIf(Month(Date())>=12, DateSerial(Year(Date()),12,1), DateSerial(Year(Date())-1,12,1)) And IIf(Month(Date())>=12, DateSerial(Year(Date())+1,11,30), DateSerial(Year(Date()),11,30))
三、表单显示累计可计费工时
在录入表单中添加一个文本框(比如命名为txt累计工时),设置它的控件来源为以下两种方式之一:
方式1:直接基于数据表计算
替换[可计费工时]和工时数据表为你实际的字段名和表名:
=DSum("[可计费工时]", "工时数据表", "[工时日期] Between " & Format(IIf(Month(Date())>=12, DateSerial(Year(Date()),12,1), DateSerial(Year(Date())-1,12,1)), "\#mm\/dd\/yyyy\#") & " And " & Format(IIf(Month(Date())>=12, DateSerial(Year(Date())+1,11,30), DateSerial(Year(Date()),11,30)), "\#mm\/dd\/yyyy\#"))
方式2:基于已创建的筛选查询
如果你已经做好了上面的筛选查询(比如叫当前周期工时查询),直接用更简洁的表达式:
=DSum("[可计费工时]", "当前周期工时查询")
四、确保数据实时更新
- 表单打开时刷新:在表单的
On Open事件中添加VBA代码:Me.Requery,确保打开表单时加载最新累计数据。 - 录入工时后更新:在表单的
After Update事件中添加:Me.txt累计工时.Requery,用户录完工时后累计数立即更新。 - 若不想用VBA:可设置文本框的「刷新间隔」为60秒(在控件属性中查找),实现自动刷新。
五、测试验证
手动修改系统日期即可验证逻辑:
- 设为11月30日:累计数为上一年12月至当年11月的总工时;
- 设为12月1日:累计数自动切换为新周期(当年12月至次年11月)的数值,未录工时则显示0。
内容的提问来源于stack exchange,提问作者TikiMark
相关产品推荐
相关产品推荐

