金蝶按树型组织汇总数据扩展报表实现总结

27 篇文章 1 订阅

1.新装java数据集


2.java数据集的实现

   学习:

   1.客户端执行sql的方法

    2.递归实现遍历组织树的方法

    3.count,sum与distinct,case when then的混合运用进行复杂数据的统计

    4.按树形组织汇总统计的实现方案

    5.如何构建IRowSet对象

    6.代码执行言的方法

package com.kingdee.eas.vk.weixun.rpts;

import java.awt.Window;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.kingdee.bos.dao.query.SQLExecutorFactory;
import com.kingdee.eas.base.form.SqlExecutorFacade;
import com.kingdee.eas.base.multiapprove.SqlFacadeFactory;
import com.kingdee.eas.dynbusiness.util.SqlBuilderHelper;
import com.kingdee.eas.rpts.ctrlsqldesign.model.ExtDBUtil;
import com.kingdee.eas.rpts.ctrlsqldesign.param.AbstractJavaDataSet;
import com.kingdee.jdbc.rowset.IRowSet;
import com.kingdee.jdbc.rowset.impl.ColInfo;
import com.kingdee.jdbc.rowset.impl.DynamicRowSet;

public class BizAccountBillFromPhoneRptDataSet extends AbstractJavaDataSet
{
	@Override
	public IRowSet[] getCustomRowSet(Window parent, String otherDataCenter) throws Exception
	{
		return getCustomRowSet1(parent,otherDataCenter);
	}
	
