FineReport学习——动态格间运算

本文为对帆软第八讲的问题深入并加深难度的总结;
视频连接
http://bbs.fanruan.com/plugin.php?id=threed_video:view&tid=67986&cid=10

创建数据库

/*
Navicat MySQL Data Transfer

Source Server         : arvin
Source Server Version : 50624
Source Host           : localhost:3306
Source Database       : creek

Target Server Type    : MYSQL
Target Server Version : 50624
File Encoding         : 65001

Date: 2017-06-16 16:16:46
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for month_selll
-- ----------------------------
DROP TABLE IF EXISTS `month_selll`;
CREATE TABLE `month_selll` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `month` varchar(2) DEFAULT NULL,
  `sell` double(10,2) DEFAULT NULL,
  `year` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of month_selll
-- ----------------------------
INSERT INTO `month_selll` VALUES ('1', '2', '1200.00', '2010');
INSERT INTO `month_selll` VALUES ('2', '3', '5462.21', '2010');
INSERT INTO `month_selll` VALUES ('3', '4', '2545.58', '2010');
INSERT INTO `month_selll` VALUES ('4', '5', '5454.55', '2010');
INSERT INTO `month_selll` VALUES ('5', '6', '4794.32', '2010');
INSERT INTO `month_selll` VALUES ('6', '7', '5797.00', '2010');
INSERT INTO `month_selll` VALUES ('7', '1', '2564.30', '2011');
INSERT INTO `month_selll` VALUES ('8', '2', '4564.56', '2011');
INSERT INTO `month_selll` VALUES ('9', '3', '4156.55', '2011');
INSERT INTO `month_selll` VALUES ('10', '4', '2412.25', '2011');
INSERT INTO `month_selll` VALUES ('11', '5', '4543.15', '2011');
INSERT INTO `month_selll` VALUES ('12', '10', '1500.00', '2015');

创建模板

依据图中将年份、月份、销售额三个字段放入,并添加需要计算的样式。
B2的父格:A2
C2的父格:B2
D2、E2、F2、G2、H2的父格:C2
A3、C3的父格:A2
模板样式
直接贴出各个计算单元格的公式,具体理解请参照连接。
Finereport公式不区分大小写。
D2:C2-C2[B2:1]
E2:c2/sum(c2[!0]{A2=$A2})
F2:if(&B2>1,c2/c2[B2:-1],0)
H2:G2[B2:-1]+C2
C3:if(&A2=1,G2[B2:-1]+C2,if(&B2=1,c2+h2[A2:-1,B2:!-1],c2+h2[b2:-1]))


公式解释:
C2[B2:1]:拿到B2单元格扩展出来的第一个值对应的C2单元格的值(可以理解为下标,或一维坐标);
c2[!0]:拿到C2单元格扩展出来的所有值
$A2:表示A2单元格的值;
&B2:扩展后每个单元格的位置,返回int型,如1,2,3,4等;
{}:表示限制条件;
c2[B2:-1]:拿到B2单元格扩展出来的上一个值对应的C2单元格的值
c2[B2:!-1]:拿到B2单元格扩展出来的最后一个值对应的C2单元格的值
h2[A2:-1,B2:!-1]:拿到①A2单元格扩展出来的上一个值,②且B2单元格扩展出来的最后一个值同时对应的h2单元格的值(类似于二维坐标);
if(expr1, expr2, expr3):如果expr1为true,返回expr2,否则返回expr3

预览结果

Web预览结果如下:
其中:占比表示占据所在年份的比例,跨层累计表示数据的累加。
FineReport学习——动态格间运算_第1张图片

你可能感兴趣的:(FineReport)