报表定制
报表分为电子表格型报表和数据库型报表。
电子表格型报表没有数据源,它的所有数据和格式都以HTML数据格式的形式保存于系统数据库中。每10个单元格所用数据库空间大小约为1K,过大的电子表格型报表(超过200行)会造成系统数据库迅速膨胀,而且过大的电子表格型报表在保存报表编辑结果时会十分缓慢,所以,电子表格型报表只宜用于行数不超过200行的小型报表,如果行数超过200行,建议使用数据库型报表。
为了防止电子表格型报表过大造成系统数据库膨胀,系统对电子表格型报表有一个大小限制(1024K),如果确实需要突破这个限制,可以进行管理登录,到“系统常量”下的“设置常量”中进行设置,设置项目为“组件XML保存最大长度”。
电子表格型报表的字段数据类型有三种——文本、数字和日期,设置了相应的数据类型,在进行报表编辑时就会进行数据类型合法性检查,如果数据类型不一致,输入将会被拒绝。例如,将F列设置为日期类型,在用户界面,修改此报表的F列时,如果输入的数据不是日期,就会弹出“这是一个日期字段,*****不是一个合法日期,请重新输入”
如果设置了字段的独一性,则当输入的数据与同列已有的数据相同时,会被拒绝输入并弹出提示“违反unique约束,本列在第**行有相同的纪录。”
如果设置了字段的值域,则输入的数据超出值域时,会被拒绝输入并弹出提示“输入的数据不在值域内。值域为***”
有三种值域类型——区间、单选和多选
区间:用于限制数据在某一范围内,如大于0小于100;“and”和“or”是逻辑连接符,“and”是与,“or”是或,如“大于0小于100”为“ $$>0
and $$<100”,“等于0或等于100”为“$$=0 or $$=100”,其中“$$”代表的是本字段;圆括号“(”和“)”用于规定逻辑条件的优先级,加圆括号的逻辑表达式要优先于没有加圆括号的逻辑表达式;如果字段是文本数据类型,则系统会自动于首尾加上一个单引号,如果字段是日期型,会自动于首尾加上一个“#”(数据库型报表中,如果是SQLServer日期型,则会自动于首尾加上单引号)。
单选:单选有“值”和“名”两个输入项,“值”用于单选项的真实值,“名”用于单选项的显示名,单选项形成的字符串形式为“值**名”,如“男**0”。多个单元项用逗号分开,如“男**0,女**1”;“名”输入项只在数据库型报表中有效,在电子表格型报表中无效,即便设置了“名”,电子表格型报表依然按“值”显示。
多选:此版本下的足易在线EXCEL,无论是数据库型报表还是电子表格型报表,多选中的“名”输入项均无效。多选项目之间的分隔符默认为逗号,但可以改变,只需在“多选”后的文本框中输入自己的分隔符即可,如下

