皕杰技术社区

 找回密码
 立即加入

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2242|回复: 14

皕杰报表填报过程留痕

[复制链接]
发表于 2018-11-27 10:49:55 | 显示全部楼层 |阅读模式
一、需求描述
A项指标 B项指标
测试结果1 111 222
测试结果2 333 444

说明:
如果开始填写了000,并且已经保存了(没有保存前过程中修改不用留痕)。再修改成111,那么这个单元格里,111那里需能够有个标识提示(可以是字体变颜色、背景变色、旁边 有个什么标记等。),然后点击那里,可以查看到修改前后的信息,比如:
修改后:111,修改前:000,修改时间:xxxxxxx
 楼主| 发表于 2018-11-27 11:05:48 | 显示全部楼层
二、需求分析

三、设计过程
1.创建数据表
DEMO_DEPT_BUDGET表
  1. CREATE TABLE DEMO_DEPT_BUDGET (
  2.         DEPTID CHAR(10),
  3.         TRAVELBUDGET DECIMAL(10,2),
  4.         SALARYBUDGET DECIMAL(10,2),
  5.         ALLOWANCEBUDGET DECIMAL(10,2)
  6. ) ;
复制代码

DEMO_DEPT_BUDGET_LOG表
  1. CREATE TABLE DEMO_DEPT_BUDGET_LOG (
  2.         DEPTID CHAR(10),
  3.         BUDGETTYPE VARCHAR(20),
  4.         OLD_VALUE DECIMAL(10,2),
  5.         NEW_VALUE DECIMAL(10,2),
  6.         USERID VARCHAR(20),
  7.         ALTERDATE DATE
  8. ) ;
复制代码

DEPT表
  1. CREATE TABLE DEPT (
  2.         DEPTID CHAR(10),
  3.         DEPTNAME CHAR(30),
  4. ) ;
复制代码

2.设计皕杰报表填报报表
新建参数
dept(字符串类型):选择显示的部门
新建数据集
dept
  1. select deptid,deptname from dept
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即加入

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 11:33:48 | 显示全部楼层
dept_budget
  1. ="select b.DEPTID,d.DEPTNAME,b.TRAVELBUDGET,b.SALARYBUDGET,b.ALLOWANCEBUDGET from demo_dept_budget b left join dept d on b.deptid=d.deptid where 1=1"+if(@dept=null,""," and b.deptid='"+@dept+"'")
复制代码

dept_budget_log
  1. SELECT l.DEPTID,d.DEPTNAME,l.BUDGETTYPE,l.OLD_VALUE,l.NEW_VALUE,l.ALTERDATE,l.USERID FROM DEMO_DEPT_BUDGET_LOG l LEFT JOIN DEPT d ON l.DEPTID=d.DEPTID
复制代码

报表编辑区

填报设置

查询表单

