帆软报表使用记录

最近使用帆软报表开发,对使用中不会的地方简单记录下来以备后用。

1. 查询按钮:

添加查询按钮,并为其增加点击事件。为事件增加javascript脚本:

if (this.options.form != null && $.isFunction(this.options.form.formSubmit)) {
this.options.form.formSubmit({
url : “${servletURL}?op=fr_dialog&cmd=parameters_d&sessionID=${sessionID}”,
asyn : true,
callback : function(res, status) {_g().loadContentPane();}}
);
var self = this;
_g().once(“afterload”, function() {
self.enable();
})
}

2. 查询前看不到报表:

在“参数界面”里面点击表单左上方的工具图标(一个扳手和一个锤子交叉的图标),去掉“点击查询前不显示报表内容”前面的复选勾。

3. 下拉数中第n+1级节点数据使用第n级节点的值:

为第n+1级的数据查询的sql语句增加: and line_id=’${layern}’。参数layer+层级n。line_id为该查询条件的数据列。

4. sql使用参数:

sql语句中使用参数:${param_name},如果参数为字符串,增加引号‘’。如果允许参数为空时使用默认值:’${if(len(param_name)==0,”%”,param_name)}’

5. 设置序号列。序号列显示该数据行所在的行数:

=SEQ()。如果是填报报表且除第1行外不能自动填充,请参见17条。

6. 设置某单元格的显示值与实际值:

实际值:直接将sql查询中相应字段拖到该单元格,例如:ds1.G(JH_SGTYPE)

显示值:1)来自数据库或数据集:选中单元格,点击属性窗口“单元格属性表-形态”。选择数据字典,然后选择数据查询或数据库表并做相应设置。

2)有限列表情况下(如db值范围为1-3):switch(E6,1,’I’,2,’II’,3,’III’)。 E6表示单元格

7. 超链接(新增/编辑)

选中要设置的单元格(如行号、新增等),邮件单击,选中超链接。在弹出对话框中点击添加按钮,选中网络报表。在右侧选中要链到的报表,如果需要传递参数(如本行的id,位于A6单元格),则增加一个参数,为该参数取个名字,其值选中公式,并输入A6。

8. 设置填报属性

选中要设置的单元格,右键单击,选择控件设置。相应设置后确定。点击工具栏中“填报预览”查看效果。

9. 以可编辑状态打开报表

从菜单或列表页面打开添加、编辑报表时,报表默认是不可编辑的。需要在超链接中增加参数:&op=write

10. 填报报表新增、保存(及未出现工具条问题)

点击“服务器”菜单,选择服务器配置,选中填报页面设置选项卡,勾选使用工具栏前面复选框。

11. 引用js(css同理)

将js放置到WebReport目录或其子目录下,在报表设计器中点击“服务器”菜单,选择“报表服务器参数”。在弹出对话框中选择“引用javascript”选项卡,并选择相应js,添加到列表,点击确定即可。

12. 隐藏行/列

选择要隐藏的行/列,在选择的行/列上右键单击,选择条件属性。添加一个条件属性,并选择“行高”/“列宽”,并将值设为0。

13. 单元格/数据集ds1.G(ID)为空时自动产生id

某单元格设置为ds1.G(ID),当其为空时,自动产生id,if(len(ds1.G(ID))==0,UUID(),ds_complete.G(ID))

14. 动态获取、设置某单元格值

在程序运行中通过点击某个按钮等操作来获取、设置某单元格的值:

获取:1)contentPane.curLGP.getCellValue(“K8”); 2)为javascript脚本添加参数,如下图;3)当前单元格:this.getValue();

设置:contentPane.setCellValue(“K8”,null,status); contentPane.curLGP.setCellValue(“K8”,null,status);

Snap1

15. 联动(级联)

有时候,存在数据级联的情况。比如有两个下拉列表(下拉树),当第一个的值改变时,第二个列表也需要动态改变。

1)下拉列表/下拉树(查询菜单或两个存在联动关系的单元格):

例如:D4单元格是一个关于铁路线路(京沪、京广等)的下拉列表,B2单元格是关于铁路线上的车站(北京、济南、南京、上海属于京沪线)的下拉列表。

设置B2的数据集:select * from TB_STATION where Lineid=’${D4}’。即参数直接设置为B2单元格。

2)填报报表中的级联(单元格A3改动,单元格A4随之变动):

A3,B3,A3选择值后,B3赋予与A3所选项相关的值。如A3为下拉列表,值为所选项的名称,B3为所选项的代码信息。

B3单元格增加公式:

