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

用友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;

							@Override
							public 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.结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值