报表统计的加减运算实现

简介: 报表统计的加减运算实现

1.报表统计需求的例子



在做报表的时候会遇到一些统计:
    如果是合计的可以直接在sql统计的时候直接运算
    如果是上级科目为子科目之和的时候,明细表没有自动处理父级科目
       则可以通过子sql的like处理 a.subjectcode like b.subjectcode||'%'
       也可以通过代码遍历处理只要是科目开头匹配的时候就加
    如果是动态的一些合计为明细加加减减的可以采用配置表达式方式处理
设计表达式例子:
例如明细
       科目:金额
       1.1.1 1
       1.1.2 2
       1.1.3 3
       1.1.4 4
统计要求为多个明细之间的加减运算,可以通过配置表达式处理
   表达式配置例如:
                1.1=1.1.1+1.1.2-1.1.4
                1.2=1.1.2-1.1.3
   大科目统计例如:
                1=1.1+1.2
                只需要按照顺序计算就可以了,因为表达式的明细前面做过运算,这里直接处理就可以了
复制代码


2.效果



网络异常,图片无法展示
|


3.实现



例如 -1.1+1.4-1.6
首先加号分组 (-1.1) (1.4-1.6)
遇见减号分组 (空 1.1)
            1.1不为首个匹配数做减法运算
                 (1.4 1.6)
                 1.4为首个运算做加法运算
                 1.6不为首个运算减法运算
复制代码


//测试
public static void main(String[] args) {
  Map<String, BigDecimal> detail=new HashMap<String, BigDecimal>();
  detail.put("1.1", new BigDecimal(1));
  detail.put("1.2", new BigDecimal(2));
  detail.put("1.3", new BigDecimal(3));
  detail.put("1.4", new BigDecimal(4));
  detail.put("1.5", new BigDecimal(5));
  detail.put("1.6", new BigDecimal(6));
  String express1="-1.1+1.4-1.6";
  System.out.println(getAddSub(express1,detail));
         express1="+1.1+1.4-1.6";
  System.out.println(getAddSub(express1,detail));
            express1="1.1+1.4-1.6-";
  System.out.println(getAddSub(express1,detail));
    express1="1.1+1.4-1.6-1.7";
  System.out.println(getAddSub(express1,detail));
}
public static BigDecimal getAddSub(String express,Map<String, BigDecimal> detail) {
  BigDecimal result=new BigDecimal(0);
  String[] expressAdd=express.split("\\+");
  for(String add:expressAdd) {
    String[] expressSub=add.split("\\-");
    for(int i=0;i<expressSub.length;i++) {
      String key=expressSub[i];
      if(detail.containsKey(key)) {
        if(i==0) {
          result=result.add(detail.get(key));
        }else {
          result=result.subtract(detail.get(key));
        }
      }
    }
  }
  return result;
}


相关文章
|
Linux 数据安全/隐私保护 Shell
centos7在忘记密码的情况下修改密码
centos7在忘记密码的情况下修改密码: 1、在重启系统过程中,快速在键盘上的上下键, 之后按下e键,进入编辑模式 2、在编辑模式,移动光标到LANG=en_US.
3811 0
|
关系型数据库 MySQL Linux
文章对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据自身需求选择最合适的安装方法
【10月更文挑战第8天】本文介绍了在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务及登录设置等。同时,文章对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据自身需求选择最合适的安装方法。
531 4
|
9月前
|
人工智能 安全 API
0 代码为你的 Typecho 博客接入阿里云百炼(可接入 DeepSeek-R1 满血版!)
随着科技企业LLM发展成熟,AIHelper插件让Typecho博客轻松拥有AI助手。通过集成阿里云百炼API,支持DeepSeek-R1、Qwen等模型,帮助读者快速查找内容、总结文章。本文详细介绍了从导出文章、配置阿里云百炼、创建AI应用到安装配置插件的全过程,确保安全高效地为博客添加智能交互功能。相比官方方案,AIHelper提供更安全的访问限制和低代码部署方式,无需编写代码即可实现智能化管理。
0 代码为你的 Typecho 博客接入阿里云百炼(可接入 DeepSeek-R1 满血版!)
|
12月前
|
机器学习/深度学习 存储 算法
《强化学习算法在动态环境中的优化之路》
强化学习是一种通过与环境交互以最大化累积奖励为目标的学习方法。在动态环境中,算法面临探索与利用的平衡、学习速度和稳定性等挑战。优化方法包括改进探索策略(如随机探索、基于策略的探索)、提高学习速度(如多步学习、并行学习)和增强稳定性(如经验回放、正则化)。案例表明,这些优化可显著提升智能体在动态环境中的适应能力和性能。
646 20
|
12月前
|
人工智能 自然语言处理 安全
详解:poe ai官网是什么_poe ai官方网站_Poe AI官网入口
在全球范围内,人工智能的迅速发展引发了广泛关注,而Poe AI作为一款前沿的AI聊天平台,正处于这场技术变革的前沿
1523 10
|
机器学习/深度学习 消息中间件 监控
监控工具实现实时监测的方法
监控工具实现实时监测的方法
584 11
|
前端开发 JavaScript
宏任务和微任务在浏览器渲染过程中的执行顺序
宏任务和微任务是浏览器事件循环中的两种任务类型。宏任务包括整体代码块、setTimeout等,微任务有Promise.then、MutationObserver等。每个宏任务执行完毕后,会先执行完所有微任务,再进行下一轮渲染或执行下一个宏任务。
|
Web App开发 Python
DrissionPage 实战:极简壁纸爬取之旅
本文介绍了如何使用DrissionPage工具自动化爬取极简风格的壁纸图片。通过简单的环境搭建和代码实现,展示了从访问目标网站、定位图片元素到下载保存的全过程。文中还提供了详细的代码示例,帮助读者快速上手。
518 4