3.编写填报监听自定义类
根据帮助文档-开发指南-javadoc中提供的接口(bios.report.api.events.IFillinEventListener)写自定义填报监听事件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即加入

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 11:35:41 | 显示全部楼层
实例代码:
  1. package bios.report.dev.examples.event;
  2. import java.sql.*;
  3. import java.util.*;
  4. import com.jfinal.plugin.activerecord.*;
  5. import bios.report.api.events.IFillinEventListener;
  6. import bios.report.api.usermodel.*;
  7. public class DeptBudgetEventListener implements IFillinEventListener {
  8.         @Override
  9.         public String onCommitData(ReportMark arg0) {
  10.                 return null;
  11.         }

  12.         @Override
  13.         public void onCommitDataFinished(ReportMark arg0) {
  14.         }

  15.         @Override
  16.         public String onUpdateData(ReportMark mark, FillinDatas data) {
  17.                 return null;
  18.         }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 11:38:50 | 显示全部楼层
  1. @Override
  2.         // 填报完成后,执行将修改记录保存到日志表
  3.         public void onUpdateDataFinished(ReportMark mark, FillinDatas data) {
  4.                 // 获取登录用户的ID
  5.                 String userid = getUserId();
  6.                 // 获取填报操作信息
  7.                 List<FillinDataRow> list = data.getDatas();
  8.                 for (int i = 0; i < list.size(); i++) {
  9.                         FillinDataRow row = list.get(i);
  10.                         valueCompare(row, userid);
  11.                 }
  12.         }

  13.         // 比较数据里的修改记录,获取旧数据
  14.         private void valueCompare(FillinDataRow row, String userid) {
  15.                 int deptid = Integer.parseInt(row.getDataByField("DEPTID").toString());
  16.                 Connection con = getConn();
  17.                 PreparedStatement ps = null;
  18.                 ResultSet rs = null;
  19.                 // 根据填报操作里的主键idDEPTID获取DEMO_DEPT_BUDGET表中历史记录
  20.                 String sql = "SELECT b.TRAVELBUDGET,b.SALARYBUDGET,b.ALLOWANCEBUDGET FROM DEMO_DEPT_BUDGET b WHERE DEPTID=?";
  21.                 double old_TRAVELBUDGET = 0;
  22.                 double old_SALARYBUDGET = 0;
复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 11:40:54 | 显示全部楼层
  1. double old_ALLOWANCEBUDGET = 0;
  2.                 try {
  3.                         ps = con.prepareStatement(sql);
  4.                         ps.setInt(1, deptid);
  5.                         rs = ps.executeQuery();
  6.                         while (rs.next()) {
  7.                                 old_TRAVELBUDGET = rs.getDouble(1);
  8.                                 old_SALARYBUDGET = rs.getDouble(2);
  9.                                 old_ALLOWANCEBUDGET = rs.getDouble(3);
  10.                         }
  11.                         rs.close();
  12.                         ps.close();
  13.                         con.close();
  14.                 } catch (SQLException e) {
  15.                         e.printStackTrace();
  16.                 }
  17.                 double new_TRAVELBUDGET = (Double) row.getDataByField("TRAVELBUDGET");
  18.                 double new_SALARYBUDGET = (Double) row.getDataByField("SALARYBUDGET");
  19.                 double new_ALLOWANCEBUDGET = (Double) row.getDataByField("ALLOWANCEBUDGET");
  20.                 // 判断新的填报操作 信息中某字段是否已修改
  21.                 if (new_TRAVELBUDGET == old_TRAVELBUDGET) {

  22.                 } else {
  23.                         fillData(new_TRAVELBUDGET, old_TRAVELBUDGET, deptid, userid, "E4");
  24.                 }
  25.                 if (new_SALARYBUDGET == old_SALARYBUDGET) {

  26.                 } else {
  27.                         fillData(new_SALARYBUDGET, old_SALARYBUDGET, deptid, userid, "C4");
  28.                 }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 14:13:00 | 显示全部楼层
  1. if (new_ALLOWANCEBUDGET == old_ALLOWANCEBUDGET) {
  2.                 } else {
  3.                         fillData(new_ALLOWANCEBUDGET, old_ALLOWANCEBUDGET, deptid, userid, "D4");
  4.                 }
  5.         }
  6.         // 将修改记录保存到日志表
  7.         private void fillData(double new_value, double old_value, int typeid, String userid, String cell) {
  8.                 Connection con = getConn();
  9.                 PreparedStatement ps = null;
  10.                 String sql = "insert into DEMO_DEPT_BUDGET_LOG (budgettype,deptid,userid,new_value,old_value,alterdate) values(?,?,?,?,?,CURRENT_TIMESTAMP())";
  11.                
  12.            
复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 14:14:25 | 显示全部楼层
  1. try {
  2.                         ps = con.prepareStatement(sql);
  3.                         ps.setString(1, cell);
  4.                         ps.setInt(2, typeid);
  5.                         ps.setString(3, userid);
  6.                         ps.setDouble(4, new_value);
  7.                         ps.setDouble(5, old_value);
  8.                         ps.executeUpdate();
  9.                         con.close();
  10.                 } catch (Exception e) {
  11.                         e.printStackTrace();
  12.                 }
  13.         }

  14.         // 获取登录用户ID
  15.         private String getUserId() {
  16.                 String userid = "";
  17.                 return userid;
  18.         }

  19.         // 获取应用数据源connection连接
  20.         private Connection getConn() {
  21.                 Config sysConfig = DbKit.getConfig("sys");
  22.                 Connection conn = sysConfig.getThreadLocalConnection();
  23.                 if (conn == null) {
  24.                         try {
  25.                                 conn = sysConfig.getConnection();
  26.                                 conn.setAutoCommit(true);
  27.                                 return conn;
  28.                         } catch (SQLException e) {
  29.                                 e.printStackTrace();
  30.                         }
  31.                 }
  32.                 return conn;
  33.         }
  34. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 14:34:13 | 显示全部楼层
4.填报设置中配置填报监听
打开填报设置,点击动作按钮

设置新的动作按钮,此操作,重置新的保存按钮 。

5.配置单元格背景变色
C4单元格-单元格属性-背景颜色 ,表达式: =if(dept_budget_log.count(deptid=A4 and BUDGETTYPE='C4')>0,'204,255,204','255,255,255')。这个表达式意思是:判断根据deptid和BUDGETTYPE的值判断dept_budget_log表中是否有值。如果是,就变色;如果不是,还是默认颜色。
同样,D4和E4分别设置=if(dept_budget_log.count(deptid=A4 and BUDGETTYPE='D4')>0,'204,255,204','255,255,255')、=if(dept_budget_log.count(deptid=A4 and BUDGETTYPE='E4')>0,'204,255,204','255,255,255')
6.新建弹出层
点击报表属性-WEB资源引用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即加入

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-27 14:36:48 | 显示全部楼层
本帖最后由 bijetsupport02 于 2018-11-27 14:41 编辑

在web资源引用中,添加
  1. <div id="popupdiv"
  2. style="display:none;background-color:#FFFFFF;min-height:80px;z-index:1001;border-radius: 3px;box-shadow:0 3px 10px 0 rgba(0,0,0,0.26), 0 0 3px 0 rgba(0,0,0,0.18);">弹出层实例</div>
复制代码
7.弹出层相关js控制
在report_res文件夹下新建demo_popupdiv.js
  1. // 显示层popupdiv
  2. function showdiv(budgetlog,deptid,cell) {
  3.         var popupdiv = document.getElementById('popupdiv'); // 将要弹出的层
  4.         popupdiv.style.display = "block"; // popupdiv初始状态是不可见的,设置可为可见
  5.         // window.event代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状.
  6.         // clientX是鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条。
  7.         popupdiv.style.left = (event.clientX - 50)+"px";
  8.         popupdiv.style.top = (event.clientY +10)+"px";
  9. }
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|皕杰软件 ( 京ICP备14050931号 )

GMT+8, 2024-3-3 21:51 , Processed in 1.133682 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表