if(len(A3)==0,””,sql(“orcl”,”select code from tb_line where id='”+A3+”‘”,1,1)),B3单元格的“插入行策略”选择“原值”(请参考17条)

16. 下拉树

经常遇到需要使用下拉树的情形。如公司的组织架构采用树形结构。在此情形下,需要使用下拉树控件并设置数据集。主要有两种情况:

1)单一数据集:如公司组织架构存放在一个表中,该表格存在parentid或采用字符前缀表示组织关系的字段。在此情况下,需要先建立一个基于它的查询:select * from tb_org

然后,建立一个“树数据集”,并选择该查询作为数据集来源。如下图所示

Snap1

2)多数据集:如线别和车站的关系。铁路线(京沪、京广)存放在一个数据表tb_line中,车站(北京、济南)存放在tb_station中。

17. 行式报表第一列序号不能自动产生

一个行式报表,第一列设置为序号SEQ()。第一行带有序号1,但后面的行却无法自动产生。选中第一列单元格,左侧属性窗口中点击其它属性,从中设置插入行时插入“原值”。如下图

Snap1

18. 单元格编辑后动态校验/执行某操作

有些时候,我们需要在某个单元格A2编辑结束(值改变)后执行某个操作,如动态查询数据库。例如:要增加2013年的一个表格,但每年只能有一张报表。那么当用户输入2013后,需要调用数据库select count(*),如果值为1,则提示用户。(目前的方法都存在问题)

方法1:(本方法无法获取A2改变后的值)单元格A2设置编辑结束事件,并在参数中使用sql公式,如下图:

1

方法2:(本方法很多时候会弹出正在校验的对话框并卡死)

A2单元格编辑结束事件中输入:_g().verifyReport();然后点击模板-填报报表属性,校验公式中输入要校验的公式和校验失败时要提示用户的信息。如下图:

Snap1

19. 下拉树返回值只取叶子节点

使用下拉树时,如果有多层,得到的返回值是用逗号分隔的从根到叶子的值的连接字符串,如:root,level1,level2,level3。取叶子节点level3的方法有以下方法:

1)在引用的时候 分割逗号取最后叶子;2)在树上写编辑后js

var a = this.getValue();
var mm = this.getText().split(‘,’);
this.setValue(a[a.length-1]);
this.setText(mm[mm.length-1]);

Snap1

20. 设置报表单元格可写、可见属性(权限)

1)单元格可写(对控件):

var w = contentPane.getWidgetByCell(“B8”);
w.setEnable(false);

对于连续的区域,可以通过循环进行控制。FR自定义的有字母与数字的转换函数:

FR.letter2Digit(abc)   // “A”->1

FR.digit2Letter(k)     // 1->”A”

例:操作单元格C7-AO7:

for(var i=3;i<42;i++){
var letter=FR.digit2Letter(i);
contentPane.getWidgetByCell(letter+7).setEnable(false);
}

对于可扩展行的行式报表,如果使用以上方法进行控制(为报表添加加载结束事件)会存在问题。可以直接选中那一行的控件,在控件的初始化事件中 写this.setEnable(false);

Snap1

2)单元格可见:

a. 在条件属性中设置行高、列宽(对整行、列有影响);

b. 在条件属性中设置新值(条件属性,选择“新值);

21.删除

每行记录添加一个复选框,为复选框增加初始化后事件:

if (!window.lineboxes) {
window.lineboxes = [];
}
lineboxes[lineboxes.length] = this;

为工具栏定义一个按钮:

if(window.lineboxes) {
var cells = [];
for (var i = 0; i < lineboxes.length; i++)
{
if (lineboxes[i].selected())
{
cells[cells.length] = lineboxes[i].options.location;
}
}

contentPane.deleteRows(cells);
contentPane.writeReport();
}

点击模板-报表填报属性。里面增加提交入库事件,使用智能提交模式。

如果是主子表,当前报表中的是主表记录,则在sql2的提交事件中添加外键列。外键列勾选上“主键”的复选框(这个主键和数据库的主键不是一个概念)。

Snap1

22. 导入excel

要导入的excel数据位置与fr报表中控件的位置须对应。如要导入A2-N2,则excel中必须也在A2-N2的位置。

若用户希望Excel导入的是名字,但实际入库的是ID,可以在报表填报属性中使用map函数转换。

导入excel2007需要额外加入一个poi2007_fat.jar包。此外,序号一列必须去掉公式(如seq()),否则会导入不进去。可能是软件的bug。如需自动产生序号,请为它添加一个条件属性,选择“新值”,公式为row()-1

23. 提报成功弹出提示并刷新(父)页面

提交入库之后需要知道是否成功并对用户做出提示或做后继处理。点击“填报预览”旁的齿轮按钮,为报表添加填报成功事件。

Snap1

刷新父页面:FR.Msg.alert(“提示”,”填报成功!”,function(){parent.location.reload()});

刷新本页面:FR.Msg.alert(“提示”,”填报成功!”,function(){location.reload()});

如果是在按钮控件里面做提报,须额外增加下面的js:

_g(‘${sessionID}’).verifyAndWriteReport();

24.

This entry was posted in Computer. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s