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

xiaoxiao2021-02-28  116

用友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.结果如下:
转载请注明原文地址: https://www.6miu.com/read-59235.html

最新回复(0)