EAS 取数公式二次开发指南

取数公式开发指南 只是做报表公式二次开发做一个参考

开发所需要新建的文件

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取数公式就写到这里,希望对你有个参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值