【springmvc+mybatis项目实战】杰信商贸-21.合同总金额SQL

我们上一次解决了合同的货物以及附件显示功能,接下来我们要完成我们的另一项功能,也即是我们的购销合同的总金额。

我们的购销合同的总金额由以下金额构成:货物的总金额,而货物的总金额由货物本身的金额+附件金额构成,也就是说,我们想要获取购销合同的总金额,就要获取合同下的所有货物的总金额(货物总金额要获取所有货物的金额,以及这个货物下的所有附件的总金额)。

听起来有点绕,但是我们把它写成sql语句,分好层次,我们就能够清晰的理解购销合同的总金额是如何来的了:

1)可以通过货物的新增时,同步计算货物的总金额和和合同的总金额;在附件新增时,同步计算附件的总金额和合同的总金额;(程序来完成)(修改、删除时重新计算)
2)SQL查询实现
货物的总金额

select sum(cnumber*price) as cptotal from contract_product_c
where contract_id ='471e562b-bfa5-4ba7-a2b5-17e9b0d40179'

附件的总金额

select sum(cnumber*price) as exttotal from ext_cproduct_c
       where contract_product_id in (select contract_product_id from contract_product_c where contract_id=c.contract_id)

最终

select
  (select count(*) from contract_product_c
  where contract_id=c.contract_id)  as cpnum,
  (select count(*) from ext_cproduct_c
          where contract_product_id in (select contract_product_id from contract_product_c where contract_id=c.contract_id)
      ) as extnum,
  (
      nvl((select sum(cnumber*price) as cptotal from contract_product_c
      where contract_id =c.contract_id),0)
      +
      nvl(
      (select sum(cnumber*price) as exttotal from ext_cproduct_c
       where contract_product_id in (select contract_product_id from contract_product_c where contract_id=c.contract_id))
       ,0)
  ) as total_amount,
c.CONTRACT_ID,c.OFFEROR,c.CONTRACT_NO,c.SIGNING_DATE,c.INPUT_BY,c.CHECK_BY,c.INSPECTOR,c.IMPORT_NUM,c.CREQUEST,c.CUSTOM_NAME,c.DELIVERY_PERIOD,c.SHIP_TIME,c.TRADE_TERMS,c.REMARK,c.PRINT_STYLE,c.OLD_STATE,c.STATE,c.OUT_STATE

from contract_c c

注:nvl(a,b),nvl函数是Oracle的一个函数(其他数据库要进行修改),参数a是取出的值,参数b是当a值为空null的时候值默认为b值。

我们修改ContractMapper的find配置语句块:

<!-- 查询多个 -->
	<!-- 如果支持异构数据,必须针对每个数据库写一个SQL语句,因为使用了底层数据函数nvl -->
	<select id="find" parameterType="map" resultMap="contractRM">
		select
  		(select count(*) from contract_product_c
 		 where contract_id=c.contract_id)  as cpnum,
  		(select count(*) from ext_cproduct_c
          where contract_product_id in (select contract_product_id from
          contract_product_c where contract_id=c.contract_id)
         ) as extnum,
  		( nvl((select sum(cnumber*price) as cptotal from contract_product_c
      	  where contract_id =c.contract_id),0)
      		+
      	  nvl((select sum(cnumber*price) as exttotal from ext_cproduct_c
          where contract_product_id in (select contract_product_id from
          contract_product_c where contract_id=c.contract_id)),0)
          ) as total_amount,
		c.CONTRACT_ID,c.OFFEROR,c.CONTRACT_NO,c.SIGNING_DATE,c.INPUT_BY,c.CHECK_BY,
		c.INSPECTOR,c.IMPORT_NUM,c.CREQUEST,c.CUSTOM_NAME,c.DELIVERY_PERIOD,c.SHIP_TIME,c.
		TRADE_TERMS,c.REMARK,c.PRINT_STYLE,c.OLD_STATE,c.STATE,c.OUT_STATE
		from contract_c c
	</select>

接下来我们重启服务器来测试:
我们可以看到,这个购销合同的总结是1600

我们来检验一下是不是1600。

首先,它有两个货物

总金额为:200+1200=1400。然后看一下附件,只有一件附件

附件总金额为200,所以最终总金额为1400+200=1600,和我们程序计算的一模一样。我们的总金额计算方法成功!

但是,我们要在增加、删除以及修改的时候对总金额进行更新,所以要修改一部分代码,这里我们就不在赘述

转载请注明出处:http://blog.csdn.net/acmman/article/details/48627709

时间: 2024-10-02 12:12:21

【springmvc+mybatis项目实战】杰信商贸-21.合同总金额SQL的相关文章

【springmvc+mybatis项目实战】杰信商贸-1.项目背景

1.项目背景 杰信项目物流行业的项目, 杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发<杰信商贸综合管理平台>. <杰信商贸综合管理平台>分三期完成.一期完成仓储管理(包括:采购单.仓库.货物.条形码.入库.出库.退货.盘点.库存.库存上限报警.统计查询)和展会管理(包括:展会管理.出单管理),形成货物统一数字化