	private IRowSet[] getCustomRowSet1(Window parent, String otherDataCenter) throws Exception
	{
		//存放数据集 
		IRowSet[] rowsets = new IRowSet[1];
		//根据key得到参数
		String companyLongNumber = (String)this.filterParamMap.get("companyLongNumber");
		String level = (String)this.filterParamMap.get("level");
		String start = (String)this.filterParamMap.get("start");
		String end = (String)this.filterParamMap.get("end");
		
		StringBuffer sql = new StringBuffer();
		sql.append("	SELECT company.fid         companyid,				\n");
		sql.append("	       company.fname_l2    companyname,				\n");
		sql.append("	       company.fnumber     companynumber,				\n");
		sql.append("	       company.flongnumber companylongnumber,				\n");
		sql.append("	       company.flevel      alevel,				\n");
		sql.append("	       parentcompany.flongnumber parentlongnumber				\n");
		sql.append("	FROM   t_org_company company				\n");
		sql.append("	left join   t_org_company parentcompany				\n");
		sql.append("	on   company.fparentid=parentcompany.fid				\n");
		sql.append("	WHERE  company.flongnumber LIKE '"+companyLongNumber+"%'				\n");
		sql.append("	       AND company.flevel <= "+level+"				\n");
		sql.append("	ORDER BY company.flevel,company.fnumber				\n");
		IRowSet rs = ExtDBUtil.executeQuery(null,sql.toString(),otherDataCenter);
		Map<String,List<Map<String,String>>> companyMap = new HashMap<String,List<Map<String,String>>>();
		Map<String,String> rootCompany = null;
		while(rs.next())
		{
			Map<String,String> company = new HashMap<String,String>();
			String longNumber = rs.getString("companylongnumber");
			if(longNumber==null)
			{
				continue;
			}
			company.put("companyLongNumber", longNumber);
			company.put("companyName", rs.getString("companyname"));
			company.put("level", rs.getString("alevel"));
			
			String parentLongNumber = rs.getString("parentlongnumber");
			if(parentLongNumber!=null)
			{
				List<Map<String, String>> companyList = companyMap.get(parentLongNumber);
				if(companyList==null)
				{
					companyList = new ArrayList<Map<String,String>>();
					companyMap.put(parentLongNumber, companyList);
				}
				companyList.add(company);
			}

			if(longNumber.equals(companyLongNumber))
			{
				rootCompany = company;
			}
		}
		List<Map<String,String>> companyLinkedList = new LinkedList<Map<String,String>>();
		companyLinkedList.add(rootCompany);
		getCompanyList(rootCompany,companyLinkedList,companyMap);
		
		StringBuffer sql1 = new StringBuffer();
		sql1.append("	/*dialect*/ 					\n");//代码执行言的方法
		sql1.append("	create or replace view view_bizaccountbill as				\n");
		sql1.append("	SELECT company.flongnumber   companylongnumber,				\n");
		sql1.append("	       bill.fid              billid,				\n");
		sql1.append("	       bill.cfisfromphone    isfromphone,				\n");
		sql1.append("	       bill.fcreatorid       creatorid,				\n");
		sql1.append("	       bill.cfisimgover      isimgover,				\n");
		sql1.append("	       exptype.cfisindamount isindamount,				\n");
		sql1.append("	       exptype.fname_l2      expname,				\n");
		sql1.append("	       exptype.cfexpenseclass      expenseclass,				\n");
		sql1.append("	       entry.famount         amount				\n");
		sql1.append("	FROM   t_bc_bizAccountBill bill				\n");
		sql1.append("	       LEFT JOIN t_org_company company				\n");
		sql1.append("	              ON bill.fcompanyid = company.fid				\n");
		sql1.append("	       LEFT JOIN T_BC_BizAccountBillEntry entry				\n");
		sql1.append("	              ON entry.fbillid = bill.fid				\n");
		sql1.append("	       LEFT JOIN T_BC_ExpenseType exptype				\n");
		sql1.append("	              ON entry.fExpenseTypeid = exptype.fid				\n");
		sql1.append("	WHERE  1 = 1				\n");
		sql1.append("	       AND company.flongnumber LIKE '"+companyLongNumber+"%'				\n");
		sql1.append("	       AND bill.fcreatetime >= {ts '"+start+"'}				\n");
		sql1.append("	       AND bill.fcreatetime <= {ts '"+end+"'}				\n");
		//客户端执行sql方法
		SqlFacadeFactory.getRemoteInstance().executeSql(sql1.toString());
		
		//count,sum与distinct,case when then的混合运用进行复杂数据的统计
		StringBuffer sql2 = new StringBuffer();
		sql2.append("	select	\n");
		sql2.append("	    companylongnumber,	\n");
		sql2.append("	    count(distinct case when isfromphone=1 then creatorid else null end) phoneqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 then creatorid else null end) fullqty,	\n");
		sql2.append("	    count(distinct case when isfromphone=1 then billid else null end) phonebillqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 then billid else null end) billqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 and isimgover=1 then billid else null end) imgoverqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 and expenseclass=1 then billid else null end) carfeeqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 and expenseclass=2 then billid else null end) nocarfeeqty,	\n");
		sql2.append("	    count(distinct case when isindamount=1 and expenseclass=3 then billid else null end) tongxunfeeqty,	\n");
		sql2.append("	    sum(case when isindamount=1 and expenseclass=1 then amount else 0 end) carfeeamount,	\n");
		sql2.append("	    sum(case when isindamount=1 and expenseclass=2 then amount else 0 end) nocarfeeamount,	\n");
		sql2.append("	    sum(case when isindamount=1 and expenseclass=3 then amount else 0 end)tongxunfeeamount	\n");
		sql2.append("	from view_bizaccountbill	    \n");
		sql2.append("	group by companylongnumber   	\n");
		IRowSet rs4 = ExtDBUtil.executeQuery(null,sql2.toString(),otherDataCenter);
		Map<String,Map<String,String>> rows = new HashMap<String,Map<String,String>>();
		while(rs4.next())
		{
			String acompanyLongNumber = rs4.getString("companylongnumber");
			int phoneQty = rs4.getInt("phoneqty");
			int fullQty = rs4.getInt("fullqty");
			int phoneBillQty = rs4.getInt("phonebillqty");
			int billQty = rs4.getInt("billqty");
			int imgOverQty = rs4.getInt("imgoverqty");
			int carfeeQty = rs4.getInt("carfeeqty");
			int nocarfeeQty = rs4.getInt("nocarfeeqty");
			int tongxunfeeQty = rs4.getInt("tongxunfeeqty");
			BigDecimal carfeeAmount = rs4.getBigDecimal("carfeeamount");
			BigDecimal nocarfeeAmount = rs4.getBigDecimal("nocarfeeamount");
			BigDecimal tongxunfeeAmount = rs4.getBigDecimal("tongxunfeeamount");
			
			Map<String,String> row = new HashMap<String,String>();
			row.put("phoneQty", String.valueOf(phoneQty));
			row.put("fullQty", String.valueOf(fullQty));
			row.put("phoneBillQty", String.valueOf(phoneBillQty));
			row.put("billQty", String.valueOf(billQty));
			row.put("imgOverQty", String.valueOf(imgOverQty));
			row.put("carfeeQty", String.valueOf(carfeeQty));
			row.put("nocarfeeQty", String.valueOf(nocarfeeQty));
			row.put("tongxunfeeQty", String.valueOf(tongxunfeeQty));
			row.put("carfeeAmount", carfeeAmount.toString());
			row.put("nocarfeeAmount", nocarfeeAmount.toString());
			row.put("tongxunfeeAmount", tongxunfeeAmount.toString());
			
			rows.put(acompanyLongNumber, row);
		}

		//如何构建IRowSet对象
		DynamicRowSet drs = new DynamicRowSet(14); 
        drs.setColInfo(1, this.createColInfo(12,"companyname",1)); 
        drs.setColInfo(2, this.createColInfo(12,"phoneqty",1)); 
        drs.setColInfo(3, this.createColInfo(12,"fullqty",1)); 
        drs.setColInfo(4, this.createColInfo(12,"phonerate",1)); 
        drs.setColInfo(5, this.createColInfo(12,"phonebillqty",1)); 
        drs.setColInfo(6, this.createColInfo(12,"billqty",1)); 
        drs.setColInfo(7, this.createColInfo(12,"phonerate1",1)); 
        drs.setColInfo(8, this.createColInfo(12,"imgoverqty",1)); 
        drs.setColInfo(9, this.createColInfo(12,"carfeeqty",1)); 
        drs.setColInfo(10, this.createColInfo(12,"carfeeamount",1)); 
        drs.setColInfo(11, this.createColInfo(12,"nocarfeeqty",1)); 
        drs.setColInfo(12, this.createColInfo(12,"nocarfeeamount",1)); 
        drs.setColInfo(13, this.createColInfo(12,"tongxunfeeqty",1)); 
        drs.setColInfo(14, this.createColInfo(12,"tongxunfeeamount",1)); 
        
        String rootLevel = rootCompany.get("level");
		for(int i=0,size=companyLinkedList.size();i<size;i++)
		{
			Map<String, String> company = companyLinkedList.get(i);
	        String longNumber = company.get("companyLongNumber");
	        String companyName = company.get("companyName");
	        String alevel = company.get("level");
	        
	        
			int phoneQty = 0;
			int fullQty = 0;
			int phoneBillQty = 0;
			int billQty = 0;
			int imgOverQty = 0;
			int carfeeQty = 0;
			int nocarfeeQty = 0;
			int tongxunfeeQty = 0;
			BigDecimal carfeeAmount = BigDecimal.ZERO;
			BigDecimal nocarfeeAmount = BigDecimal.ZERO;
			BigDecimal tongxunfeeAmount = BigDecimal.ZERO;
	        for(String key:rows.keySet())
	        {
	        	if(key.startsWith(longNumber+"!") || key.equals(longNumber))
	        	{
	        		Map<String, String> row = rows.get(key);
	        		phoneQty = phoneQty+Integer.valueOf(row.get("phoneQty"));
	        		fullQty = fullQty+Integer.valueOf(row.get("fullQty"));
	        		phoneBillQty = phoneBillQty+Integer.valueOf(row.get("phoneBillQty"));
	        		billQty = billQty+Integer.valueOf(row.get("billQty"));
	        		imgOverQty = imgOverQty+Integer.valueOf(row.get("imgOverQty"));
	        		carfeeQty = carfeeQty+Integer.valueOf(row.get("carfeeQty"));
	        		nocarfeeQty = nocarfeeQty+Integer.valueOf(row.get("nocarfeeQty"));
	        		tongxunfeeQty = tongxunfeeQty+Integer.valueOf(row.get("tongxunfeeQty"));
	        		carfeeAmount = carfeeAmount.add(new BigDecimal(row.get("carfeeAmount")));
	        		nocarfeeAmount = nocarfeeAmount.add(new BigDecimal(row.get("nocarfeeAmount")));
	        		tongxunfeeAmount = tongxunfeeAmount.add(new BigDecimal(row.get("tongxunfeeAmount")));
	        	}
	        }
	        
	        if(billQty==0)
	        {
	        	continue;
	        }
	        
	        drs.moveToInsertRow();
	        int j = Integer.valueOf(alevel)-Integer.valueOf(rootLevel);
	        String acompanyName = companyName;
	        for(int m=0;m<j;m++)
	        {
	        	acompanyName = "    "+acompanyName;
	        }
	        drs.updateString("companyname", acompanyName);
	        drs.updateString("phoneqty", String.valueOf(phoneQty)); 
	        drs.updateString("fullqty", String.valueOf(fullQty)); 
	        BigDecimal phonerate = BigDecimal.ZERO;
	        if(fullQty!=0)
	        {
	        	phonerate = new BigDecimal(phoneQty*100).divide(new BigDecimal(fullQty), 2, RoundingMode.HALF_DOWN);
	        }
	        drs.updateString("phonerate", phonerate.toString()); 
	        drs.updateString("phonebillqty", String.valueOf(phoneBillQty)); 
	        drs.updateString("billqty", String.valueOf(billQty)); 
	        BigDecimal phonerate1 = BigDecimal.ZERO;
	        if(billQty!=0)
	        {
	        	phonerate1 = new BigDecimal(phoneBillQty*100).divide(new BigDecimal(billQty), 2, RoundingMode.HALF_DOWN);
	        }
	        drs.updateString("phonerate1", phonerate1.toString()); 
	        drs.updateString("imgoverqty", String.valueOf(imgOverQty)); 
	        drs.updateString("carfeeqty", String.valueOf(carfeeQty)); 
	        drs.updateString("carfeeamount", carfeeAmount.toString()); 
	        drs.updateString("nocarfeeqty", String.valueOf(nocarfeeQty)); 
	        drs.updateString("nocarfeeamount", nocarfeeAmount.toString()); 
	        drs.updateString("tongxunfeeqty", String.valueOf(tongxunfeeQty)); 
	        drs.updateString("tongxunfeeamount", tongxunfeeAmount.toString()); 
	        
	        drs.insertRow();
		}
		
        drs.beforeFirst();
		rowsets[0] = drs;
		return rowsets;
	}
	
