找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,极速登录

请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
Leo.Tsai(uid:238588)
职业资格认证:无
JS解决下拉框数据量大时查询慢的问题
1. 描述在使用下拉框,若遇到下拉框中的数据量很大时,比如有上万条选项,这时浏览器加载就会很慢甚至出现死机。需说明的是:其在正常情况下,最多是 8000 条左右。倘若超过此上限时,怎么解决使之在数据量大时能够快速定位呢?注:在 6.5.5 之前版本才会出现如上问题,6.5.5 下拉列表中的数据是异步加载,因此不会出现加载很慢的现象。 2. 思路用文本框,点击一个按钮时,引用一个js,使其弹出一个对话框,对话框中嵌入下拉项的模板(因模板中的数据量是不受限制的),在此模板列出的所有下拉项中,选择某条记录,点击确定后,就把选择的对应值赋给文本框,且与此同时也会把对话框关闭。效果如下:https://help.fanruan.com/uploads/201807/20180723175225_6525.pnghttps://help.fanruan.com/uploads/201807/20180723175225_9713.gif 下面介绍如上问题的解决方案,如上两个模板的制作:下拉选项的模板与参数界面选择的模板 3. 实现步骤—参数界面3.1 子模板设计3.1.1 方法一新建工作簿,添加数据集 ds1,SQL 语句:SELECT * FROM STSCORE将数据列 name 拖拽到 B1 单元格中并设置其控件类型为文本型,控件名称为 record,如下图:https://help.fanruan.com/uploads/201807/20180723175225_3395.png 点击模板>模板 Web 属性>填报页面设置,添加一个自定义按钮,将按钮名称设置为确定,并添加其他按钮,给自定义按钮增加如下 JS 代码:var currentCell = contentPane.curLGP.currentTDCell; //当前选中的单元格 var val = FR.getCellValue(currentCell); //拿取当前选中的单元格 var form = window.parent.form; //拿取当前页面的父窗口(即获取参数界面的form) form.getWidgetByName("p1").setValue(val); //给文本控件p1赋值val window.parent.FR.closeDialog(); //确定获取值后,关闭取消父窗口的对话框 window.parent.FR.destroyDialog();https://help.fanruan.com/uploads/201807/20180723175225_8452.png 将模板保存为:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameter\下拉框数据量大-参数界面子报表.cpt 3.1.2 方法二新建工作簿,添加数据集 ds1,SQL 语句:SELECT * FROM STSCORE将数据列 name 拖拽到 B1 单元格中并设置其控件类型为文本型,控件名称为 record。右击 B1 所在单元格,点击超级链接,弹出超级链接对话框,添加 JavaScript 事件,给参数 val 赋当前单元格的值,JS 代码如下:https://help.fanruan.com/uploads/201807/20180723175225_4978.png?version=1&modificationDate=1509433595000&api=v2var form=window.parent.form; //获取当前页面的父窗口 form.getWidgetByName("p1").setValue(val); //给文本控件的格子(B1)赋值val window.parent.FR.closeDialog(); //确定获取值后,关闭取消父窗口的对话框 window.parent.FR.destroyDialog();实际上相当于一个窗口控件,可以在窗口中设置条件查询,然后选择需要的参数。而且,当主模板的文本控件名规范的情况下,子模板可以用于多个主模板。 3.2 主模板设计新建数据集 ds1:SELECT * FROM STSCORE将所有字段拖拽到 A2-F2,按照如下样式设计模板:https://help.fanruan.com/uploads/201807/20180723175225_8781.png双击 A2 单元格,添加过滤条件,姓名字段用 $p1 过滤,子模板里将对话框里获取到的姓名赋值给了 $p1,如下图:https://help.fanruan.com/uploads/201807/20180723175225_5226.png 切换到参数设计界面,添加一个文本类型控件,并将控件命名为 p1,如下图:https://help.fanruan.com/uploads/201807/20180723175225_2372.png 再添加一个按钮类型控件,并将按钮命名为“选择记录”, 添加点击事件,写入如下 JS 语句:https://help.fanruan.com/uploads/201807/20180723175225_4887.png window.form = this.options.form; var $iframe = $(""); $iframe.attr("src", encodeURI(encodeURI("${servletURL}?viewlet=doc/Parameter/下拉框数据量大-参数界面子模板.cpt&op=write"))); var o = { title : "请选择记录项", width : 460, height: 350 }; FR.showDialog(o.title, o.width, o.height, $iframe,o);添加一个查询按钮,如下图:https://help.fanruan.com/uploads/201807/20180723175225_6310.png将模板保存为:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameter\下拉框数据量大-参数界面主报表.cpt3.3 分页预览选择下拉框数据量大-参数界面主报表,点击分页预览,点击选择记录按钮,效果如上。在线查看模板效果请点击 数据钻取主报表.cpt 4. 实现步骤—填报界面上述实例是在参数界面下,如果在填报页面下,上述 JS 有所改动,如下。4.1 模板修改1)子模板打开%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameter\下拉框数据量大-参数界面子报表.cpt,把子模板中的工具栏自定义按钮的 JS 事件代码修改如下:var currentCell = contentPane.curLGP.currentTDCell; //当前选中的单元格 var val = FR.getCellValue(currentCell); //拿取当前选中的单元格 var form = window.parent.contentPane; //拿取当前页面的父窗口(即获取填报界面) form.setCellValue(0,1,val); //给文本控件的单元格(A2)赋值val,0代表第一列,1代表第2行 window.parent.FR.closeDialog(); //确定获取值后,关闭取消父窗口的对话框 window.parent.FR.destroyDialog();2)主模板新建一张 cpt 模板,在 A2 单元格添加一个文本控件,B2 单元格添加一个按钮控件,按钮控件添加点击事件,JS 如下:window.form = this.options.form; var $iframe = $(""); $iframe.attr("src", encodeURI(encodeURI("${servletURL}?viewlet=doc/Parameter/下拉框数据量大-参数界面子模板.cpt&op=write"))); var o = { title : "请选择记录项", width : 460, height: 350 }; FR.showDialog(o.title, o.width, o.height, $iframe,o);4.2 填报预览主报表,点击填报预览,点击按钮,效果如下图:https://help.fanruan.com/uploads/201807/20180723175225_1457.gif 编辑于 2021-7-13 16:39
教您多人填报时如何防止内容覆盖
经常会有用户反映使用填报功能的时候,多人同时填报可能会出现,后填报的覆盖掉先填报的问题。那么怎么才能实现多人填报互不干扰呢,其实思路很简单,只需要在数据库表中新增一个主键:填报人ID。这样就能将不同人填写的内容分别写成新记录,而不是覆盖掉。这边给大家提供了一个示例,让我们一起来看看怎么实现的。 1. 设计数据库表 数据库表中新增 4 个字段,将填报人和订单ID同时设置为主键。 144623 2. 设计填报表格 填报时只要填 3 个字段就行,填报人字段是为了防止填报覆盖的,这个后面我们会将它设置成自动填入数据库表中的。 144624 3. 设置填报属性 注意这里我们要将填报人字段的值设置为公式:$fine_username,这样提交时会将填报者的用户名填写到数据库填报人这个字段中去。 所以我们需要设置登录才能填报,这样才能用 $fine_username 获取每个人的用户名 144625 4. 填报演示 将这个报表挂载到决策系统中,让用户先登录再填报。 144626 这里用2个用户给大家演示下,分别是用户名为Alice跟Lily的用户。 Alice 先填报: 144627 Lily 后填报: 144628 她们都提交成功后,数据库表信息如下图,我们可以看到,订单ID是数据库表的一个主键,Alice 和 Lily 都填报了相同的订单ID,但是没有出现覆盖。 正是由于用户名作为联合主键,可以让她们生成各自的记录。 144629 5.模板下载 这个模板是连接的我自己的 SQL Server 数据库,所以预览模板时没啥用哈,您可以自己建一个表试试 144630 编辑于 2021-6-18 15:47
JS实现编辑结束后回车插入行
1. 概述 1.1 预期效果填报时,页面上不想添加插入行按钮,希望实现当编辑完本行最后一个单元格时,点击回车插入一行。预期效果如下图所示:https://help.fanruan.com/finereport/uploads/20210126/1611641620460359.gif1.2 实现思路给最后一个单元格的控件添加「编辑结束」事件,通过 JavaScript 代码实现。2. 示例 2.1 报表设计给 A2 、 B2 、C2 单元格分别添加一个文本控件,A2 单元格扩展方向设置为纵向扩展,输入对应标题,如下图所示:https://help.fanruan.com/finereport/uploads/20201124/1606205830321118.png2.2 添加事件选中 C2 单元格,在「控件设置>事件」里添加「编辑结束」事件。先添加一个参数 row,值选择「公式」输入 row(),获取当前行号。再输入 JavaScript 代码如下:setTimeout(function(){ contentPane.appendReportRC(1,"A"+row);//在选中行后面插入 1 行 },200)注:appendReportRC 只适用于填报报表。 https://help.fanruan.com/finereport/uploads/20210126/1611643733552038.png2.3 报表填报属性设置点击菜单栏「模板>报表填报属性」,增加一个「内置SQL」提交,选择数据库 FRDemo 中的 「销量」表,智能添加表格中涉及的字段和对应的单元格,如下图所示: https://help.fanruan.com/finereport/uploads/20210126/1611643969225328.png2.4 效果预览保存报表,点击「填报预览」,效果同 1.1 节预期效果一致。注:不支持移动端。3. 模板下载已完成模板可参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Form\JS实现编辑结束后回车插入行.cpt点击下载模板:143613 编辑于 2021-5-6 11:01
填报预留指定行数
1. 概述 1.1 预期效果填报报表初始化预览的时候,预留指定行数的空白行以供填报。如下图所示:预留三行空白行可供录入。https://help.fanruan.com/finereport/uploads/20210324/1616574544917024.png1.2 实现思路新建「内置数据集」增加空白行作为指定行数,再使用关联数据集将数据集关联起来。2. 示例 2.1 准备数据1)新建数据集查询 ds1,输入 SQL 查询语句为:SELECT * FROM 区域销售https://help.fanruan.com/finereport/uploads/20210316/1615867410KPHE.png2)新建一个内置数据集,内置数据集的列名与数据集 ds1 查询结果的列名保持一致。并插入指定行数的空白行。如下图所示:https://help.fanruan.com/finereport/uploads/20210316/1615867458YveO.png3)新建一个关联数据集,勾选上述两个数据集,点击「确定」。如下图所示:https://help.fanruan.com/finereport/uploads/20210324/1616574785862361.png2.2 报表设计输入标题名称,将关联数据集中的字段拖入 A2、B2单元格中,并给 A2、B2 单元格添加「文本控件」。如下图所示:https://help.fanruan.com/finereport/uploads/20210324/1616574970909534.png2.3 设置报表填报属性点击菜单栏「模板>报表填报属性」,添加一个「内置 SQL」提交,具体设置如下图所示: https://help.fanruan.com/finereport/uploads/20210324/1616575143640732.png2.4 效果预览 2.4.1 PC 端保存报表,点击「填报预览」,效果如下图所示:https://help.fanruan.com/finereport/uploads/20210324/1616576561583200.gif填报成功后再刷新页面,又会出现三行空白行,如下图所示:https://help.fanruan.com/finereport/uploads/20210324/1616576530432759.png2.4.2 移动端App 端和 HTML5 端均支持,效果如下图所示: https://help.fanruan.com/finereport/uploads/20210324/1616576731711730.jpg2.5 应用扩展若希望填报预览时,已有的数据不可编辑,只能在预留的空白行录入数据,可将 A2、B2 单元格原本的控件清除,在条件属性中添加「控件」,设置条件为:单元格等于内置数据集中的数据列时,控件可见可用。如下图所示: https://help.fanruan.com/finereport/uploads/20210324/1616577033816752.png3. 模板下载已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\LineForm\填报预留指定行数.cpt点击下载模板:143612
下拉复选框实现同时填报多条数据
1. 概述 1.1 预期效果有时候用户希望在填报时通过「下拉复选框」勾选多个值,来实现一次录入多条数据并提交入库,预期效果如下图所示:​https://help.fanruan.com/uploads/20200927/1601193346371658.png1.2 实现思路设置「下拉复选框控件」的返回值类型为「数组」,在填报属性中选择「智能提交类型」并且不设置「主键」,实现一次提交多条数据入库。注:若要实现只提交一条数据包含多个值时,将返回值类型设为「字符串」即可,详情可参见:下拉复选框多选值进行填报时出现的问题及解决方案 。2. 示例 2.1 准备数据新建数据库查询 ds1,SQL 语句为:SELECT * FROM 销量2.2 表格设计1)在 A1、B1 单元格分别输入「地区」、「销售员」作为表头。2)在 A2 单元格添加「文本控件」。3)在 B2 单元格添加「下拉复选框控件」,设置控件的返回值类型为「数组」,并设置下拉复选框控件的「数据字典」,类型设置为「数据库表」,数据库为「FRDemo」,实际值和显示值都是「销售员」。步骤如下图所示:https://help.fanruan.com/uploads/20200927/1601194271111572.png2.3 设置报表填报属性1)点击「模板>报表填报属性」,添加「内置SQL」提交,选择 FRDemo 数据库中的「销量」表;2)点击「智能添加字段」,选择「地区」和「销售员」;3)点击「智能添加单元格」,地区绑定单元格 A2,销售员绑定单元格 B2。如下图所示:https://help.fanruan.com/uploads/20200927/1601194476237047.png注:报表填报属性不能设置主键,因为当主键存在时,复选框的返回值作为一个数组并没有办法自由扩展进数据库。此时的解决方法是使用自增主键,此时主键会随填入数据自动扩展,应当注意的是,自增主键在填报时无需录入即可自动随填入数据增长以MySQL为例,建表时勾选主键自增,如下图:https://help.fanruan.com/uploads/20200223/1582462455880163.png2.4 效果预览1)PC 端 保存报表,点击「填报预览」,文本控件输入地区,下拉框选择多个销售员,即可一次填报多条数据,效果如下图所示:https://help.fanruan.com/uploads/20200927/1601193346371658.png2)移动端App 端和 H5 端均支持,效果如下图所示:https://help.fanruan.com/uploads/20200927/1601198549149169.gifhttps://help.fanruan.com/uploads/20200927/1601199677133403.png 3. 模板下载已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\LineForm\下拉复选框同时填报多条数据.cpt点击下载模板:143611 编辑于 2021-5-6 09:38
JS实现单元格之间连线(流程图)
1. 概述 1.1 预期效果 报表设计中,要实现单元格之间进行连线,类似流程图图之间的连线,如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612334933OFgb.png1.2 实现思路通过开源的 JS实现:jsplumb可以实现在页面对象之间进行连线的功能。可以自定义连线样式,锚点位置,也提供了页面交互的功能。通过 JS 将图中所示的四个单元格进行连接:https://help.fanruan.com/finereport/uploads/20201225/1608860801760457.png 2. 示例 2.1 准备模板 新建模板,如下图所示,在单元格四个位置添加内容,并可以设置边框等格式。如下图所示:https://help.fanruan.com/finereport/uploads/20201225/1608861240602888.png2.2 引用 JS在「模板>模板Web属性>引用JavaScript」,输入绝对路径,点击测试连接,连接成功后点击「添加」。如下图所示: 绝对路径为:https://cdn.bootcss.com/jsPlumb/2.6.8/js/jsplumb.min.jshttps://help.fanruan.com/finereport/uploads/20210203/1612335460ZXWV.png2.3 添加事件 点击菜单栏「模板>模板Web属性>填报页面设置」,选择「为该模板单独设置」,添加一个「加载结束事件」。如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612335867pgtQ.pngJavaScript 代码如下://逐行进行代码解释 //此变量为设置连线格式,在进行连线时可以统一调用此格式,节省开发时间 var common = { //设置连线锚点,也就是连线的起点、终点在连接对象的哪个位置 //左边为起点位置,右边为终点位置 anchor: , //设置锚点类型,Dot为圆形;Rectangle为矩形;其它类型请看教程 endpoint: 'Dot', //设置连线格式,Stroke为颜色;strokeWidth为宽度;dashstyle为虚线,大小越小,则虚线越小越密集 paintStyle: { stroke: 'green', strokeWidth: 1, dashstyle: "6" }, //设置锚点格式,fill为填充方式,outlineStroke为填充颜色,outlineWidth为宽度 //此处我将fill,outlineStroke设置为none,则不再显示锚点 endpointStyle: { fill: 'none', outlineStroke: 'none', outlineWidth: 30 }, //设置连线方式,Straight为直线,Bezier为贝塞尔曲线,Flowchart为具有90度转折点的流程线,StateMachine为状态机 connector: 'Straight', //设置箭头格式,箭头可以在一条线上布置多个,此处我布置了一个 //width,length为宽高设置,location为位置,1为连线末端,0.5为中间 overlays: [ ['Arrow', { width: 8, length: 8, location: 1 }] ] } //这是启动连接的方法,通过第二个参数,可以设置这组连接的各种格式 jsPlumb.connect({ //下方的两个参数,我填写的是Id,在FineReport中,每个单元格都有独立的Id //格式如下"单元格名-页面id-0","B4-0-0"则代表第一页的B4单元格 //同样因为可以使用Element,所以后期的灵活性很高 //连接起点,可以是Id,Element,也可以是使用jsPlumb自定义的endpoint对象 source: 'B4-0-0', //连接终点 target: 'D2-0-0' }, common) //下方之后都是重复第一个方法 jsPlumb.connect({ source: 'D2-0-0', target: 'F4-0-0' }, common) jsPlumb.connect({ source: 'B4-0-0', target: 'D6-0-0' }, common) jsPlumb.connect({ source: 'D6-0-0', target: 'F4-0-0' }, common) jsPlumb.connect({ source: 'F4-0-0', target: 'B4-0-0' }, common) 2.4 效果预览保存模板,点击「填报预览」,效果如下图所示: https://help.fanruan.com/finereport/uploads/20201225/1608861100581575.png注:不支持移动端。 3. 模板下载点击可下载模板:143526 编辑于 2021-4-28 14:17
JS制作导入进度条
1. 概述 1.1 问题描述在实现 Excel 批量导入提交时,会有需要进度条的要求,即在开始导入后,出现进度条显示导入当前导入比例。如下图所示,可以做一个模拟进度条特效,实现最终效果。https://help.fanruan.com/uploads/201808/20180810113759_6152.gif1.2 实现思路通过 Excel 导入按钮,增加「Excel 导入后」JS 事件来实现效果。 2. 示例 2.1 准备模板打开报表,选择 模板>模板 Web 属性>填报页面 设置,添加一个“Excel 导入后” 事件。https://help.fanruan.com/uploads/20191206/1575617154537437.pngJS 代码如下:FR.$defaultImport('/com/fr/write/web/excel/es.js', 'js'); //-- 引用外部的CSS文件 FR.$defaultImport('/com/fr/write/web/excel/es.css', 'css'); //-- 创建一个DIV,设置相关参数(值) var div = $(''); FR.processbar =new FR.SingleProgressBar(); //--赋初值 FR.processpane = div; $(FR.processbar.element).appendTo(div); //--将DIV与BODY页面关联 div.appendTo($('body')); //--执行方法,每0.5秒执行一次 setInterval(function() { var v = FR.processbar.value; //--执行条件判断 if (v < 100) { //--每次执行的内容 FR.processbar.setValue(v + 10); } }, 500); FR.processbar.setValue(100); //--执行方法,每0.5秒执行一次 setTimeout(function() { FR.processpane.hide(); }, 500); 2.2 预览效果保存模板,选择填报预览,实现效果下图所示:https://help.fanruan.com/uploads/201808/20180810113759_6152.gif注:不支持移动端。 3. 模板下载已完成的模板,可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\填报预览JS实例\15-JS制作导入进度条.cpt点击下载模板:143525 编辑于 2021-4-28 14:12
JS解决控件值刷新不及时的问题
1. 概述 1.1 问题描述在报表页面中,需要实现点击按钮后可以对页面中一些值做运算或处理。当前在填报页面的逻辑是:控件中填入新值后,需要点击下空白区域或是执行某个其他操作,值才能被正确读取。如果想实现当控件中填入新值之后,不用做任何页面操作,填入的值就可以立即被读取到,该怎么做呢?如下图所示,通过按钮控件 Alert 处单元格的值理解其区别: A3、B3 中各输入一个值,C3 的值为 A3+B3,点击「直接相加」按钮,遵循填报页面逻辑,弹框中 B3 的值未显示,点击「优化后」按钮,弹框中 B3 的值可以显示。https://help.fanruan.com/uploads/201808/20180810093526_9443.gif1.2 实现思路用 JS 来强制跳转光标实现填入新值后可以直接被读取到。 2. 示例 2.1 设计报表1)A3 和 B3 单元格添加文本控件。https://help.fanruan.com/uploads/20191120/1574257786261420.png2)D3 和 E3 单元格添加按钮控件。https://help.fanruan.com/uploads/20191120/1574257902508378.png3)C3 单元格为 A3 和 B3 相加值,公式为:sum(A3:B3)https://help.fanruan.com/uploads/20191120/1574257972884327.png2.2 直接相加按钮的 JSD3 控件按钮名字命名为「直接相加」,添加一个点击事件,JS 代码如下:var B3 = contentPane.curLGP.getCellValue("B3");//获取B3单元格的值 var A3 = contentPane.curLGP.getCellValue("A3");//获取A3单元格的值 alert("a3的值:"+A3);//打印A3单元格的值 alert("b3的值:"+B3);//打印B3单元格的值 https://help.fanruan.com/uploads/20191120/1574258958612257.png2.3 优化后按钮的 JSE3 控件的按钮名字命名为「优化后」,添加一个点击事件,JS 代码如下:contentPane.curLGP.selectTDCell("A2");//将光标强制跳转到A2单元格,也就相当于用鼠标点击了一下A2单元格 var B3 = contentPane.curLGP.getCellValue("B3");//获取B3单元格的值 var A3 = contentPane.curLGP.getCellValue("A3");//获取A3单元格的值 alert("a3的值:"+A3);//打印A3单元格的值 alert("b3的值:"+B3);//打印B3单元格的值 JS 代码实现将光标强制跳转到 A2 单元格,相当于用鼠标点击了A2单元格,符合了报表页面赋值的逻辑。https://help.fanruan.com/uploads/20191120/1574259076775757.png2.4 预览效果保存报表,选择填报预览,效果如下图所示:https://help.fanruan.com/uploads/201808/20180810093526_9443.gif注:不支持移动端。 3. 模板下载已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\填报预览JS实例\04-JS解决控件值刷新不及时的问题.cpt点击下载模板:143518 编辑于 2021-4-28 11:38
JS实现修改填报控件透明度
1. 概述 1.1 问题描述 在制作「填报报表」时,有时希望「控件」可见不可用。此时,如果直接对控件设置可见不可用,填报预览时页面对应控件单元格呈现「灰色」效果,但我们希望它没有置灰效果,该如何实现呢?如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612319073261717.png1.2 解决思路参考文档 FineReport 控件的 CSS 样式 ,在「模板 Web 属性>填报页面设置」中添加「加载结束」事件,通过 JavaScript 代码可改变控件透明度。2. 示例 2.1 数据准备 新建普通报表,新建数据库查询 ds1,SQL 查询语句为:SELECT * FROM 订单 limit 10。如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612319297932752.png2.2 报表设计从 B 列开始输入数据,样式可自行设计,表格内容如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612319691471202.png2.3 控件设置给 B2~D2 单元格添加「文本控件」, E2 单元格添加「单选按钮组控件」。单选按钮组控件设置如下:1)取消勾选「可用」;2)数据字典设置为「自定义」,实际值为 true 时显示值为是,实际值为 false 时显示值为否;3)取消勾选「自适应」,展示列数设置为 2 。https://help.fanruan.com/finereport/uploads/20210203/1612320117161485.png2.4 添加加载结束事件点击菜单栏「模板>模板 Web 属性」,选择「填报页面设置」,选择「为该模板单独设置」,在页面下方事件设置处添加「加载结束」事件,在弹出的事件设置框中输入 JavaScript 代码:setTimeout(function() {$(".ui-state-disabled").css({'opacity':'1'});}, 500) 代码重置控件的不透明度为 1,其中 opacity: value|inherit 值说明 value规定不透明度。从 0.0 (完全透明)到 1.0(完全不透明)。 inherit应该从父元素继承 opacity 属性的值。 如下图所示:https://help.fanruan.com/finereport/uploads/20210203/1612321355511034.png2.5 效果预览保存报表,点击「填报预览」,效果如下图所示: https://help.fanruan.com/finereport/uploads/20210203/1612323426356806.gif注:不支持移动端。3. 模板下载 已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\填报预览JS实例\JS实现修改填报控件透明度.cpt点击下载模板:143517 编辑于 2021-4-28 10:50 编辑于 2021-4-28 10:51
学习层次坐标还能拿奖励?速来哇!!
一直以来您是否对层次坐标的学习有这样的困扰: 文档写的都是中文,咋就这么难理解呢? 143238 学了好久,终于看懂了概念和用法,一到实际场景应用时立马歇菜~ 143241 天啦噜!层次坐标入个门咋就这么难啊? 143249 大家不用担心,你们的 Leo 老师带着层次坐标专题来辣!! 针对大家入门难、理解难、学习周期长的问题,这次给大家带来了一份完整的学习计划。 希望通过 视频+文档+FAQ+答卷 的形式,可以帮助大家由浅入深地去学习层次坐标,降低番薯们的学习成本。 戳这里接取学习任务开始学习吧:层次坐标学习任务,完成任务后可以获取 F币 和 F豆 奖励哦~ 如果不想接任务,可以直接戳这里开始学习哈:层次坐标专题 143237 编辑于 2021-4-21 17:25
江湖纷争已起,还望大侠伸出援手!!
有道是有人的地方就有江湖。十年前一场咸甜豆腐脑之争,整个武林腥风血雨,缠斗至今也没能得出最终答案,实为八荒弟子们的一大遗憾~ 十年后的今天,文档小编的一个念头,一场新的纷争悄然生起。 还请大侠您伸出援手,投出宝贵的一票,这一次让我们彻底解决这场新的江湖浩劫! 投票内容: 帮助文档目前想要改版迭代日志,提升用户产品更新信息的获取体验,我们给出了简版和原版两种,请您给喜欢的版本投出宝贵的一票。 如果您有更好地想法,也可以直接在评论区告诉小编哦,您的建议我们会及时回复哒。 原版:https://help.fanruan.com/finereport/doc-view-3779.html,缺点是内容太多太杂乱,找不到重点。 简版:https://help.fanruan.com/finereport/doc-view-3854.html,简版的缺点是要一个个点链接进去看,麻烦费时间。
2021-01 文档月报
-->版本迭代<-- 2021年产品更新日志大改版,我们采用简短列表格式,让整体页面尽可能简洁清爽让您可以从纷繁的迭代信息中,找到自己感兴趣的那一个戳这里尝尝鲜:FR 2021-01-25 更新日志 141708 -->在线Demo<-- 1、疫情Demo上线 近日,新冠疫情在全国多地出现反弹,临近春运高峰,可预见在较长一段时间内,疫情防控工作仍不可懈怠各地政府纷纷下达了相关政策和倡导,提醒企业、学校、社区、医院等组织机构做好疫情防控工作值此春节疫情防控关键时期,FineReport 在原先开发的五大疫情主题模板基础上再新增多个防疫场景,免费开放给社会,助力各行各业做好疫情防控、保障生命安全进 官方Demo 助力抗疫目录下查看模板效果老用户获取最新模板请安装:疫情模板更新插件新用户部署疫情模板参见文档:帆软疫情应用141704 2、行业化Demo内置到设计器 所有行业化 Demo 都已经内置到设计器内需要您去官网下载 2021-01-26 及之后版本的设计器才能看到(只更新 JAR 不行)下载最新版设计器后,进入决策平台,新增行业化模板目录141705 3、移动端Demo模板自助下载 为了方便用户获取移动端 Demo 的模板,我们将所有模板放到帮助文档,供您自助下载点这里获取移动端 Demo 模板:移动端Demo -->文档共创<-- 1、文档共创规则变更 2021 年文档共创奖励标准和参与方式有了新变化,想赚取文档贡献值的番薯们赶快了解下戳这里直达:文档共创规则 2、2020年文档贡献Top10公示 2020年文档共创贡献值前10名已经新鲜出炉,公示如下,感谢各位小伙伴的辛苦付出141706 -->内容推荐<-- 应用户们的实际需求,BI 仪表板现在支持定时刷新啦安装「 BI 预览自动刷新模板插件」后,点击即可设置仪表板的定时刷新、无感刷新,并支持设置刷新频率获取插件请联系技术支持:QQ 800049425141707 -->联系我们<-- 如果您对帮助文档有任何疑问或建议,可以加入文档共创小组直接交流哦~141709 编辑于 2021-1-29 17:08
2020-12 文档月报
-->版本迭代<-- 12月产品迭代日志新鲜出炉,快来看看又实现了哪些需求吧~ FR 更新日志:2020-12-02 更新日志 BI 更新日志:2020-12-04 更新日志 -->文档优化<-- 1、文档标签改动 文档标签用于区别每篇文档的维护方式,当用户使用文档遇到问题时,可以根据标签查看相应的协助方案 本月我们对旧版标签的视觉和交互进行了优化 现在鼠标悬浮在标签上方会弹出协助方案提示框,协助番薯们解决文档问题 140502 2、文档迁移计划 帮助文档一直秉承丰富、易用、易查找的理念,但是随着文档数量变得越来越多,可维护性和易用性变得越来越差 为了优化文档架构,提升番薯们的文档使用体验,我们决定将没用到官方接口的第三方 JS 文档迁移到论坛 以后使用这些文档遇到问题时,番薯们可以走问答或者咨询文档的原作者 之后如果番薯们想写新的 JS 文档,需要确认下有没有用到官方接口 如果没用到可以发表到论坛,帖子加精也是有奖励的,帮助文档不再发布和奖励这些文档哈 140503 -->内容推送<-- 1、官方图表 Demo 迭代计划 四季度我们启动了官方图表 Demo 迭代计划,本次迭代聚焦于 Demo 简单化、场景化、易筛选、易复用, 优化点如下: 图表页面更换为多 Tab 切换样式 卡片悬浮时支持显示动态 GIF 演示 卡片悬浮时显示图表介绍、使用场景、帮助文档跳转链接 ...... 番薯们可以打开 官方Demo 的 可视化图表>丰富的可视化图表 页面进行体验, 如果您有好的建议或意见可以直接在下方评论告诉我们哦~ 140504 2、BI 实用数据分析模型汇总 对于刚刚接触 BI 数据分析的人来说 经常会有这样的疑问:数据分析为什么有时很难?为什么有时作分析不知道从何下手,只能眉毛胡子一把抓? 不用担心,我们为您汇总了一整套分析模型 对新手来说只要掌握了下面几个分析模型,基本上可以应对工作中的所有业务分析场景。 戳我直达:常用数据分析方法汇总 140505 3、BI 场景文档汇总 我们对 FineBI 的实际应用文档进行了筛选、整理、归类、排版,形成了内容合辑 基本涵盖了 FineBI 实际使用的各个方面,汇总文章按难易程度 内容模块整理分类为不同的篇章,带您轻松学习各类场景 戳我直达:FineBI应用教程干货合集 4、BI 数据分析指标拆解方法 进行 BI 数据分析的第一步就是在拿到数据后,确定从哪些角度进行分析,也就是如何进行数据指标的拆解。 从而建立自己的指标体系,达到分析目的。只需一篇文档教您如何轻松进行数据分析。 戳我直达:数据分析指标拆解方法 5、BI 短视频教程 文档字多看不下去?视频太长没有耐心?学到一半没了兴趣? 不用担心,BI 短视频教程来辣,给我一分钟,还您一个完整的知识体系 戳我学习:视频学习 ps:视频是萝莉音哦,流口水~ 6、BI 5.1.x 升级方式优化 现在可以使用升级插件,自动识别版本辣 提供升级路线,简化检查步骤,根据界面提示操作,一步到位,升级畅爽无烦恼 戳我直达:5.1.x升级指南 140524 7、BI 自定义图表 原来的 BI 组合图现在改名为 自定义图表 啦 相较于原来的组合图,现在可以实现更多样的组合效果,满足您自由的探索需求 戳我尝鲜:自定义图表 -->联系我们<-- 如果您对帮助文档有任何疑问或建议,可以加入文档共创小组直接交流哦~140515 编辑于 2020-12-17 16:40 编辑于 2020-12-17 18:12 编辑于 2020-12-18 15:02
2020-11 文档月报
-->版本推送<-- 为了提升番薯们的产品使用体验,产品、研发小哥哥和小姐姐们已经薅光了头发o( ̄ε ̄*)让我们一起来看看新版本 FR 和 BI 更新了哪些内容吧:FR 更新点击直达:FR 2020-11-02 更新日志BI 更新点击直达:BI 2020-11-05 更新日志 -->文档优化<-- 1、文档搜索整合 文档现在能搜到所有跟关键词相关的内容啦!文档、论坛、问答统统一网打尽~137514 2、文档入口整合文档和社区上方快捷 Tab 栏新增文档入口,帆软 3 大产品帮助文档点击即可直达ヽ(✿゚▽゚)ノ137522 3、目录新增更新日志 以往更新日志藏得比较深,现在我们把所有更新日志放在一个目录里面并置顶,方便番薯们查看,嘿嘿是不是很棒! 137553 -->文档共创<-- 1、文档来找茬 找别人的茬还能获得奖励?对,您没听错,文档共创推出最新任务啦φ(゜▽゜*)♪ 帮助文档中哪怕是一个标点符号错了,只要您帮忙修正过来并提给我们,就可以获得F币( 1F币=1元 )奖励哦~ 为了F币和贡献值,冲鸭!! 点击直达任务:帮助文档来找茬 2、文档共创小组 好消息,好消息!我们文档共创有组织啦~ 对文档共创感兴趣的番薯们赶快扫码加入我们的小组吧,这里有技术、有快乐,更有志同道合的小伙伴137556 -->贡献榜单<-- 感谢小伙伴们这一年对文档的辛苦付出,正是你们的积极参与,才让文档变得越来越好(* ̄3 ̄)╭ 当然你们的付出会有相应回报,2020 文档贡献榜单新鲜出炉啦,年底我们会根据小伙伴们的贡献值发放文档年终奖哦,奖励规则如下: 榜单第 1 名:2000元 榜单第 2~3 名:1000元 榜单第 4~6 名:500元 榜单第 7 ~10 名:100元 榜单最终排名截止到 2020-12-31,想要拿年终奖的小伙伴加把劲呀,点击查看榜单实时变化:2020文档贡献榜单 137558 编辑于 2020-11-12 14:33 编辑于 2020-12-17 15:35
存储过程
1. 概述存储过程,就是直接将存储过程作为数据集,不需要在数据库查询而是去调用存储过程。FineReport 支持全部数据库的存储过程作为数据集并且定义方法都相同。下面我们就以 Oracle 为例,建一个模板数据集,为大家介绍下具体的定义方法。注:在 7.0.4 及之后的版本中存储过程分为模板存储过程数据集和服务器存储过程数据集,在 7.0.4 版本之前,只有服务器存储过程数据集。2. 定义数据集点击模板>模板数据集或者直接在数据集面板中,点击+如下图所示:https://help.fanruan.com/uploads/201808/20180829100809_9829.png切换到 Oracle 数据库所在的数据连接,双击所需要添加的存储过程,如下图:https://help.fanruan.com/uploads/201808/20180829100809_5669.png注:MySQL,DB2,Orcale,SQLServer 是支持自动获取参数和参数的默认值的,而 Access,HSQL,Sybase 无法自动获取需要手动添加。注:在 JAR 包版本 2018-1-11之后,内置的 MySQL 驱动更新,新版本里面存储过程查询默认不用别名,即 select XXX AS XXX from... 默认没有变成 as 之后的值。需要手动指定一下:在 URL 后边加 ?useOldAliasMetadataBehavior=true,例如:jdbc:mysql://env.finedevelop.com:55703/testskp?useOldAliasMetadataBehavior=true。定义完的存储过程数据集如下图:https://help.fanruan.com/uploads/201808/20180829100809_9328.png由于其是模板数据集处,因此该存储过程会存在模板数据集中,如果是在服务器数据集处定义的,则就会显示在服务器数据集所在的 Tab 中。注:FineReport 存储过程返回的是数据集,不能返回单个的参数值。3. 支持返回多个结果集若存储过程中返回的是多个结果集,在此也是支持同时返回多个结果集:https://help.fanruan.com/uploads/201808/20180829100809_7073.png点击预览可以看到多个结果集,如下图所示:https://help.fanruan.com/uploads/201808/20180829100809_6541.png数据集可以同时查看多个结果集,如下图所示:https://help.fanruan.com/uploads/201808/20180829100809_9928.png注:多个结果集只执行一次储存过程。4. 游标存储过程中的游标详细请参照 游标。5. 索引 序号内容简介文档教程 11.1Oracle分页存储过程的实现以 Oracle 数据库中的 SCOT T用户的 EMP 表为例,编写一个分页存储过程Oracle分页存储过程的实现 1.2程序包中存储过程的调用通过 用户名.包名.存储过程 或者 包名.存储过程 方式去调用程序包中存储过程的调用 1.3调用非当前用户下的存储过程通过用户名.存储过程的方式去调用调用非当前用户下的存储过程 1.4优化调用Oracle存储过程优化调用 Oracle 存储过程 22.1SqlServer2005分页存储过程的实现SqlServer2005分页存储过程的实现 2.2调用SqlServer存储过程报没有返回数据集错误调用SqlServer存储过程报没有返回数据集错误
SQL Server 触发器实例
1. 概述1.1 触发器简介 触发器( trigger )是 SQL server 提供给程序员和数据分析员用来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行,触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。 触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。 1.2 工具准备 SQL Server Navicat 2. 示例2.1 数据准备本文代码较多,但多为简单例子,旨在简单说明触发器如何创建及其效果验证。2.1.1 数据库表判断 首先判断,要使用的数据库中是否存在要使用的表,本触发器以水果销售表与水果库存表为例,SQL 代码如下:USE test GO --本触发器以水果销售表与水果库存表为例 IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'SGKC') DROP TABLE SGKC --判断是否存在水果库存表 GO IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'SGXS') DROP TABLE SGXS --判断是否存在水果销售表 GO2.1.2 数据库表创建上面判断完成后,下面开始建表,SQL 代码如下:CREATE TABLE SGXS --创建水果销售表 ( PP VARCHAR(40) PRIMARY KEY NOT NULL, --水果品牌 GHS VARCHAR(40) NULL, --供货商 XSSL INT NULL, --销售数量 XSDJ MONEY NULL, --销售单价 XSJE MONEY NULL --销售金额 ) GO --SELECT * FROM SGXS CREATE TABLE SGKC --创建水果库存表 ( PP VARCHAR(40) PRIMARY KEY NOT NULL, --水果品牌 KCSL INT NULL, --库存数量 KCDJ MONEY NULL, --库存单价 KCJE MONEY NULL --库存金额 ) GO --SELECT * FROM SGKC2.2 实例测试数据库表创建完成后,下面开始效果测试。2.2.1 测试一创建触发器触发器功能:强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。注1:每当 SGKC 表发生 INSERT 动作,则引发该触发器。注2:、为系统表,不可创建、修改、删除,但可以调用。注3:这两个系统表的结构同插入数据的表的结构。SQL 代码如下:IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE='TR'AND NAME='T_INSERT_SGKC') DROP TRIGGER T_INSERT_SGKC --如果存在 T_INSERT_SGKC 触发器则删除 GO CREATE TRIGGER T_INSERT_SGKC ON SGKC FOR INSERT AS BEGIN TRANSACTION --提交事务处理 UPDATE SGKC SET KCJE=KCDJ * KCSL WHERE PP IN(SELECT PP FROM INSERTED) COMMIT TRANSACTION GO2.2.2 验证测试一 针对 SGKC 表,插入测试数据:第一条数据(火龙果)中的数据符合业务规则。第二条数据(桂圆)中,空,不符合业务规则。第三条数据(西瓜)中,不等于乘以,不符合业务规则。第四条数据库存数量为 0。注:插入数据后,检查 SGKC 表中的数据是否 库存金额 = 库存数量* 库存单价。SQL 代码如下:INSERT INTO SGKC(PP,KCSL,KCDJ,KCJE) SELECT '火龙果',10,12,120 UNION ALL SELECT '桂圆',20,22,NULL UNION ALL SELECT '西瓜',12,60,500 UNION ALL SELECT '橘子',0,30,0 GO --SELECT * FROM SGKC --检验测试数据可以触发触发器测试效果如下图所示:https://help.fanruan.com/uploads/20200110/1578636804744120.png2.2.3 测试二创建触发器 触发器功能:实现业务规则。 业务规则:如果销售的水果品牌不存在库存或者库存为零,则返回错误, 否则则自动减少中对应品牌水果的库存数量和库存金额。注:每当 SGKC 表发生 INSERT 动作,则引发该触发器。 创建触发器: IF EXISTS(SELECT NAME FROM SYSOBJECTS WHERE XTYPE='TR' AND NAME='T_INSERT_SGXS') DROP TRIGGER T_INSERT_SGXS GO CREATE TRIGGER T_INSERT_SGXS --创建触发器 T_INSERT_SGXS ON SGXS FOR INSERT ASBEGIN TRANSACTION --判断库存是否存在或者是否大于 0 IF NOT EXISTS( SELECT KCSL FROM SGKC WHERE PP IN(SELECT PP FROM INSERTED) )BEGIN RAISERROR('错误!该水果不存在库存,不能销售',16,1) ROLLBACK RETURN END IF EXISTS( SELECT KCSL FROM SGKC WHERE PP IN(SELECT PP FROM INSERTED) AND KCSL<=0 )BEGIN RAISERROR('错误!该水果库存小于等于 0,不能销售',16,1) ROLLBACK RETURN ENDSQL 代码如下: UPDATE SGXS SET XSJE = XSSL * XSDJ WHERE PP IN(SELECT PP FROM INSERTED) DECLARE @PP VARCHAR(20) SET @PP = (SELECT PP FROM INSERTED) DECLARE @XSSL INT SET @XSSL = (SELECT XSSL FROM INSERTED) UPDATE SGKC SET KCSL = KCSL-@XSSL, KCJE=(KCSL-@XSSL)*KCDJ WHERE PP = @PP COMMIT TRANSACTION GO2.2.4 验证测试二针对 SGXS 表,插入第一次测试数据,先插入正确数据。SQL 代码如下: INSERT INTO SGXS(PP,GHS,XSSL,XSDJ,XSJE) SELECT '西瓜','某供货商',7,60,420 GO SELECT * FROM SGXS --验证是否销售表中已经插入该信息 SELECT * FROM SGKC --验证库存表中该水果是否已经扣除数量并修改相应库存金额 GO测试效果如下图所示: https://help.fanruan.com/uploads/20200110/1578637271888963.png2.2.5 验证测试二针对 SGXS 表,插入第二次测试数据,插入错误数据,该数据销售金额 不等于销售单价*销售数量。注:触发器将自动更正数据,使得销售金额不等于销售单价*销售数量。SQL 代码如下: INSERT INTO SGXS(PP,GHS,XSSL,XSDJ,XSJE) SELECT '桂圆','某供货商',10,22,2000 GO SELECT * FROM SGXS --验证是否销售表中已经插入该信息,并且自动修改销售金额 SELECT * FROM SGKC --验证库存表中该水果是否已经扣除数量并修改相应库存金额测试效果如下图所示:https://help.fanruan.com/uploads/20200110/1578637559864069.pnghttps://help.fanruan.com/uploads/20200110/1578637534213446.png2.2.6 验证测试二针对 SGXS 表,插入第三次测试数据,该数据中的水果品牌在水果库存中找不到对应,触发器报错。SQL 代码如下:INSERT INTO SGXS(PP,GHS,XSSL,XSDJ,XSJE) SELECT '苹果','某供货商',7,20,140 GO测试效果如下图所示:https://help.fanruan.com/uploads/20200110/1578637635860626.png2.2.7 验证测试二针对 SGXS 表,插入第四次测试数据,该数据中的水果品牌在水果库存中库存为 0,触发器报错。SQL 代码如下:INSERT INTO SGXS(PP,GHS,XSSL,XSDJ,XSJE) SELECT '橘子','某供货商',30,30,900 GO测试效果如下图所示:https://help.fanruan.com/uploads/20200110/1578637690840497.png3. 示例下载点击下载上述所有实例:136316 编辑于 2020-9-25 17:09
调用SqlServer存储过程报没有返回数据集错误
1. 问题描述在 SQL Server 数据库中,若定义的存储过程中包含有 insert/Update 等更新操作时,在设计器中对存储过程进行调用时,会提示没有返回数据集的错误,如下图所示:https://help.fanruan.com/uploads/201808/20180829101840_2528.png而在数据库端执行存储过程,能够查询出结果如下:https://help.fanruan.com/uploads/201808/20180829101840_7486.png2. 解决方案在存储过程中增加 SET NOCOUNT ON (不返回受影响行数),让数据库端不将影响的行数返回给客户端或者在模板数据集>数据库查询调用存储过程并设置 SET NOCOUNT ON。下面我们以一个具体的示例看下如何设置。3. 示例如已经存在了带有 insert/update 的一个简单的存储过程,如下:create PROCEDURE . AS BEGIN INSERT INTO dbo.雇员(雇员id,姓氏) values(10,'薛') SELECT * from dbo.雇员where 姓氏= '薛' END3.1 通过修改存储过程此时修改存储过程,在BEGIN开始时加上SET NOCOUNT ON,如下:ALTER PROCEDURE . AS BEGIN SET NOCOUNT ON INSERT INTO dbo.雇员(雇员id,姓氏) values(10,'薛') SELECT * from dbo.雇员where 姓氏= '薛' ENDhttps://help.fanruan.com/uploads/201808/20180829101840_1845.png3.2 通过在数据库查询处调用存储过程若存储过程已经定义好,不希望再修改,这时可以通过模板数据集>数据库查询处调用存储过程,并在调用前增加 SET NOCOUNT ON,最后执行的语句为:SET NOCOUNT ON EXEC dbo.prc_stuffhttps://help.fanruan.com/uploads/201808/20180829101840_5029.png注:Oracle 数据库中不存在这样的问题,只要成功创建一个存储过程,在设计器中正常调用即可,不会出现类似的问题。
SqlServer2005分页存储过程的实现
1.描述直接使用数据集可以实现分页查询,下面我们要做的就是如何定义分页存储过程即直接在存储过程中实现分页查询了。 2.通用的分页存储过程1.1 存储过程具体代码如下:CREATE proc . @TableName varchar(50), --表名 @Fields varchar(5000) = '*', --字段名(全部字段为*) @OrderField varchar(5000), --排序字段(必须!支持多字段) @sqlWhere varchar(5000) = Null,--条件语句(不用加where) @pageSize int, --每页多少条记录 @pageIndex int = 1 , --指定当前为第几页 @TotalPage int output --返回总页数 as begin Begin Tran --开始事务 Declare @sql nvarchar(4000); Declare @totalRecord int; --计算总记录数 if (@SqlWhere='' or @sqlWhere=NULL) set @sql = 'select @totalRecord = count(*) from ' + @TableName else set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT --计算总记录数 --计算总页数 select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize) if (@SqlWhere='' or @sqlWhere=NULL) set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName else set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere --处理页数超出范围情况 if @PageIndex<=0 Set @pageIndex = 1 if @pageIndex>@TotalPage Set @pageIndex = @TotalPage --处理开始点和结束点 Declare @StartRecord int Declare @EndRecord int set @StartRecord = (@pageIndex-1)*@PageSize + 1 set @EndRecord = @StartRecord + @pageSize - 1 --继续合成sql语句 set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) print @sql Exec(@Sql) --------------------------------------------------- If @@Error <> 0 Begin RollBack Tran Return -1 End Else Begin Commit Tran Return @totalRecord ---返回记录总数 End End 1.2 测试分页点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到 SQLServer 数据库所在的数据连接,双击所需要添加的存储过程,如下图:https://help.fanruan.com/uploads/201808/20180829101717_3824.png点击预览,需要输入参数,如下图:https://help.fanruan.com/uploads/201808/20180829101717_3426.pnghttps://help.fanruan.com/uploads/201808/20180829101717_3071.png输入参数后,点击确定,返回两个数据集,如下图:https://help.fanruan.com/uploads/201808/20180829101717_6123.pnghttps://help.fanruan.com/uploads/201808/20180829101717_7224.png3.确定 SQL 及每页显示条数的分页存储过程3.1 存储过程若已经确定了需要分页的表,字段,排序字段及每页显示记录数,可以不定义这几个参数,如下的例子是已知表名为 orders,让其按照 orderno 列进行排序并一页显示 10 条数据:具体代码如下: 3.2 测试分页点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到 SQL Server 数据库所在的数据连接,双击所需要添加的存储过程,如下图:https://help.fanruan.com/uploads/201808/20180829101717_5435.png点击预览,需要输入参数,如下图:https://help.fanruan.com/uploads/201808/20180829101717_5808.png输入参数后,点击确定,返回两个数据集,如下图:https://help.fanruan.com/uploads/201808/20180829101717_7912.pnghttps://help.fanruan.com/uploads/201808/20180829101717_8765.png注:在调用存储过程时,需要设置下 pageIndex 这个参数的默认值,否则会提示‘每页返回结果集’的错误。4.SQL Server2012分页存储过程注:上述第二种分页方式,在SQL Server 2012版本以后,有更加简单的实现方式。具体实现如下所示:4.1 存储过程同上述第二种分页方法,已经确定了需要分页的表,字段,排序字段及每页显示记录数,如下的例子是已知表名为 yjcksjb,让其按照 x_jsdh 列进行倒序排列并一页显示 10 条数据:具体代码如下:create procedure dbo.test5 @pagesize AS BIGINT = 10, @pagenum AS BIGINT = 4 AS BEGIN SET nocount ON SELECT * FROM yjcksjb ORDER BY x_jsdh DESC OFFSET (@pagenum-1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY set nocount off end4.2 测试分页点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到SQL Server 数据库所在的数据连接,双击所需要添加的存储过程,如下图:https://help.fanruan.com/uploads/201808/20180829101717_3743.png 点击预览,需要输入参数,如下图:https://help.fanruan.com/uploads/201808/20180829101717_5649.png 输入参数后,点击确定,返回数据集,如下图:https://help.fanruan.com/uploads/201808/20180829101717_8795.png
调用非当前用户下的Oracle存储过程
1. 问题描述若存储过程不在当前用户下,如 testprodure 存储过程是在 Scott 用户下定义的,而以 system 用户进行登录,在模板数据集>存储过程只能看到当前用户下的存储过程,如下图,同样需要在模板数据集>数据库查询中调用,下面我们来看下调用方法。https://help.fanruan.com/uploads/201808/20180829101442_7860.png2. 实现思路在模板数据集>数据库查询中通过用户名.存储过程的方式去调用。3. 示例若是调用数据库存储过程取数,官方只支持查询语句select进行取数,其他写法(例如下面的写法), 返回的结果不能保证,不建议使用 :通过用户名.存储过程名来调用,{call SCOTT.testprodure(?)}https://help.fanruan.com/uploads/201808/20180829101442_7224.png注:调用时必须加上用户名才可以访问。 另:如果存储过程是在包里面定义的,调用方法是用户名.包名.存储过程:{call SCOTT.TESTPACKAGE.TESTPROCEDURE(?)}
程序包中调用Oracle存储过程
1. 问题描述若存储过程是在程序包中的,如 MYPROCEDURE 是在P ACKAGE_NAME 程序包中定义的,在模板数据集>存储过程中存储过程语句是无法预览的,如下图所示: https://help.fanruan.com/uploads/201808/20180829101145_1083.png2. 实现思路在模板数据集>数据库查询中通过 用户名.包名.存储过程 或者 包名.存储过程 方式去调用。需要注意的是,存储函数或存储过程这两个方法的调用语句是不同的,区别如下: 存储过程:{call SYSTEM.AAAAA('11',?)} 存储函数:{?=call SYSTEM.AAAAA('11')} 3. 示例若是调用数据库存储过程取数,官方只支持查询语句select进行取数,其他写法(例如下面的写法), 返回的结果不能保证,不建议使用 :通过 用户名.包名.存储过程 来调用:{call SYSTEM.PACKAGE_NAME.MYPROCEDURE(?)}https://help.fanruan.com/uploads/201808/20180829101145_9706.png或者直接通过 包名.存储过程 来调用:{call PACKAGE_NAME.MYPROCEDURE(?)}https://help.fanruan.com/uploads/201808/20180829101145_1839.png 编辑于 2020-9-25 17:18
123下一页
个人成就
帆软社区认证讲师
内容被浏览1,893,394
加入社区2年147天
贡献:83

联系社区管理员|联系帆软|《帆软社区协议》|手机版|帆软社区|Copyright © 帆软软件有限公司 ( 苏ICP备18065767号-7 )

GMT+8, 2021-10-23 20:00 , Processed in 0.367356 second(s), 103 queries , Gzip On.

返回顶部