取数公式开发指南 只是做报表公式二次开发做一个参考
开发所需要新建的文件
com/kingdee/eas/fi/newrpt/formula/define/ formulas_defination.xml
这个文件的内容是
<?xml version="1.0" encoding="UTF-8"?>
<!-- 编辑使用 XMLSpy v2006 U (http://www.altova.com) 由 any (any) -->
<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Allen (king) -->
<!-- File节点是各个模块的实现公式定义,Type节点定义公式类型等辅助的东西 -->
<!-- formulas_type_defination.xml定义了大多数的类型 -->
<formulas_defination>
....省略一些内容.....
<!-- 二次开发专用扩展配置 -->
<File>com/kingdee/eas/fi/newrpt/formula/define/redev_formulas_defination.xml</File>
<Type>com/kingdee/eas/fi/newrpt/formula/define/redev_formulas_type_defination.xml</Type>
</formulas_defination>
在原有系统中已经留有公式二次开发的路径,只需要在他指定的包中创建文件就行了。
二次开发的主配置文件为:com/kingdee/eas/fi/newrpt/formula/define/redev_formulas_defination.xml
公式类型配置文件为:com/kingdee/eas/fi/newrpt/formula/define/redev_formulas_type_defination.xml(这个可以不用,直接参见formulas_type_defination.xml)
MExpAmtWOTaxWinzardUI需要继承 com.kingdee.eas.fi.rpt.client.FormulaWizardUI类
CostReportBatchCalculatorImpl批量计算类需要实现IMethodBatchQuery, INeedSheetInfo, IMethodFillParameter, ICalculator接口
MExpAmtWOTaxDataCalculator :具体计算类
主配置文件redev_formulas_defination.xml的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 编辑使用 XMLSpy v2006 U (http://www.altova.com) 由 any (any) -->
<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Allen (king) -->
<formulas_declaration>
<defaultBatchImplClass>com.kingdee.eas.fi.newrpt.formula.define.CostReportBatchCalculatorImpl</defaultBatchImplClass>
<formulas>
<!-- type -> 返回类型,category -> 公式分类 group-> 分式分组-->
<formula name="MexpAmtWOTax" type="amount" return="default" category="CslRptFormula" group="6"
wizard="com.kingdee.eas.fi.newrpt.formula.define.client.MExpAmtWOTaxWinzardUI">
<alias>
<local_name language="zh_CN">获取费用单据核定金额</local_name>
<local_name language="zh_TW">獲取費用單據核定金額</local_name>
<local_name language="en_US">MExpAmtWOTax</local_name>
</alias>
<params>
<param name="orgUnitCslRpt" type="companyOrgUnit" required="true">
<alias>
<local_name language="zh_CN">公司</local_name>
<local_name language="zh_TW">公司</local_name>
<local_name language="en_US">Company</local_name>
</alias>
<comments>
<comment language="zh_CN">该参数默认为表页参数中的财务组织,表页参数为空时,则默认为报表所属的财务组织。</comment>
<comment language="zh_TW">該參數默認為表頁參數中的財務組織,表頁參數為空時,則默認為報表所屬的財務組織。</comment>
<comment language="en_US">This parameter is defaulted to the financial organization in sheet parameter. When sheet parameter is blank, this parameter is defaulted to the financial organization of report.</comment>
</comments>
</param>
<param name="costBearingOrganization" type="CostBearingOrganization" required="true">
<alias>
<local_name language="zh_CN">费用承担组织</local_name>
<local_name language="zh_TW">費用承擔組織</local_name>
<local_name language="en_US">Cost bearing organization</local_name>
</alias>
<comments>
<comment language="zh_CN">选择实体成本中心。对应单据字段:分录-费用承担部门</comment>
<comment language="zh_TW">選擇實體成本中心。對應單據字段:分錄-費用承擔部門</comment>
<comment language="en_US">Select the entity cost center. Corresponding document field: entry expense bearing Department</comment>
</comments>
</param>
<param name="costType" type="expenseItem111" required="true">
<alias>
<local_name language="zh_CN">费用类型</local_name>
<local_name language="zh_TW">費用類型</local_name>
<local_name language="en_US">Cost type</local_name>
</alias>
<comments>
<comment language="zh_CN">选择费用类型。对应单据字段:分录-预算项目</comment>
<comment language="zh_TW">選擇費用類型。對應單據字段:分錄-預算項目</comment>
<comment language="en_US">Select the charge type. Corresponding doc field: Entry - budget item</comment>
</comments>
</param>
<param name="startDate" type="Date" required="true" >
<alias>
<local_name language="zh_CN">开始日期</local_name>
<local_name language="zh_TW">開始日期</local_name>
<local_name language="en_US">Start Date</local_name>
</alias>
<comments>
<comment language="zh_CN">开始日期</comment>
<comment language="zh_TW">開始日期</comment>
<comment language="en_US">Start Date</comment>
</comments>
</param>
<param name="endDate" type="Date" required="true" >
<alias>
<local_name language="zh_CN">结束日期</local_name>
<local_name language="zh_TW">結束日期</local_name>
<local_name language="en_US">End Date</local_name>
</alias>
<comments>
<comment language="zh_CN">结束日期</comment>
<comment language="zh_TW">結束日期</comment>
<comment language="en_US">End Date</comment>
</comments>
</param>
<param name="currencyRefm" type="dev_currency" required="false">
<alias>
<local_name language="zh_CN">币别</local_name>
<local_name language="zh_TW">币別</local_name>
<local_name language="en_US">Currency</local_name>
</alias>
<comments>
<comment language="zh_CN">为空则默认当前公司本位币对应的币别</comment>
<comment language="zh_TW">為空則默認當前公司本位幣對應的幣別</comment>
<comment language="en_US">If it is blank, the currency corresponding to the functional currency of the current company will be defaulted</comment>
</comments>
</param>
<param name="isTaxIncluded" type="boolean" default="false" required="false">
<alias>
<local_name language="zh_CN">是否含税</local_name>
<local_name language="zh_TW">是否含稅</local_name>
<local_name language="en_US">IsTaxIncluded</local_name>
</alias>
<comments>
<comment language="zh_CN">是否含税</comment>
<comment language="zh_TW">是否含稅</comment>
<comment language="en_US">IsTaxIncluded</comment>
</comments>
</param>
</params>
</formula>
</formulas>
</formulas_declaration>
公式类型配置文件redev_formulas_type_defination.xml的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 编辑使用 XMLSpy v2006 U (http://www.altova.com) 由 any (any) -->
<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Allen (king) -->
<formulas_declaration>
<datatypes>
<type name="amount" origin="amount"/>
<type name="content" origin="common"/>
<type name="integer" origin="integer"/>
<type name="booleanExpr" origin="boolean"/>
<type name="string" origin="string"/>
<type name="anytype" origin="anytype"/>
<!-- 公司 -->
<!--公司,财务组织-->
<type name="companyOrgUnit" origin="string">
<query>com.kingdee.eas.basedata.org.app.CompanyOrgUnitQuery</query>
<edit_fm>$number$</edit_fm>
<display_fm>$name$</display_fm>
<commit_fm>$id$</commit_fm>
</type>
<!--币别-->
<type name="dev_currency" origin="string">
<query>com.kingdee.eas.basedata.assistant.app.CurrencyQuery</query>
<edit_fm>$number$</edit_fm>
<display_fm>$name$</display_fm>
<commit_fm>$id$</commit_fm>
</type>
<!--费用类型-->
<type name="expenseItem111" origin="string">
<query>com.kingdee.eas.cp.bc.app.F7ExpenseTypeQuery</query>
<edit_fm>$number$</edit_fm>
<display_fm>$name$</display_fm>
<commit_fm>$id$</commit_fm>
</type>
<!--费用承担组织-->
<type name="CostBearingOrganization" origin="string">
<query>com.kingdee.eas.basedata.org.app.NewOrgF74BaseUnitQuery</query>
<edit_fm>$number$</edit_fm>
<display_fm>$name$</display_fm>
<commit_fm>$id$</commit_fm>
</type>
</datatypes>
</formulas_declaration>
MExpAmtWOTaxWinzardUI方法说明及关键代码:(MExpAmtWOTaxWinzardUI在redev_formulas_defination.xml中的wizard引用)
onOpen是打开公式选择窗口才响应的,
以下实现代码:
package com.kingdee.eas.fi.newrpt.formula.define.client;
import java.awt.event.ActionEvent;
import com.kingdee.bos.BOSException;
import com.kingdee.bos.ctrl.extendcontrols.KDBizPromptBox;
import com.kingdee.eas.fi.rpt.client.FormulaWizardUI;
import com.kingdee.bos.ctrl.swing.KDPromptBox;
import com.kingdee.bos.ctrl.swing.KDDatePicker;
import com.kingdee.bos.ctrl.swing.KDComboBox;
import com.kingdee.eas.basedata.org.CompanyOrgUnitInfo;
import com.kingdee.eas.common.EASBizException;
import com.kingdee.eas.common.client.SysContext;
import com.kingdee.bos.ctrl.swing.event.DataChangeListener;
import com.kingdee.bos.ctrl.swing.event.DataChangeEvent;
import java.util.HashSet;
import com.kingdee.eas.basedata.assistant.CurrencyFactory;
import com.kingdee.eas.basedata.assistant.CurrencyInfo;
import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
public class MExpAmtWOTaxWinzardUI extends FormulaWizardUI{
protected KDComboBox documentStatus = null;
protected KDBizPromptBox companyOrgUnit = null;
protected KDBizPromptBox costBearingOrganization = null;
protected KDBizPromptBox currency = null;
protected KDBizPromptBox costType = null;
protected KDDatePicker startTime = null;
protected KDDatePicker endTime = null;
protected KDComboBox isTaxIncluded = null;
protected static CompanyOrgUnitInfo company = null;
public MExpAmtWOTaxWinzardUI() throws Exception {
super();
}
@Override
public void actionFinish_actionPerformed(ActionEvent e) throws Exception {
super.actionFinish_actionPerformed(e);
}
@Override
protected void onOpen() {
this.companyOrgUnit = (KDBizPromptBox)this.getParamComponent("orgUnitCslRpt");
this.costBearingOrganization = (KDBizPromptBox)this.getParamComponent("costBearingOrganization");
this.currency = (KDBizPromptBox)this.getParamComponent("currencyRefm");
this.costType = (KDBizPromptBox) this.getParamComponent("costType");
this.startTime = (KDDatePicker)this.getParamComponent("startTime");
this.endTime = (KDDatePicker)this.getParamComponent("endTime");
this.isTaxIncluded = (KDComboBox)this.getParamComponent("isTaxIncluded");
}
}
CostReportBatchCalculatorImpl的方法说明及关键代码
batchQuery 为点击计算之后的入口方法
batchMethodQuery为根据方法名生成计算类进行计算类
以下是实现代码:
package com.kingdee.eas.fi.newrpt.formula.define;
import java.util.Date;
import java.util.Map;
import com.kingdee.bos.ctrl.excel.model.struct.IMethodBatchQuery;
import com.kingdee.bos.ctrl.excel.model.struct.IMethodFillParameter;
import com.kingdee.bos.ctrl.excel.model.struct.INeedSheetInfo;
import com.kingdee.eas.fi.newrpt.formula.ICalculateContextProvider;
import com.kingdee.eas.fi.newrpt.formula.ICalculator;
import com.kingdee.bos.ctrl.excel.model.util.SortedParameterArray;
import java.util.Iterator;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import com.kingdee.bos.Context;
public class CostReportBatchCalculatorImpl implements IMethodBatchQuery, INeedSheetInfo, IMethodFillParameter, ICalculator{
Context ServerCtx = null;
private ICalculateContextProvider iCalculateContextProvider;
private String sheetName = null;
//入口处
@Override
public boolean batchQuery(Map methodMap) {
// TODO Auto-generated method stub
Iterator it = methodMap.entrySet().iterator();
while(it.hasNext()){
Entry entry = (Entry)it.next();
String methodName = (String)entry.getKey();
SortedParameterArray methodParams = (SortedParameterArray)entry.getValue();
long begin = System.currentTimeMillis();
this.batchMethodQuery(this.iCalculateContextProvider, methodName, methodParams);
long end = System.currentTimeMillis();
}
return true;
}
//执行各种方法
public boolean batchMethodQuery(ICalculateContextProvider contextProvider, String methodName, SortedParameterArray methodParams) {
this.ServerCtx = contextProvider.getServerContext();
if (methodName.equalsIgnoreCase("MexpAmtWOTax"))
{
MExpAmtWOTaxDataCalculator caclter = new MExpAmtWOTaxDataCalculator(contextProvider,this.ServerCtx);
caclter.execute(methodParams);
}
return true;
}
public CostReportBatchCalculatorImpl(){
}
@Override
public String getSheetName() {
// TODO Auto-generated method stub
return this.sheetName;
}
@Override
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
// TODO Auto-generated method stub
}
@Override
public boolean getTrendParameters(Map arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public void initCalculateContext(ICalculateContextProvider contextProvider) {
// TODO Auto-generated method stub
this.context = contextProvider;
}
//必须新建方法构造函数
public Object MexpAmtWOTax(String orgUnitCslRpt,String CostBearingOrganization,String CostTypem,
Date startDate,Date endDate,String currencyRefm,boolean isTaxIncluded) {
return null;
}
}
MExpAmtWOTaxDataCalculator的方法说明及关键代码
excute 是收集传过来的参数并进行计算
calculate是把值写入表格中
嵌套类 MExpAmtWOTaxData(一定要实现IFormulaCalculator接口)
以下实现代码:
package com.kingdee.eas.fi.newrpt.formula.define;
import java.sql.SQLException;
import java.util.Date;
import com.kingdee.bos.BOSException;
import com.kingdee.bos.Context;
import com.kingdee.eas.fi.newrpt.formula.ICalculateContextProvider;
import com.kingdee.eas.fi.rpt.batch.CalculatorCombiner;
import com.kingdee.eas.fi.rpt.batch.IFormulaCalculator;
import com.kingdee.bos.ctrl.excel.model.util.SortedParameterArray;
import com.kingdee.bos.ctrl.excel.model.struct.Parameter;
import com.kingdee.bos.ctrl.common.variant.Variant;
import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;
import com.kingdee.eas.fi.gr.cslrpt.util.CslConstant;
import com.kingdee.eas.fi.rpt.batch.CalculatorCombiner;
import com.kingdee.eas.util.app.DbUtil;
import com.kingdee.jdbc.rowset.IRowSet;
import java.util.HashMap;
import java.util.Map;
import com.kingdee.eas.fi.rpt.batch.BatchHelper;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.sql.Timestamp;
public class MExpAmtWOTaxDataCalculator {
private ICalculateContextProvider iCalculateContextProvider;
//DButil用到这个参数
private Context context;
private List<MExpAmtWOTaxData> dataList = new ArrayList<MExpAmtWOTaxData>();
private BatchHelper batchHelper;
public MExpAmtWOTaxDataCalculator(ICalculateContextProvider iCalculateContextProvider, Context context){
this.context = context;
this.iCalculateContextProvider = iCalculateContextProvider;
}
public void execute(SortedParameterArray params)
{
for(int i=0;i<params.size();i++){
Parameter param = (Parameter)params.getAt(i);
MExpAmtWOTaxData data = new MExpAmtWOTaxData(this,param);
data = numberCovertoId(data);
dataList.add(data);
}
excute();
}
private void excute(){
this.calculate();
}
private void calculate(){
//List usedDataList = new ArrayList();
int listSize = this.dataList.size();
StringBuffer property = new StringBuffer();
int index = 0;
CalculatorCombiner combiner = new CalculatorCombiner(new HashMap());
for(;index<listSize;index++){
MExpAmtWOTaxData data=dataList.get(index);
//中间进行SQL语句查询.....
BigDecimal result = null;
if ( result == null) {
//result = CslConstant.BGZERO;
result = new BigDecimal(1);
}
//核心语句,值反写到报表中
combiner.combineEachValue(data, result, true);
}
}
public MExpAmtWOTaxData numberCovertoId(MExpAmtWOTaxData data){
//编码转id
String companySql = "select FID from T_ORG_BaseUnit where fnumber = '"+data.orgUnitCslRpt+"'";
String costCenterSql = "select FID from T_ORG_BaseUnit where fnumber = '"+data.CostBearingOrganization+"'";
String costTypeSql = "select FID from T_BC_ExpenseType where fnumber ='"+data.CostTypem+"'";
String currencySql = "select FID from T_BD_Currency where fnumber ='"+data.currencyRefm+"'";
try {
IRowSet companyRs = DbUtil.executeQuery(this.context,companySql);
IRowSet costCenterRs = DbUtil.executeQuery(this.context,costCenterSql);
IRowSet costTypeRs = DbUtil.executeQuery(this.context,costTypeSql);
IRowSet currencyRs = DbUtil.executeQuery(this.context,currencySql);
while(companyRs.next()){
data.orgUnitCslRpt=companyRs.getString("FID");
}
while(costCenterRs.next()){
data.CostBearingOrganization=costCenterRs.getString("FID");
}
while(costTypeRs.next()){
data.CostTypem=costTypeRs.getString("FID");
}
while(currencyRs.next()){
data.currencyRefm=currencyRs.getString("FID");
}
} catch (BOSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
class MExpAmtWOTaxData implements IFormulaCalculator {
Parameter param;
String orgUnitCslRpt;
String CostBearingOrganization;
String CostTypem;
String startDate;
String endDate;
Date dateStartDate;
Date dateEndDate;
String currencyRefm;
String isTaxIncluded;
Exception ex;
boolean hasException;
MExpAmtWOTaxData(MExpAmtWOTaxDataCalculator var1,Parameter param){
this.param=param;
initParamt();
}
void initParamt(){
initArgs();
validate();
}
private void initArgs(){
Object[] args = this.param.getArgs();
if(args[0].getClass().isArray()){
args = (Object[])((Object[])args[0]);
}
this.orgUnitCslRpt = ((Variant)args[0]).getValue() == null ? null : ((Variant)args[0]).getValue().toString();
this.CostBearingOrganization = ((Variant)args[1]).getValue() == null ? null : ((Variant)args[1]).getValue().toString();
this.CostTypem = ((Variant)args[2]).getValue() == null ? null : ((Variant)args[2]).getValue().toString();
this.startDate = (((Variant)args[3]).getValue() == null ? null : ((Variant)args[3]).getValue()).toString();
this.endDate = (((Variant)args[4]).getValue() == null ? null : ((Variant)args[4]).getValue()).toString();
this.currencyRefm = ((Variant)args[5]).getValue() == null ? null : ((Variant)args[5]).getValue().toString();
this.isTaxIncluded = ((Variant)args[6]).getValue() == null ? null : ((Variant)args[6]).getValue().toString();
}
private void validate(){
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
this.dateStartDate = dateFmt.parse(this.startDate + " 00:00:00");
this.dateEndDate = dateFmt.parse(this.endDate + " 23:59:59");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public Exception getException() {
// TODO Auto-generated method stub
return ((this.ex == null) ? null : this.ex);
}
//得到参数
@Override
public Parameter getParameter() {
// TODO Auto-generated method stub
return this.param;
}
void setException(Exception e) {
this.ex = e;
this.hasException = true;
}
void removeException() {
this.ex = null;
this.hasException = false;
}
//得到表名
@Override
public String getSheetName() {
// TODO Auto-generated method stub
return this.param.getSheetName();
}
@Override
public boolean isException() {
// TODO Auto-generated method stub
return this.hasException;
}
}
}
关于EAS取数公式就写到这里,希望对你有个参考