	@Override
	public Map getOutputParam() throws Exception
	{
		Map param = new LinkedHashMap();
		param.put("companyname", "公司");
		param.put("phoneqty", "手机报销人数量");
		param.put("fullqty", "报销人数量");
		param.put("phonerate", "手机报销占比");
		param.put("phonebillqty", "手机报销单数量");
		param.put("billqty", "报销单数量");
		param.put("phonerate1", "手机报销占比");
		param.put("imgoverqty", "影像超期数量");
		param.put("carfeeqty", "车辆费手机报销单数量");
		param.put("carfeeamount", "车辆费手机报销单金额");
		param.put("nocarfeeqty", "交通费手机报销单数量");
		param.put("nocarfeeamount", "交通费手机报销单金额");
		param.put("tongxunfeeqty", "通讯费手机报销单数量");
		param.put("tongxunfeeamount", "通讯费手机报销单金额");
		return param;
	}

	@Override
	public void setFilterParam(Map filterParamMap)
	{
		this.filterParamMap = (HashMap)filterParamMap; 
	}
	
	private ColInfo createColInfo(int colType,String columnName,int nullable)
	{
        ColInfo ci = new ColInfo();  
        ci.colType = colType;  
        ci.columnName = columnName;  
        ci.nullable = nullable;  
        return ci;
	}
	
	/**
	 * 递归方法遍历组织树
	 * 版本:EAS7.5
	 * 作者(修改人):haohan
	 * 修改时间:2015-10-22
	 *		<p>
	 * 描 述:
	 * @param currCompany
	 * @param companyLinkedList
	 * @param companyMap
	 */
	private void getCompanyList(Map<String,String> currCompany,List<Map<String,String>> companyLinkedList,Map<String,List<Map<String,String>>> companyMap)
	{
		if(companyLinkedList==null)
		{
			companyLinkedList = new LinkedList<Map<String,String>>();
		}
		String currLongNumber = currCompany.get("companyLongNumber");
		List<Map<String, String>> companyList = companyMap.get(currLongNumber);
		if(companyList!=null && companyList.size()>0)
		{
			for(int i=0,size=companyList.size();i<size;i++)
			{
				Map<String, String> company = companyList.get(i);
				companyLinkedList.add(company);
				getCompanyList(company,companyLinkedList,companyMap);
			}
		}
	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值