Office中国论坛/Access中国论坛

标题: 如何实现这种查询功能 [打印本页]

作者: wuhongzhou    时间: 2018-8-23 17:53
标题: 如何实现这种查询功能
如附件,有三张表,我需要做出一个查询把所有人三张表信息都显示出来,而不是象附件这样只显示一条记录
有用联合查询,还是只显示一个人的信息,而不是所有人的记录

请高手帮助,谢谢!





作者: roych    时间: 2018-8-24 10:28
修改表关系如下:
[attach]62735[/attach]
此外,个人建议把另外两张表的员工编号的索引属性改为“索引(有重复)”。——事实上,我并不明白,这两个表的序号用来干吗的。为什么非要和另外2张表建立关系。或者这样说吧,这几张表的序号指代的都是同一个对象么?
——按我理解,基础信息表的序号,应该员工信息的序号;培训记录的序号,应该是培训信息的序号;两者应该分属不同的东西。
——我可能比较笨吧,对这么复杂的表关系,有着不可逾越的认知障碍。
——最后,我创建了一个我认为比较好的查询供参考。
[attach]62736[/attach]
作者: wuhongzhou    时间: 2018-8-24 11:24
谢谢大神,学习一下看自己能不能懂
作者: wuhongzhou    时间: 2018-8-24 11:25
结果是我想要的,再次感谢
作者: wuhongzhou    时间: 2018-8-29 14:54
roych 发表于 2018-8-24 10:28
修改表关系如下:

此外,个人建议把另外两张表的员工编号的索引属性改为“索引(有重复)”。——事实上 ...

版主,接着上面这个数据表,有以下疑问,就是在此基础上做了条件查询,按姓名模糊查询时可以实现没条件显示全部数据,有条件按条件显示,但是当按“奖惩类型”来查询时,只显示了有“奖惩类型”的数据,结果直接显示,无需进行查询。我百度过后,有人提出是因为LIKE只能查询非空值的结果,有空值的无法查询,请问“奖惩类型”要按“姓名”一样,无条件显示全部有条件显示值,这个查询条件改如何写或者改,谢谢!

作者: roych    时间: 2018-8-30 09:41
wuhongzhou 发表于 2018-8-29 14:54
版主,接着上面这个数据表,有以下疑问,就是在此基础上做了条件查询,按姓名模糊查询时可以实现没条件显 ...

先说说like子句。
奖惩.奖惩类型 Like IIf(IsNull([Forms]![窗体1]![jc]),"*",[Forms]![窗体1]![jc])
这个子句的意思是说,如果是空的时候,窗体1的jc没有输入时,条件相当于:
奖惩.奖惩类型 like "*"
有录入时,相当于:
奖惩.奖惩类型 like [Forms]![窗体1]![jc]
后半句就不说了,很容易理解,由于没有通配符(*号),所以这里的like相当于“=”。
现在来看前半句,like "*"表示什么?我们知道,“*”表示任意字符。——因此,只要有录入的都会显示。——现在问题来了,没录入的是Null(空值),自然就无法显示出来了。
接下来说解决办法:
1、补齐空值或者设置必填字段为查询条件。例如,设置默认值为“--”——事实上,这个方法是最常用了。例如,查询员工信息时,通常会设置入职日期(必填)、工号(必填)等等。
2、修改SQL子句。这时候就需要使用VBA了,先判断是否有录入,如果有录入,则设置QueryDef的SQL子句加上where部分。如果没有录入,则只使用原先的子句。——这个等你学完VBA再回头看吧。

作者: wuhongzhou    时间: 2018-8-30 11:03
谢谢指导,我慢慢学习
作者: wuhongzhou    时间: 2018-9-5 09:50
roych 发表于 2018-8-30 09:41
先说说like子句。
奖惩.奖惩类型 Like IIf(IsNull([Forms]![窗体1]![jc]),"*",[Forms]![窗体1]![jc])
...

你好,请在表格有两个与时间相关的字段,一个是入职时间,一个是离职时间,因为每个人都有入职时间所有没有空值,按附件中查询可以执行,但不可能所有人都是离职,所以在职的人用1900-1-1这个日期来填充,避免空值,同样按入职的查询执行,发现执行不了,要么只显示所有离职的,要么只能显示在某个时间段在职的人中挑出离职的人,不能直接按时间段来查询什么时间到什么时间有多少人离职,请问该如何修改,谢谢!
作者: roych    时间: 2018-9-5 10:24
没离职的也给一个离职日期1900-1-1?根据我个人的经验,建议进行以下操作:
1、离职记录应该单独列一张表,用来查询离职信息。在离职新增记录,并增加该员工的入职日期(根据你的问题描述,应该增加这个字段)。
2、入职记录作为一张表,可以考虑加一个“是否离职”的是否字段。默认该字段为“否”,离职时更新为“是”。
完成了这两步操作之后,接下来就可以回答上述问题了:
1、查询某个时间段离职人数——离职表
2、查询某个时间段在职人数——入职表
3、查询某个时间段入职人数和该时间段离职人数,——以入职表为左表,离职表为右表,包含该时间段所有入职表的工号和包含该时间段离职表的工号,建立关系。右表工号为null则表示该时间节点仍在职,非空则表示该阶段已经离职。写法大体如下:
  1. select 员工表.员工 as 在职员工, 离职表.员工 as 离职员工 from 员工表 left join 离职表 on 在职员工.工号= 离职表.工号 where 在职表.在职日期 between #2018-08-01# and #2018-09-01# and 离职表.离职日期 between #2018-08-01# and #2018-09-01#
