用友uap nc65开发-使用自定义公式解决参照多显问题

来源:互联网 发布:sql delete 删除列 编辑:程序博客网 时间:2024/05/17 00:15

用友uap nc65开发-使用自定义公式解决参照多显问题

1.场景描述:在项目开发中,收费清单存在多房产且该字段为参照,在数据库中存在多个pk值且以逗号隔开,但在界面无法显示,在前面博客中已使用另外一种方法解决,但对于数据量大的单据无法处理,会导致宕机。
2.解决思路:使用自定义显示公式,传入参照的表名,pk,name,对应行的pk_head,通过代码处理,将参照对应的pk在对应表中查出对应的name值,并使用逗号分割显示在界面。
3.在home\resources\formulaconfig\custfunction目录下新建一个xml文件配置公式,如图所示:

xml文件配置如下:
<?xml version="1.0" encoding="utf-8"?><formula-array><formula>  <customType>0</customType>  <functionName>MultiRefName</functionName>  <functionClass>nc.itf.fdc_pr.formula.MultiRefNameFormula</functionClass></formula></formula-array>
其中functionClass对应公式支持的java类,functionName对应公式显示名称。
4.MultiRefNameFormula代码支持类如下:
package nc.itf.fdc_pr.formula;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Stack;import nc.bs.framework.common.NCLocator;import nc.itf.fdc_crmbd.IH3H045Maintain;import nc.vo.pub.formulaset.IFormulaConstant;import nc.vo.pub.formulaset.core.ParseException;import nc.vo.pub.formulaset.function.PostfixMathCommand;/** *  * @author lqh * */public class MultiRefNameFormula extends PostfixMathCommand{public MultiRefNameFormula() {numberOfParameters = 4;//参数数量functionType = IFormulaConstant.FUN_CUSTOM;//公式类型functionDesc = "根据传进来的多选参照主键传出参照显示名称";//公式描述}@Override/** * Stack 栈取数据的顺序和存数据的顺序相反(FILO先进后出) * 所以要用反序赋值 */public void run(Stack s) throws ParseException {checkStack(s);String tableName = (String) s.pop();//表名String pkFieldName = (String) s.pop();//主键字段名/** *  传进来的是一个list,其中的每一个String对应一行数据 *  所以返回也要返回一个List,对应每一行数据 */ArrayList<String> pks = (ArrayList<String>) s.pop();//每一行的主键String nameFieldName = (String) s.pop();//要获取的字段名List<String> names = getRefName(tableName, pkFieldName, pks.toArray(new String[0]), nameFieldName);//for (int i = 0 ; i < pks.size() ; i ++){//String pk = pks.get(i);//if (pk != null){//String name = getRefName(tableName,pkFieldName,pk.split(","),nameFieldName);//names.add(name);//}else{//names.add(null);//}//}s.push(names);}private List<String> getRefName(String tableName, String pkFieldName, String[] pks, String nameFieldName) {IH3H045Maintain maintain = NCLocator.getInstance().lookup(IH3H045Maintain.class);String[] names = maintain.queryRefName(tableName, pkFieldName, pks, nameFieldName);return Arrays.asList(names);}}

重要代码方法在类中已经标记。

public String[] queryRefName(String tableName, String pkFieldName,String[] pks, String nameFieldName) {if (tableName == null || pks == null || pks.length == 0) {return null;}String[] names = new String[pks.length];if (pkFieldName == null) {pkFieldName = "pk_head";}if (nameFieldName == null) {nameFieldName = "name";}BaseDAO dao = new BaseDAO();StringBuilder sql = new StringBuilder();for (int i = 0; i < pks.length; i++) {sql.setLength(0);sql.append("select ");sql.append(nameFieldName);sql.append(" from ");sql.append(tableName);sql.append(" where ");sql.append(pkFieldName);sql.append(" in ( '1' ");int j = 0;if (pks[i] == null){names[i] = null;continue;}for (String str : pks[i].split(",")) {if (str != null) {sql.append(",'").append(str).append("'");j++;if (j == 300) {sql.append(") or pk_head in ( '1' ");}}}sql.append(")");try {String name = (String) dao.executeQuery(sql.toString(),new ResultSetProcessor() {/** *  */private static final long serialVersionUID = -4527998249487262608L;@Overridepublic Object handleResultSet(ResultSet rs)throws SQLException {StringBuffer name = new StringBuffer();while (rs != null && rs.next()) {name.append(rs.getString(1)).append(",");}if (name.length() != 0) {name.deleteCharAt(name.lastIndexOf(","));return name.toString();}return null;}});names[i] = name;} catch (DAOException e) {ExceptionUtils.wrappBusinessException("查询数据库错误:"+ e.getMessage());}}return names;}


5.重启服务器,清理缓存,打开单据模版初始化节点,我们使用另外一个字段来实现该多参照名字,在该字段中配置显示公式:
temp->getcolvalue( fdc_pr_bill,pk_allhouses,pk_head ,pk_head );
multirefname( "name",temp,"pk_head" ,"fdc_crmbd_fangchanzhubiao")
先在收费清单表中查出对应行的房产pk值赋给temp,后调用我们写的自定义公式,将值传入。


6.结果如下:


阅读全文
1 0
原创粉丝点击