【springmvc+mybatis项目实战】杰信商贸-13.购销合同列表

我们接下来开始编写购销合同的列表业务 首先我们现往我们的FACTORY_C和基础表中倒入一些数据方便我们测试 导入数据的SQL文件:jk.sql (点击下载) 然后我们看到数据已经插入 启动服务器查看我们的数据已经插入 接下来我们开始做购销合同的业务.首先我们的数据库表已经建立(CONTRACT_C),我们首先创建购销合同的实体类Contract.java: package cn.hpu.jk.domain; import java.util.Date; public class Contrac

【springmvc+mybatis项目实战】杰信商贸-31.出口报运业务-购销合同查询与上报

我们上一篇完成了出口报运增删查修的mapper+Dao+Service+Controller,而且在Controller中添加和获取出口报运的列表的方法,然后成功获取了出口报运的列表: 然后我们这次要添加出口报运的"新增"方法,但是这个"新增"和以往的新增方法不同,这个要与之前的购销合同关联在一起. 我们出口报运的"新增"是这样的: 用户要选择多个合同,然后进行报运.(体现出业务关联) 报运新增时,报运专责只能看到已上报的购销合同. (操作出口报

【springmvc+mybatis项目实战】杰信商贸-11.购销合同业务

生产厂家我们做完了,接下来我们要做一个更加复杂的业务,就是"货运管理" 首先我们先了解一下业务,什么是"货运管理"? "货运管理"是国际物流的概念,往常我们货物送到国内没有那么多事情,但是货物发往国外就多了很多手续,依靠小物流公司我们是很不可能的,需要行业的大背景的支撑.下面我们来看看它是怎么做的 a)业务:购销合同 当我们的客户通过展会.其它渠道跟杰信公司联系上以后,他们看上杰信的货物样品,他们会跟杰信签订一个购买合同(样式要求,货物数量),客

【springmvc+mybatis项目实战】杰信商贸-15.细粒度的权限控制+业务上报取消

上一篇总结我们完成了购销合同的增删改查业务,这一篇我们首先完成权限控制以及业务的上报取消的设置功能. 先说我们的权限控制 1.细粒度的权限控制 a)日常权限框架: 基于角色权限,用户.角色.权限(URL.主菜单.左侧菜单.按钮) b)数据权限: 纵向的数据权限过滤:对数据进行过滤 1)本人(专责):登录后只能看到自己的信息Where条件 create_by = #{当前登录者id} 2)部门(集团公司):登录后登录人是经理级别A.只能看本部门Where条件 create_dept=#{当前登录者

【springmvc+mybatis项目实战】杰信商贸-4.maven依赖+PO对+映射文件

我们来为刚刚创建的数据库表来在工程中创建PO对象 首先我们要创建工程 项目的开发环境 序号 工  具                用  途 1 MyEclipse 2014   IDE 2 JDK 1.7.9        Java虚拟机 3 TOMCAT 7.0.26       中间件 4 Oracle11g/10g.MySQL 5.0.87数据库 5 PL/SQL .SQLyog 8.2SQL控制台 6 apache-maven-3.0.5MAVEN 7 PowerDesigner 15

【springmvc+mybatis项目实战】杰信商贸-8.生产厂家修改

上一次我们做了生产厂家的新增,下面我们来做一下生产厂家的修改 回顾一下我们的FactoryMapper.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

【springmvc+mybatis项目实战】杰信商贸-19.级联删除

我们从写项目开始到现在,一共完成了生产厂家.购销合同.货物(购销合同下的).附件(货物下的)这四大块的大部分业务. 我们的生产厂家.购销合同.货物(购销合同下的).附件(货物下的)这四大块的关系我们来回顾一下: 我们先不管生产厂家(因为它可以和后三个关联关系最弱). 购销合同与货物是一对多的关系,而货物与附件又是一对多的关系.那么购销合同与附件是两层一对多的关系.这里我们要注意,在两层一对多结构中,子表数据不设置外键关联时,就称为僵尸数据. 因为我们的购销合同.货物.附件表虽然都存储有关联关系的

【springmvc+mybatis项目实战】杰信商贸-23.重点知识回顾

1.重点知识回顾 购销合同查看,采用类似hibernate方式,都以对象关联方式. (1)PO为了利用MyBatis性能,在创建时,没有采用关联对象关联,而是将对象关键字段,也就是外键,利用这个普通属性,来记录值,表数据间关联关系存在,但对象关联关系不存在.代码也就变得简单.在货物新增时,只要从主对象中携带过来,主表ID即可. (2)VO为了方便对象关联时取数据.在列表循环货物信息时,要去查询当前货物下的附件时,如果采用上面的方式,只能再次查询.但是我们以对象关联方式,可以直接获取到当前货物下的