MS Access多条件查询实现表单展示无毕业资格学生方案咨询
方案可行性与更优实现路径
1. 草拟的双循环VBA方案是否可行?
可行但效率极低,完全不推荐,你当前的伪代码还有几个明显的bug:
- 没有初始化
db对象,运行直接报错 - 内层课程循环遍历完后没有把
rs_courses指针移回第一条,下一个学生遍历时内层循环会直接跳过 - 每次检查单门课程都要单独查
completed_courses,会产生大量重复查询,数据量稍大就会严重卡顿
2. 更优实现路径:直接用Access SQL实现
完全不需要写VBA循环,单条SQL就能搞定所有逻辑,性能比嵌套循环高几个量级,参考语句如下:
SELECT DISTINCT S.student_id, S.first_name, S.last_name, M.major_id, M.major_name FROM ( (students S INNER JOIN students_assigned_majors SAM ON S.student_id = SAM.student_id) INNER JOIN majors M ON SAM.major_id = M.major_id ) WHERE EXISTS ( -- 匹配学生所属专业的必修课程中,未合格修完的项 SELECT 1 FROM courses_assigned_majors CAM LEFT JOIN completed_courses CC ON CAM.course_id = CC.course_id AND CC.student_id = S.student_id AND CC.completion_date >= DateAdd("yyyy", -5, Date()) WHERE CAM.major_id = SAM.major_id AND CC.ref_id IS NULL -- 满足条件:要么没修,要么修课时间超过5年失效 ) -- 如需限定查询指定专业,可取消注释下面的条件 -- AND M.major_id = [请输入专业ID]
你直接把这条查询作为表单的记录源就能拿到需要的结果,不需要额外写VBA处理逻辑。
两个疑问解答
1. 子过程存储在表单的Current事件中是否合理?
完全不合理。
表单的Current事件是每次切换绑定记录时都会触发,如果表单绑定了大量数据,会重复执行很多次无效逻辑,严重拖慢运行性能。
如果确实要保留VBA方案,建议把逻辑封装为独立公共函数,只在表单加载事件、专业筛选条件变更事件时触发一次即可,不要绑定到Current事件。
2. 不符合毕业要求的学生数据存储在哪里方便表单展示?
优先选择动态查询,不需要额外存储:
- 如果用上面的SQL方案,直接把查询设为表单的记录源即可,数据是动态更新的,不需要手动维护存储内容。
- 如果非要用VBA循环方案,可以提前建一个临时表
not_eligible,每次执行逻辑前清空表数据,再插入不符合要求的学生记录,最后把这个临时表设为表单的记录源即可。
内容的提问来源于stack exchange,提问作者Fran_1011
相关产品推荐
相关产品推荐