报表的权限设置将下一节“权限”中详细说明。
关于电子表格型报表的几点说明
1、报表被锁定:当管理员正在编辑电子表格型报表或进入编辑页面后没有保存就离开,就会出现报表被锁定的情况,这样的设计是为了防止当管理员进行报表修改时,用户同时报表编辑而造成冲突。要进行报表解锁,有两种方式,第一种是管理登录,进入报表修改页面,重新保存报表;第二种方式是以对报表有管理权限的用户身份打开报表,在报表的编辑区会出现“报表解锁”按钮,按此按钮即可解锁。
2、输入超长数字代码时,如果自动变成科学计数法——如手机号码13798450334变成1.3798E+10——可在数字代码前加单引号’,数字代码就正常显示了;对于数据库型报表也是如此,这里单引号只起到标志作用,并不会进入数据库记录中。
3、编辑电子表格型报表时,如果需要粘贴数据,只粘贴需要的区域,不要粘贴整行或整列,否则将大大增加报表的大小。
4、电子表格型报表不能作为透视表的数据源。
数据库型报表的字段数据类型是自动被系统确定的,无需进行设置。数据库型报表的字段数据类型主要分为文本、数字、日期、布尔,二进制五种类型,其中日期类型又分为ACESS日期类型和SQLServer日期类型。
如果字段为自动编号,将会在独一性部位显示“自动增长”;如果字段在数据库中被设置为unique,则会显示“原始独一”;如果要对报表进行编辑,则必须有一个字段作为主键;如果字段为自动编号,将会被选择为主键;如果没有自动编号的字段,则原始独一字段将会被选择为主键;如果有多个原始独一字段且为同一数据类型,将按字段的先后顺序决定,排在前的为主键;如果多个原始独一字段的数据类型不一样,将按数字-文本-日期的顺序决定主键;如果既没有自动编号,又没有原始独一,则必须进行人工指定,通过指定主键或设置独一都可以达到此目的,如果指定了主键字段,则以指定的字段为主键字段;如果没有指定主键,而是设置了独一,则以独一字段为主键字段。
在设置值域或字段筛选时,如果是文本或SQLServer日期,会自动给输入值的首尾加上单引号;如果是ACCESS日期类型,会自动加上“#”。用sql语句定制报表时,如果用文本或SQLServer日期进行筛选,请用单引号将筛选条件引住,如select
* from 订单 where employee='李明';如果用ACCESS日期进行筛选,请用“#”引住,如select * from 订单 where
orderdate>=#1998-1-1#
数据库型报表的行权限保存在一个名叫"sheetrowright”字段中,称为权限字段,这个字段必须在最后,否则当作一般字段处理。权限字段可以通过系统自动添加,也可以自己手动添加,手动添加只需打开相应表,在最后添加一个名为“sheetrowright”(字段名必须全为小写,不能有大写)的文本型字段就可以了。EXCEL数据库不能通过系统自动添加权限行,要打开相应的EXCEL报表,在现有列的最后添加一名为“sheetrowright”的列就可以了。
以下是关于数据库型报表的几个说明
1、注册数据库为SQLServer时,如果字段中包含timestamp类型字段,添加记录时就会出现“多步操作产生错误。请检查每一步的状态值。”错误,因此在字段设置模块中不要保留此类型的字段。
2、 如果字段类型为二进制,将只显示[binary]并且不可编辑,在字段设置模块中最好不要保留此类字段。
3、大文本类型字段如备注和二进制类型字段不能设置独一和用于字段排序。大文本类型字段在字段设置模块中有“(*)”标志,二进制字段有“(&)”标志。
4、如果字段有外键约束,字段设置模块内字段名后会有“(#)”标志,在用户界面的报表区,点击有外键约束的字段列,会在编辑区出现“#”按钮,如下图:

点击“#”按钮会弹出主键字段的值列表,如果对有外键约束的字段列进行添加或修改所输入的值不在主键字段已有数据范围内,将会被拒绝输入。
5、严苛字段是既没有默认值又不允许为空的字段,如果在定制报表时,严苛字段没有被保留,则在添加记录时操作将失败。因此如果没有保留严苛字段,在保存报表的过程中会出现提示“未列入的字段是严苛字段(无默认值也不允许为空)”。如果强行保存,在报表添加新记录时会出现“由于其
Required 属性设置为真(True),字段 '???' 不能包含 Null 值。在此字段中输入一个数值” 的错误。
6、如果报表的字段中有名为如position,password等的数据库关键字,将有可能打不开报表,即使打开,所有的编辑操作都将产生错误。
7、字段别名中不能有标点符号。
8、如果记录中的某个字段是其它数据表的外键时,删除记录会失败,出现类似“DELETE 语句与 COLUMN REFERENCE 约束 'FK_Order_Details_Products'
冲突。该冲突发生于数据库 'Northwind',表 'Order Details', column 'ProductID'。”这样的错误提示;在修改记录也会失败,出现类似“由于表
'inventory_fact_1998' 中了包含相关记录,不能删除或改变该记录。”。 要解决此类问题,请在数据库相应表中设置级联删除或修改。
9、请注意触发器给报表编辑带来的影响,比如表中有触发器防止记录被删除,删除记录时就会出现如“XXXX cannot be deleted. They can
only be marked as not active.”的错误提示。
10、excel型报表不能真正删除记录,只会将记录的所有列全置为0 ,因此在定制报表时,请设置筛选将主键为零的记录筛除掉。
11、添加记录时,如果出现“在此情况下不允许操作”的错误提示,一般是因为有数据重复冲突。例如,某个字段是原始独一性字段,而它又没有被保留,于是当增加第一个记录时,这个记录会用此字段的默认值填充字段,添加成功;但添加第二个记录时,因为仍试图用默认值填充字段,于是与此前添加的记录冲突,产生错误。
12、如果出现添加记录成功后却看不到添加的记录,有两种可能:一、添加的记录不在当前页面上,这种情况下可以通过翻动页面或进行搜索查找;二、报表的筛选设置将此记录筛除掉了,如增加一个ID=100的记录,但报表的筛选条件是显示ID<80,那么这条记录虽然已经进入数据库,也将无法看到,除非管理员改变筛选条件。
13、数据源为ODBC的报表无法自动检测出原始独一性和是否允许为空及默认值,因此在自动设置独一性和检查严苛字段时会和数据库不一致,因此在设置此类型报表时,要查看数据库各字段的独一性,是否允许为空及有无默认值,以做相应的设置
。
14、 sql定制中,sql语句中用join进行表连接时,表名最好要用[ ]括起。如
select c.id as 序号,c.name as 姓名,c.bname as 简名,l.sex as 性别,l.birthday as 生日 from
[ccte] c inner join [clerks] l on c.id=l.id
15、 sql定制中,sql语句的查询主语不能用子查询,如select id, (select name form table2 where table2.id=id)
form table