帆软报表定时刷新

在帆软报表中,可以通过模板web属性设置定时刷新报表,例如使用setInterval方法每10秒刷新一次页面。当报表有参数查询条件时,需使用setTimeout结合_parameterCommit()方法确保参数提交后再刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

帆软报表可以定时刷新报表,也可以建立定时任务等,不知道题主说的是哪一种,以定时刷新报表来说吧。点击模板>模板web属性,选择为当前模板设置,然后添加加载结束事件,使用setinterval方法定时刷新报表页面,JS如下:setInterval("self.location.reload();",10000); //10000ms即每10s刷新一次页面。对于cpt报表,若存在参数查询条件, 使用上述js无法在选定特定查询参数后定时刷新报表,每次查询后都会触发一次加载结束事件,修改后js代码如下:setTimeout("_g().parameterCommit();",10000);

<think>帆软报表中,参数(如start_time和end_time)的配置与数据集是独立的。我们不需要为参数单独新建数据集,而是需要在参数面板中添加控件,然后将这些参数绑定到数据集中的SQL查询。 下面详细展开帆软报表界面配置步骤:</think>### 帆软报表界面配置详细说明 在帆软报表中配置时间参数控件不需要新建数据集,而是通过参数面板和控件设置来实现。以下是完整的配置步骤和详细说明: #### 1. 创建参数(全局变量) 在帆软报表中,参数是独立于数据集的全局变量,用于存储用户输入或计算值。 **创建步骤:** 1. 打开报表设计器 → 文件 → 报表参数 2. 点击"+"添加参数 3. 设置参数: - **名称**:`start_time` - **类型**:字符串(String) - **默认值**:留空(将在初始化脚本中设置) 4. 同样添加 `end_time` 参数 ```xml <!-- 报表参数定义 (XML片段) --> <Parameter name="start_time" class="java.lang.String"/> <Parameter name="end_time" class="java.lang.String"/> ``` #### 2. 添加参数面板控件 参数控件用于显示和交互,不需要绑定数据集。 **添加文本控件步骤:** 1. 在报表设计器中,打开"参数面板" 2. 从工具栏拖拽"文本控件"到参数面板 3. 右键控件 → 控件设置 4. 关键设置: - **控件名称**:`start_time`(与参数名一致) - **控件类型**:文本 - **标签文本**:"开始时间" - **可见性**:根据需要选择(建议隐藏或只读) - **提交方式**:字符串 ```xml <!-- 参数面板控件配置 (XML片段) --> <ParameterPane> <Widget widgetType="text" name="start_time" label="开始时间" x="20" y="20" width="120"/> <Widget widgetType="text" name="end_time" label="结束时间" x="160" y="20" width="120"/> </ParameterPane> ``` #### 3. 添加初始化脚本 在报表初始化时计算时间参数值并设置到控件中。 **添加初始化脚本步骤:** 1. 打开报表 → 模板 → 模板Web属性 2. 选择"分页预览设置" 3. 在"事件"选项卡中选择"加载结束后" 4. 添加JavaScript代码: ```javascript // 初始化脚本 setTimeout(function() { // 计算时间参数 var today = new Date(); // 计算上月同一天(处理月末边界) var lastMonthSameDay = new Date(today); lastMonthSameDay.setMonth(lastMonthSameDay.getMonth() - 1); // 如果目标日期无效(如2月30日),回退到最后一天 if (lastMonthSameDay.getDate() !== today.getDate()) { lastMonthSameDay = new Date(lastMonthSameDay.getFullYear(), lastMonthSameDay.getMonth() + 1, 0); } // 计算开始时间(上月同一天20:00) var startTime = formatDate(lastMonthSameDay) + " 20:00:00"; // 计算结束时间(前一天20:00) var yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); var endTime = formatDate(yesterday) + " 20:00:00"; // 设置参数值 _g().setParameterValue("start_time", startTime); _g().setParameterValue("end_time", endTime); // 刷新报表 _g().parameterCommit(); // 日期格式化辅助函数 function formatDate(date) { var year = date.getFullYear(); var month = (date.getMonth() + 1).toString().padStart(2, '0'); var day = date.getDate().toString().padStart(2, '0'); return year + "-" + month + "-" + day; } }, 100); ``` #### 4. 配置数据集绑定参数 在数据集SQL中使用参数变量,实现动态查询。 **数据集配置步骤:** 1. 打开数据集设置 → 添加"数据库查询" 2. 输入SQL语句,使用`${}`语法引用参数: ```sql SELECT tag, time, value FROM piinterp2 WHERE tag in('SXNY_QXT_LTDWCB') AND time >= '${start_time}' AND time <= '${end_time}' AND timestep = '24:00:00' ORDER BY time, tag ``` 3. 设置数据库连接:选择PI数据库连接 4. 在"参数"选项卡中绑定参数: - **参数名**:`start_time` → 值:`$start_time` - **参数名**:`end_time` → 值:`$end_time` ```xml <!-- 数据集配置 (XML片段) --> <Dataset name="ds1" type="sql"> <![CDATA[ SELECT tag, time, value FROM piinterp2 WHERE tag in('SXNY_QXT_LTDWCB') AND time >= '${start_time}' AND time <= '${end_time}' AND timestep = '24:00:00' ORDER BY time, tag ]]> <Parameters> <Parameter name="start_time" type="String" value="$start_time"/> <Parameter name="end_time" type="String" value="$end_time"/> </Parameters> </Dataset> ``` #### 5. 定时刷新设置(可选) 如果需要每天自动更新报表: 1. 打开模板 → 模板Web属性 2. 选择"分页预览设置" 3. 在"基本"选项卡中: - 勾选"定时刷新" - 设置间隔时间:1440分钟(24小时) 4. 在"事件"选项卡中: - 添加"刷新后"事件: ```javascript // 重新计算时间参数并刷新 _g().setParameterValue("start_time", calculateStartTime()); _g().setParameterValue("end_time", calculateEndTime()); _g().parameterCommit(); ``` ### 关键配置要点说明 1. **参数与控件关系**: - 参数是存储值的全局变量(`start_time`) - 控件是界面元素,绑定到参数(名称必须一致) - 数据集通过`${param}`语法引用参数值 2. **时间计算逻辑**: - 使用JavaScript的Date对象处理日期计算 - 边界处理:当上月同一天不存在时(如3月31日),回退到月末最后一天 - 时间格式:`YYYY-MM-DD HH:mm:ss` 符合PI数据库要求 3. **初始化流程**: ```mermaid graph TD A[报表加载] --> B[执行初始化脚本] B --> C[计算时间参数] C --> D[设置参数值] D --> E[提交参数] E --> F[数据集执行查询] F --> G[展示数据] ``` 4. **控件可见性建议**: - 对于自动计算的时间参数,建议设置为"不可见" - 如需用户修改,可设置为"可见"并添加校验: ```javascript // 控件值变化事件 this.addEditListener(function() { if (!isValidTime(this.getValue())) { FR.Msg.alert("错误", "时间格式应为 YYYY-MM-DD HH:mm:ss"); this.reset(); } }); ``` ### 完整配置示例 ```xml <?xml version="1.0" encoding="UTF-8"?> <FineReport> <Report> <Parameter name="start_time" class="java.lang.String"/> <Parameter name="end_time" class="java.lang.String"/> <ParameterPane> <Widget widgetType="text" name="start_time" label="开始时间" visible="false"/> <Widget widgetType="text" name="end_time" label="结束时间" visible="false"/> </ParameterPane> <Init> <![CDATA[ // 初始化脚本 setTimeout(initTimeParams, 100); function initTimeParams() { // 计算时间参数 var today = new Date(); var lastMonthSameDay = new Date(today.getFullYear(), today.getMonth()-1, today.getDate()); // 边界处理 if (lastMonthSameDay.getMonth() !== today.getMonth()-1 % 12) { lastMonthSameDay = new Date(today.getFullYear(), today.getMonth(), 0); } var startTime = formatDate(lastMonthSameDay) + " 20:00:00"; var endTime = formatDate(new Date(today.getFullYear(), today.getMonth(), today.getDate()-1)) + " 20:00:00"; // 设置参数 _g().setParameterValue("start_time", startTime); _g().setParameterValue("end_time", endTime); _g().parameterCommit(); } function formatDate(date) { return date.getFullYear() + '-' + (date.getMonth()+1).toString().padStart(2,'0') + '-' + date.getDate().toString().padStart(2,'0'); } ]]> </Init> <Dataset name="pi_data" type="sql"> <![CDATA[ SELECT tag, time, value FROM piinterp2 WHERE tag in('SXNY_QXT_LTDWCB') AND time >= '${start_time}' AND time <= '${end_time}' AND timestep = '24:00:00' ORDER BY time, tag ]]> <Parameters> <Parameter name="start_time" type="String" value="$start_time"/> <Parameter name="end_time" type="String" value="$end_time"/> </Parameters> </Dataset> </Report> </FineReport> ``` ### 常见问题解决方案 1. **参数不生效问题**: - 确保参数名完全一致(大小写敏感) - 检查SQL中的引用语法:`${param}` - 确认提交参数:`_g().parameterCommit()` 2. **月末日期计算错误**: ```javascript // 更健壮的月末处理 function getLastMonthSameDay(today) { var lastMonth = new Date(today); lastMonth.setMonth(lastMonth.getMonth() - 1); // 如果日期变化(如3月31日→3月3日),返回月末 if (lastMonth.getDate() !== today.getDate()) { return new Date(today.getFullYear(), today.getMonth(), 0); } return lastMonth; } ``` 3. **时区问题处理**: ```javascript // 设置东八区时间 function formatDateWithTZ(date) { var offset = -date.getTimezoneOffset() / 60; date.setHours(date.getHours() + (offset - 8)); return formatDate(date) + " 20:00:00"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值