教程7:数据库型报表的sql定制
您一定注意到添加报表页面或修改报表页面右上方的“sql定制”字样
在上面点击一下,您就会进入sql定制页面,您会发现sql定制页面和常规定制页面几乎一样,除了常规定制页面的“选择注册数据库”被替换成了“sql语句”,没错,在这里,您能够用强大的sql查询语句定制自己的报表。
在常规定制中,尽管已经可以定制出大部分所需的报表,但仍有些报表是它力不从心的,如记录的分组,连接表,聚合函数等,这些都可以通过sql语句进行定制。可以这样说,凡常规定制可以做的sql定制都可以做,常规定制做不到的sql定制也可以做,前提是您对sql语法足够熟悉。
让我们从一个最简单的例子开始,假设中国风公司要举办一个元旦员工活动,后勤部现在要做一个“元旦活动报名”表放在网上让员工自己报名。
1、管理登录,进入添加报表页面。
2、在“选择注册数据库”下拉菜单中选择“中国风”
3、点击“sql定制”(下图红圈1)标签进入sql定制页面。
4、在“sql语句”右侧的文本框填入“select * from 活动报名”(红圈2),”打开字段设置”(红圈3),按“预览”预览定制结果(红圈4)
5、填写报表名,选择属集,保存报表。

显示的字段名是英文的“id”、“name”和“games”,想改成中文,但发现在字段设置模块中没有别名文本框,怎么办?别忘了sql查询语句的强大功能——只需将sql语句改成“select
id as 序号,name as 姓名,games as 活动项目 from 活动报名”,再预览一下。
报名的规则是每人只能报一次名,活动项目有围棋、象棋、桥牌、斗地主四项,一人可以参加多项。
如何限制只能报名一次呢?请注意“字段设置”模块中每个字段下的“独一”复选框,这个复选框的作用在于使得此字段具有独一性(unique),即同字段不能有相同的数据。请按如下步骤设置独一性。
1、管理登录,进入修改“活动报名表”页面。
2 、在字段设置模块中,勾选字段“name”下的“独一”复选框(上图红圈5)。
3、保存
来到用户界面,打开“活动报名表”,添加一行记录,在字段“name”下填入“李明”,会得到提示“违反unique约束,本字段在第3行有相同记录”,因为第3行B列已经有“李明”了,独一性约束使得您不能再输入一个“李明”
独一性约束有两个作用
一、限制输入。如上例,限制同一字段下不能输入相同的数据。
二、作为保存报表编辑结果的主键。在上例中,因为字段“id”是自动编号的,它天然的成为报表主键(请注意在“关闭字段设置”按钮下有“主键:id”字样表明字段id是主键,但如果没有自动编号或数据库指定的独一性字段,您就必须指定一个独一性字段作为报表主键,否则不能对报表进行添加删除和修改等编辑操作。
请做如下试验
1、管理登录,进入添加报表页面。
2、在“注册数据库”下拉菜单中选择“EXCEL表”(之前别忘了修改“EXCEL表”的数据库路径,否则会出现“E:\gmex\onlineXLS\dataStore\scores.xls不是一个有效的路径……”的错误提示。忘了如何修改注册数据库路径?请看体验.修改注册数据库路径)
3、按“打开字段设置”按钮打开字段设置模块。
4、在左侧数据表列表中选择“二1$”,请注意“关闭字段设置”按钮下“主键”后是一个下拉菜单而不是一个字段名,这表明报表没有天然的主键。
4、随便选择一个属集,如“后勤保障”。
5、保存报表,会弹出“报表还没有独一性字段,这将使得保存后的报表不能编辑,是否仍要保存?”
6、如果仍保存,来到用户界面,您会发现,报表的右下侧原“编辑”按钮处,将出现“无独一字段 不可编辑”的提示。
为什么必须要有主键才能编辑?因为对数据库记录的操作是通过主键来辨识的,只在作为主键的字段是独一的,才可能在修改删除时准确地定位到相应记录,所以主键字段一般是整数类型。也可以用文本类型字段做主键如“姓名”这样的字段,但人名有可能有重名,如果一个单位中有两个“李明”,那么修改其中一个“李明”的数据,另一个也会被修改,所以一定要保证做为主键字段的独一性。
再说说怎么设置“活动项目”字段,使得员工可以在围棋、象棋、桥牌和斗地主四项活动中进行任意多选。
1、管理登录,进入“活动报名表”修改页面。
2、点击字段设置模块中“games”下的“值域”按钮,打开“值域设置面板”。
3、在“值域设置面板”中选中“多选”(下图红圈1)
4、在“值”后(红圈2)输入“围棋”,加入(红圈3)
5、重复第4步,分别加入“象棋”、“桥牌”和“斗地主”
6、检测(红圈4)值域字符串。
7、保存报表。

回到用户界面,打开“活动报名表”,按“编辑”按钮打开报表编辑,点击“活动项目”下的单元格,您会看到编辑区如下呈现:

红圈内正是在值域设置面板中输入的多选项,员工可以在其中选择一项或多项,如果输入的数据不在此范围内,如输入“跳棋”,将会得到“输入的数据“跳棋”不在值域内”的提示。
最后还有一个问题,报名的员工应该能修改或删除他的报名信息,而且只能修改和删除他自己的报名信息,不能去动别人的报名信息。
在用户界面,用“李明”登录,您会发现无法修改李明的报名信息——因为李明没有权限。请回忆一下在电子表格型报表中,这个问题是怎么解决的,没错,行权限,请复习教程4:行权限
可是数据库型号报表的定制界面没有行权限设置模块呀?其实有的,只不过较电子表格型来的简单——就一个下拉菜单,位置如下图
如果您打开下拉菜单,会发现有三个选项——删除、修改和删改。
选择任一项,会弹出提示“没有行权限列。请打开相应数据表,在最后面添上一名为sheetrowright的字段,就可以设置行权限了”,按“确定”后会弹出窗口如下图(如果窗口显示内容为“尚未管理登录,或登录时间过长,请重新登录。”,则有可能是会话超时或没有将站点加入可信站点。请刷新一下右侧管理菜单,如果出现"非法访问",说明会话超时,请重新登录;如果不是会话超时,则是没有将站点加入可信站点中,那么请将站点加入可信站点)。

如果按下“系统自动添加”按钮,系统将会给数据表“活动报名”在最后添上一个名为“sheetrowright”的字段,就“活动报名”这个数据表,原来有“id”“name”“games”三个字段,系统添加行权限字段后,就会变成“id”“name”“games”“sheetrowright”四个字段了。
您也可以按“我自己添加”按钮,则系统不会自动添加,您就要自己打开FPNWIND.mdb数据库,给“活动报名”表加一个名为“sheetrowright”(注意全是小写,不能有大写)的字段用于存放权限信息。
字段 sheetrowright为数据库型报表的行权限字段,用于存放行权限用户名,相当于电子表格型报表的行权限区,因此如果没有此字段,则数据库型报表无法实现行权限。
数据库型报表有三种行权限:删除、修改和删改,“删除”权限可以删除记录,但不可修改记录;“修改”权限可以修改记录,但不可删除记录;“删改”则具有删除和修改两种权限。
当设置了行权限后,添加记录时用户名会自动进入行权限字段,从而获得相应行权限。
让我们用行权限来实现员工可修改或删除自己的报名信息却不能动别人的报名信息的设计。
1、管理登录,进入“活动报名表”修改页面。
2、按“报表权限”按钮,打开“报表权限设置”面板,将“其它用户”加入到报表权限用户列表中并给它读取和添加的权限。(为什么这么做?如果不给读取权限,则除了授权管理用户谁都打不开报表;如果不给添加权限,则除了授权管理用户谁都无法添加记录。)
3、在“行权限”下拉菜单中选择“删改”,在弹出的窗口中按下“系统自动添加”按钮(如果已经有行权限字段sheetrowright了,则不会弹出窗口),系统自动添加行权限字段后,会刷新修改页面导致刚才的设置失效,所以要再一次在“行权限”下拉菜单中选择“删改”,因为已经有了sheetrowright字段,这一次不会弹出窗口。
4、将sql语句改成“select id as 序号 ,name as 姓名,games as 活动项目,sheetrowright as 权限 from
活动报名”,预览。
5、保存报表。
来到用户界面,用“张强”登录,按下“编辑”按钮,打开报表编辑区,按“添加”按钮,注意“张强”被自动添加到“权限”字段里,表明对于这一行“张强”有“删改”权。试着在这一行上输入信息,按“保存”按钮保存输入结果。
试着对张强的信息进行修改,可以修改;再试着对李明的信息进行修改,发现不能修改,提示“无修改权限”
试着删除张强这一行,可以删除;再试着删除李明这一行,提示“因权限不足,不能删除”。
如果不想让用户删除自己添加的行,可将行权限设为“修改”。
系统变量~username~:sql语句定制中也可以使用系统变量~username~,如“select * from 订单 where employee='~username~'”(注意要用单引号引住),系统会在任何遇到~username~的地方将其替换成当时的登录用户名。
sql语句定制还可以对记录进行分组汇总,比如在订单中对员工的销售额进行分组汇总
1、管理登录,进入添加报表页面。
2、选择注册数据库“中国风”
3、进入sql定制页面,在sql语句文本框中输入“select employee as 员工,sum(sales) as 销售合计 from 订单 group
by employee”,预览。注意,如果sql语句中有聚集函数或连接表,将只可查看,不可编辑。
sql语句也可以有连接表,请试一下“select P.产品名称,S.公司名称 from 产品 P inner join 供应商 S on P.供应商ID=S.供应商ID”
sql定制能实现sql查询语句的大多数功能,您不妨自己试一试。
补充说明几点如下:
1、如果表名中有标点符号或空格,请用“[”和“]”引住,如
select * from [Order Details]
select * from [二1$]
如果用join连接表,最好也用方括号将表名括起如 [products] P inner join [orders] O
2、数据库型报表中使用公式,合并单元格均无效。
3、数据库型权限字段所在列不能被编辑(提示“权限列不编辑”),如果确实想编辑怎么办?另外定制一个sql查询报表,将权限字段放在前面即可,因为只要权限列字段不在最后,它就认为是非权限字段从而可以被编辑