时 间:2013-11-01 12:24:14
作 者:竹笛 ID:8 城市:上海 QQ:2851379730
摘 要:学习要求:本节预计学习课时为0.5小时,重点是:a.字段属性中文本框、列表框、组合框;b.如何设置组合框的行来源。
正 文:
5.2 文本框、列表框与组合框
为了后续讲述的方便,我们先遵照表设计说明书的标准,输入一些测试数据——首先,我们选中tblCodelb表,然后,单击鼠标右键,选择
再次强调,在正常情况下,是不允许用户直接在表中输入数据的,但我们这里为了教学的方便,先往表中录入几行试验数据(注意类别编号的录入——根据表设计的要求,必须是字母L+2位数字,否则在后续学习中,会出现问题),输入完成之后,如下图所示:
好了,测试数据,已经输入完毕,现在可以关闭当前的tblCodelb表,继续下一步的分析。
当前的数据库中,已经有了三个用户建立的表——我们很快就可以发现,当前三个表的主体,其实是tblBxmx表,至于tblCodeyg表和tblCodelb表,其实都是为tblBxmx服务的,通过tblBxmx表中的lbID字段和ygID字段关联,为tblBxmx提供选项值,以节省输入时间,避免重复的手工输入。
首先,请再次打开tblBxmx表的设计视图,我们会发现,几乎所有的字段的【字段属性】,都有两个选项卡,一个是【常规】选项卡,是一个【查阅】选项卡,如下图所示:
这个时候,我们就会明白,我们先前涉及的所有的【字段属性】,都是从属于常规选项卡的,而对于【查阅】选项卡,几乎没有涉及,那么,我们先定位到lbID字段,然后再单击【查阅】选项卡,如下图所示:
我们发现,默认情况下,【查阅】选项卡,只有一个属性,那就是【显示控件】,而当前显示控制的默认的值是文本框,所谓文本框,就是只能提供一个可输入方框的控件——接触过网络和计算机的,一般都知道,我们在录入数据,尤其是城市、性别、类别之类有明确可选值的数据的时候,都喜欢在系统所提供的下拉列表中直接点选相应的选项,但是,这个文本框却只能提供录入方框,而不能同时提供可选择的下拉列表——那么,如若能提供可选择的下拉列表,有什么好处呢?那就是,通过点选下拉列表的值,一方面,能显著地提高输入的效率,另一方面,输入的准确率(防止笔误)也可以一并提高,显然,好处是显而易见的。
那么,如何才能让【显示控件】(即显示可输入方框的控件)提供可选择下拉可选列表的功能呢?接下来我们单击显示控件的输入区,然后点选由于激活输入区而随之出现的
这个时候,我们就可以发现,原来【显示控件】已经提供了3个选项,分别是文本框、列表框、组合框——文本框,我们已经解释了,那么,列表框是什么呢?列表框,也就是说,在输入区域被激活之后,会根据已指定的数据源(也就是可选项的数据来源)的当前数据提供一个可选的值列表——这个列表是动态的,会根据数据源中数据的变化而变化,但在某一个静止的时间点上,又是相对的静态。比如,比如有一个体重类别的数据列,被其他表引用,作为其某一个字段的数据源,如若这个体重类别的数据列中当前苗条、正常两行数据,那么,引用其作数据源的控件的下拉列表中,也只有苗条和正常两个选项——如若体重类别数据列中,又添加了偏瘦和超重,那么,引用其作数据源的控件的下拉列表中,也会动态地增加这两个选项。
在这里,需要强调的是,在【显示控件】被指定为列表框之后,一切在可选值之外的输入,都是不被允许的,也就是说,我们只能从数据源提供的值列表中来选择输入,而不再被允许输入以外的数据,因此,采用列表框,在提高输入效率的同时,也可以精确地提高输入的准确率,防止非法数值的出现,比如,在报销数据库的场合中,则可以禁止没有报销权限的人员的报销单据的录入,便于企业的内部管理,以及提高企业内控的安全性。
那么,组合框呢?已经解释了文本框和列表框,那么,组合框就很好说明了——所谓组合框,就是文本框和列表框的组合,也就是说,即可以自由输入数据,也可以从列表中选择,显得比较自由——针对一些安全性不是很高,并且,可以提供可选项数据的场合,可以采用组合框。
在此,需要说明的是,组合框也可以实现列表框的功能——如何实现呢?我们要知道,无论是任何对象,包括字段、控件、窗体和报表在内,都是通过其一系列的内部属性的设置来控制其外在的表现的形式——组合框当然也不例外,在组合框的属性中,有一个【限于列表】的属性,默认是不限于列表,即可以输入列表之外的值,如若我们将其修改为是,即让其限于列表,那么,当前的组合框也不允许录入下拉列表选项以外的数据,其效果也就和列表框完全一致。
在当前的场合,由于报销类别和员工姓名,都是比较重要的数据,因此,看起来,选用列表框,看起来是最为简便的——其实不然,在这里,我们选择组合框,其后,如下图所示:
如上图所示,当我们选择组合框之后,从属于组合框的一系列属性,就立即会被激活,并显示出来——默认的【行来源类型】(也就前面提到的数据源的种类,也就是可选项的数据来源对象的种类)是表/查询,而我们前面已经提到,tblCodeyg表和tblCodelb表,都是为tblBxmx表服务的,而tblBxmx表中lbID字段的可选项则是来源于tblCodelb表,那么,在这里,显然应该选择默认值,也就是行来源的类型应当是:表/查询。
已经指定了【行来源类型】(也就是数据源对象的种类),那么,下一步就应当指定具体的数据源了——当前,也就是需要指定【行来源】,【表/查询】类型的数据源的指定,有两种方式:
第一种方式,可以直接选择表或查询(需要满足一定的前提条件),另一种方式,可以通过SQL代码来实现的。
当前,我们将先通过第二种方式来进行——在以后的窗体开发的环节,再来讲述第一种方式的设置和相关细节。
但是,通过第二种方式,也有两种操作方式,第一种,是直接编写SQL代码,第二种,是通过SQL语句生成器来自动生成SQL代码——由于考虑SQL语句对部分的初学者,可能有那么的一点难度,因此,我们可以通过Access提供的SQL语句生成器来自动生成我们所需要的SQL代码,那么,这个自动生成功能如何使用呢?
我们先激活【行来源】的输入区(所谓激活,就是鼠标单击该输入方框内的任意位置),就会发现,在【行来源】输入方框外的右侧,出现了一个
接下来,我们单击
就这样,我们通过单击
然后,我们单击【添加(A)】按钮,就可以将表添加到查询设计界面,接下来,通过单击【显示表】对话框中【关闭(C)】按钮,关闭【显示表】对话框,然后,如下图所示:
当前的这个设计界面,上半部分是表和查询的显示区域,下半部分是用以生成SQL语句(或查询)的设计区域,接下来,我们先选中lbID字段,如下图所示:
然后,双击lbID字段,lbID字段就会被自动地放置于下半部分的设计窗格中,如下图所示:
当然,也可以通过拖拽的方式——即先行点选lbID字段,然后,按住鼠标左键拖拽,将该字段拖拽到适当的窗格上方时,再松开鼠标左键,也可以达到同样的目的。
同理,我们将lbmc字段,也拖放到设计窗格,如下图所示:
由于当前的查询设计,即是为了配合生成以tblCodelb表中两个字段为主体的查询,进行到这里,两个字段都已经被拖放到设计窗格中去了,也就是说,我们已经完成了全部的设计工作,不用再做进一步的处理,更不需要再进行排序、统计或写相应的表达式——这种查询,可以说,是最为简单的查询,简单到不能再简单的地步。
接下来,我们单击设计区域顶端右侧的
这个对话框的意思就是说——是否要生成SQL语句,并填写到【行来源】的输入方框(也就是行来源的属性值)中去——这正是我们建立查询的目的,因此,当然要单击【是(Y)】按钮加以确认,然后,则如下图所示:
很显然,我们所需要的SQL代码,已经被自动填好了——由系统所生成的SQL语句,如下:
Select tblCodelb.lbID, tblCodelb.lbmc FROM tblCodelb
这一条SQL代码的意思是说,返回(即Select关键字的作用)来源于(即FROM关键字的作用)tblCodelb表中的lbID和lbmc字段的值的列表。
对于学过SQL语言的来说,以上的语句,几乎可以说是最为简单的SQL代码——如若先前没有学过SQL语句,以后再用到类似到语句的时候,只需要将其中的表名和字段名称替换成对应的表名和字段名称即可。
接下来,我们再看【绑定列】属性,默认值是1,这个属性的意思就是说,将从【行来源】中返回的数据列表结果集的哪一列中的数值保存到表中——我们刚才设计的查询,毫无疑问,返回的结果集,只有2列,第一列是lbID(类别编号),第二列是lbmc(类别名称)——而我们当前的这个属性是归属于tblBxmx表的lbID的字段,其【字段大小】只有3,与第一列相匹配,因此,显然我们应该将第一列的相应对的值,保存到表中去,因此,保持默认值即可,无需修改。
这个时候,我们不妨再理一下思路——也就是说,我们在激活下拉列表,选择相应值以便完成输入的时候,当然是希望下拉列表中的选项,都是我们所容易理解的,比如,我们可以再次打开tblCodelb表,查看刚才输入的测试数据,这个时候,我们就会发现,第一列的数据是很难理解的,单单看第一列数据,我们很难知道L01代表什么,L02代表什么,但是与第一列所对应的第二列,则是一目了然的——电话费、资料费所代表的含义,我们都能理解——不妨再以当前的tblCodelb表来举例——既然L01代表电话费,L02代表住宿费,那么,我们当然希望点选的时候,看到的是第二列的数据,而保存在tblBxmx表中的,却是第1列的数据——不然,我们还需要记忆类别编号和类别名称之间的对应关系——这样做岂不是太辛苦了?
比如,在现实中,虽然我们身份的唯一标识是身份证号(类似于这里的类别编号,同样不允许重复),但是,平常我们生活之中彼此相称,却是以姓名或别名、昵称、字号相称,而不是以身份证号相称——但是,我们要查验一个人的真正的身份的时候,却通常是以身份证号来查验,而不是以平常所称的姓名来查验。
以上的这个道理,与当前的tblBxmx表的lbmc字段的道理是一样的。也正是因为这个道理,所以,我们才在查询设计的时候选择了两列数据,第2列数据是显示给前台界面的操作员看的,就好比我们平常以姓名或别名、昵称、字号相称,而第1列的数据,相当于身份证号,则是需要保存到表格中去的(将被选择的选项所对应的第1列的值保存到表中,比如,如若选择是电话费,则将所对应的L01保存到表格中去)。
因此,理想的设计便是,可供选择的列表值是友好的,而存储在数据库中的值却是唯一的、高效的,这也是我们为什么要保存第1列的数据,而不是保存第2列的原因——当然,在表设计的时候,我们可以设计成保存第2列的数据,但我们并没有那样去设计——当然,在完成表设计之后的现在,也只能保存第1列中的数据。
为什么呢?这是因为类别名称或许不会出现的值,但是在实际案例中,有很多字段都会出现重复的值,比如姓名,因此,为了养成良好的习惯,我们这里遵循通用的设计原则。
此外,即便是在tblCodelb表中,类别名称不会出现重复,但是,如若我们在做表设计的时候,如若选择在tblBxmx表的lbmc字段中保存来源于tblCodelb表中第2列数据,比如,保存是电话费,而不是L01,那么,如若以后类别名称有所调整——那么,tblBxmx表中凡是涉及到电话费的记录,都需要一一调整——尽管我们有批量调整的办法,但是毕竟增加了一项工作——而如若保存的是第1列数据,比如,保存的是L01,那么,无论以后相对应的类别名称如何调整,tblBxmx表的lbID字段的值都不用做任何调整,比如,在现实中,无论我们如何更改姓名、昵称、字号,而我们的身份证号却是不变的,因此,只要确定了一个人的身份证号,这个人的姓名、昵称、字号无论如何变更,都可以将其锁定并找出来。lbID
因此,数据库的设计工作,虽然也是一项技术工作,但是在了解相关的技术细节的同时,也需要了解其相关的业务,不然,设计工作和实际的工作,可能会产生比较严重的脱节,与此同时,我们还要掌握相关的开发技巧,比如,刚才的这个设计——尽量给前台用户提供便利,而把相关的计算隐藏在用户所觉察不到的后台。
接下来,我们继续,下一个属性是【列数】,这里问的是我们需要由【数据源】返回的结果集其中的前几列——前面讨论了那么多,当然知道是需要2列,所以,这里由默认的1更改为2。
下一个属性是【列标题】,所谓【列标题】,就是该字段的【字段属性】的【常规】选项卡的【标题】属性的值,在下拉列表弹出的时候,是否附带显示在下拉列表的顶端——如若没有给该标题赋值,则直接显示相应的字段名称,在这里,也就是显示lbmc。通常来说,列标题,会在输入界面中,以标签的形式出现,因此,这里就没有必要重复出现了——当然,这也根据需要来定,通常也是需要的,不排除某些特殊场合是需要的。
下一个属性是【列宽】,我们知道,刚才填写【列数】属性的时候,就已经知道当前返回的结果集有两列,所以,这里应当分别设置两列的宽度——前面已经分析过,最理想的情况是,提供的可选项是第2列的数据,而存储在数据库中的却是相对应的第1列的编号,因此,点选的时候,是没有必要同时显示两列数据——尽管可以这么做。再则,比如,电话费所对应的编号是什么,完全没有必要让普通用户知道——完全可以将这些计算工作放在后台进行。
因此,尽管我们选择了2列,仍然可以通过技术手段将第1列隐藏,即将其列宽设置为0cm,第2列的列宽,根据当前的情况,设置为2cm就可以了(可以根据需要适当调整),因此,这里应该这样填写:0cm;2cm——需要值得注意的是,列宽属性中两个长度之间的分号必须是英文输入法下的分号,如若是误用了中文的分号,系统会报错的——如若遇到系统报错,请不要疑惑,切换一下输入法即可。
接下来,是【列表行数】属性,这个属性牵涉到整个下拉列表框的高度,默认为8行的高度,在这里,我们可以将其调整为20行——如若可选值超过20行,则会显示垂直滚动条。
接下来是【列表宽度】——前面的【列表行数】实际上是整个可选列表框高度的设置,而【列表高度】则是整个可选列表框的宽度的设置,通常保持默认的自动即可,当然,也可以去规定一个宽度——当这里设置的宽度小于前面设置的总的【列宽】(所有字段累加的宽度即总的【列宽】),那么,将会显示出水平滚动条。
最后就是前面提过的【限于列表】了,默认是否,这里应该修改为是。
以上设置全部完成之后,如下图所示:
进行到这里,lbID的【字段属性】的相关设置工作就已经全部完成了,接下来,我们可以按照同样的原理和方法完成ygID字段的【查阅】选项卡中相关属性的设置工作,完成之后,如下图所示:
接下来,我们可以通过单击
联系客服