复制代码

……最后,我还是多嘴说一句,多花点时间去了解业务吧。否则你这个系统修修补补几个月都未必能用。
作者: wuhongzhou    时间: 2018-9-5 13:41
roych 发表于 2018-9-5 10:24
没离职的也给一个离职日期1900-1-1?根据我个人的经验,建议进行以下操作:
1、离职记录应该单独列一张表 ...

谢谢,ACCESS只是自学的,以前没学过,部份功能对目前工作有一些帮助,所以很多东西不懂,到没说一定做出一个系统来,还差的太远,慢慢积累
作者: roych    时间: 2018-9-5 15:27
wuhongzhou 发表于 2018-9-5 13:41
谢谢,ACCESS只是自学的,以前没学过,部份功能对目前工作有一些帮助,所以很多东西不懂,到没说一定做出 ...

花点时间,看看理论基础,例如数据库设计的范式,论坛里其实也有对应的帖子,搜索“表规范”即可。
——即便不开发软件,至少也可以避免走太多弯路,或者解决一些疑惑。例如,当关系未定时,一些操作查询无法执行:
http://www.office-cn.net/thread-108107-1-1.html
——如果数据源都是外部数据源,对理论基础的要求则未必那么高。这时候Access权当一个小工具吧,类似于Excel的宏一样。
——然鹅,不管哪一种情况,对处理流程,都必须要绝对的清晰。哪些操作是可以并列处理,哪些数据有先后顺序要求等等。

就拿这个实例来举例吧,例如,处理调岗过程:
新增调岗记录→从人员信息表里复制原岗位信息到旧岗位信息→录入新岗位信息→将新岗位信息更新到人员信息表。
像这个,流程就不能搞乱,即不能先修改员工信息表,再新增调岗记录。
再如,处理离职过程:
新增离职记录→更新其他表(奖惩记录、培训记录等等)的离职信息→在员工信息表对人员进行“离职”标识。
像这个,“更新其他表”时,各个表属于并列结构,顺序上不做要求,不要漏就行了。
最后说一句,基础是否扎实,决定你能走多远。条理是否清晰,决定你能走多快。学习切忌心浮气躁,好高骛远。
作者: wuhongzhou    时间: 2018-9-12 09:54
感谢,本来还想咨询一下您关于写入冲突的问题,但在上在事例中刚好提到新增调岗记录这个问题,给了一个新思路,解决了这个问题,再次感谢!
作者: wuhongzhou    时间: 2018-9-14 17:11
roych 发表于 2018-8-30 09:41
先说说like子句。
奖惩.奖惩类型 Like IIf(IsNull([Forms]![窗体1]![jc]),"*",[Forms]![窗体1]![jc])
...

不好意思又给您添麻烦了,又有新问题请教,首先抱歉因为数据源都是公司员工信息,没办法上传,把问题列出来看能不能明白:
1、在实现主子窗体同步过程中,同样的代码在实现同步时都没问题,但是在实现子窗体与报表同步时就出现问题,代码如下:Private Sub Command50_Click()
DoCmd.OpenReport "个人简历", acViewPreview
Reports!个人简历.Filter = "员工编号='" & Me.员工基本信息查询_子窗体.Form.[员工编号] & " '"
    Reports!个人简历.FilterOn = True
预览和同步均是实现了,但是把预览的个人简历报表关闭后就死机了,次次操作次次死机,不知道问题在哪里?而操作主子窗体时同样的代码就不会死机,可以正常执行。

2、在用报表做简历时,比如有一项是个人多次培训记录,如果用子报表做数据源就会出现有几条培训记录就会出现几份重复简历的情况,如果直接用查询做数据源, 就会出现如果有3条培训记录,那么就会出现3份简历,每一份简历中一条记录,而不是三条合在一起。

这两个问题这样描述不知道能不能明白,不知道问题在哪里?谢谢

说到底其实就是2个问题,一个是如何实现子窗体或查询结果与打印预览或打印同步。第二则是如何让多条记录集中在一起显示,而不出现重复。
作者: roych    时间: 2018-9-14 23:50
1、是否可以考虑在登录时设置where条件,保证用户只能查看自己的信息?具体请参考:
——http://www.office-cn.net/thread-121606-1-1.html
2、这个显然是你没有把主报表和子报表的关系搞清楚的缘故。具体请参考:
http://www.office-cn.net/thread-121607-1-1.html
如图所示,哪些是主体信息,哪些是明细补充,应该把关系捋一下。像这个帖子,图中并没有出现多次姓名的情况吧?
——简历为什么会重复呢?要么简历是另一张表,要么简历和培训记录绑在一起了。如果简历在另一张表,应该与主表构建起一对一关系,这样才不会出现重复。如果一旦与培训记录构建起一对多关系,必然出现重复。
——事实上,简历没必要另外使用一张表。用备注字段,通常是可以把简历写好的。再不济就拆分成多个字段,加在个人信息表里即可。毕竟简历还是伴随着整个员工的。
作者: wuhongzhou    时间: 2018-9-17 09:50
roych 发表于 2018-9-14 23:50
1、是否可以考虑在登录时设置where条件,保证用户只能查看自己的信息?具体请参考:
——http://www.offic ...

谢谢,我再学习一下




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3