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);
}
}
}
}