nc65 动态子表开发总结

1.元数据设计

    因为子表根据其他节点设置的影响因素改变而改变,所以子表的元数据设计比较特殊,元数据设计如下:

   

2.单据模板设置

具体实现动态子表的方法是在单据模板里新建几个非元数据的字段,如pk_def1,pk_def2...,在其对应的高级属性中的关键字名一项中填入pk_effect1_value,对应上影响因素1主键,然后改字段就是动态子表显示的字段,而数据库保存数据的是对应的pk_effect1_value,对pk_def1的类型根据配置改变是通过后台代码实现,具体后面介绍。


3.单据模板中新增的pk_defn类型的改变,一级节点中数据通过显示模板展示都是通过后台代码实现的,如下展示关键部分代码

public class RightBillFormDemo extends
		nc.ui.pubapp.uif2app.view.ShowUpableBillForm {
  public void initUI() {
		super.initUI();
		// 根据管理维度设置的影响因素改变表体的名称和参照
		BillModel billmodel = getBillCardPanel().getBillModel();
		try {
			billmodel = BodyItemChangeUtil.processBillModel(IFcConst.PROVISIONRULE,
					billmodel);
		} catch (BusinessException e) {
			ExceptionUtils.wrappException(e);
		}
		getBillCardPanel().setBillModel(billmodel);
	}
}
public class BodyItemChangeUtil {

    public static final String[] item_name = new String[] { "pk_def1", "pk_def2", "pk_def3", "pk_def4", "pk_def5",
            "pk_def6", "pk_def7", "pk_def8", "pk_def9", "pk_def10" };

    public static BillModel processBillModel(String type, BillModel billmodel) throws BusinessException {
        // 根据维度类型查找该类型下的影响因素
        EffeRelaVO[] dimsVO = queryByType(type);
        rebuildBodyTemplet(billmodel, dimsVO, "0", EffeRelaVO.PK_DIMEFFEDEF, IFcConst.ControlAreaCode);
        return billmodel;
    }
  public static void rebuildBodyTemplet(BillModel billmodel, SuperVO[] effevos, String isNull,
            String targetfieldcode, String moduleid) throws BusinessException {

        Map<String, RefInfoVO> map = FcDaoUtil.voQueryDimdef(moduleid);
        RefInfoVO refinfoVO = null;
        // 先隐藏字段
        for (String key : item_name) {
            if (billmodel.getItemByKey(key) != null) {
                billmodel.getItemByKey(key).setShow(false);
                billmodel.getItemByKey(key).setNull(false);
            }
        }

        // 根据查出的对应影响因素设置参照再显示
        if (effevos != null && effevos.length > 0) {
            for (SuperVO dvo : effevos) {
                refinfoVO = map.get(dvo.getAttributeValue(targetfieldcode));
                // 将83、84行的 item_name[i] 改为
                // "pk_def"+dvo.getAttributeValue("order_no").toString()
                if (refinfoVO != null
                        && billmodel.getItemByKey("pk_def" + dvo.getAttributeValue("order_no").toString()) != null) {
                    BillItem bi = billmodel.getItemByKey("pk_def" + dvo.getAttributeValue("order_no").toString());
                    resetBillItem(bi, refinfoVO, null);
                    // 如果是系数录入节点,传入的isNull为为1,说明显示出来的所有影响因素不能为空,
                    // 其他节点的(如产品)显示出来的影响因素可以为空,但不能全部为空,这个校验在各个节点自己添加
                    // if (isNull.equals("0")) {
                    // bi.setNull(false);
                    // } else {
                    // bi.setNull(false);
                    // }
                    bi.setNull(false);
                }
            }
        }
    }
   public static void resetBillItem(BillItem bi, RefInfoVO rivo, String name) {

        AbstractRefModel model = null;
        bi.setMetaDataProperty(null);
        Boolean isref = Boolean.FALSE;
        // 添加基础数据类型 20150520
        // 字符串
        if (rivo.getRefclass().equals("java.lang.String")) {
            bi.setDataType(IBillItem.STRING);
            // 整数
        } else if (rivo.getRefclass().equals("java.lang.Integer")) {
            bi.setDataType(IBillItem.INTEGER);
            // 数量
        } else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDouble")) {
            bi.setDataType(IBillItem.DECIMAL);
            // 逻辑
        } else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFBoolean")) {
            bi.setDataType(IBillItem.BOOLEAN);
            // 日期
        } else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDate")) {
            bi.setDataType(IBillItem.DATE);
            // 时间戳
        } else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDateTime")) {
            bi.setDataType(IBillItem.DATETIME);
            // 日期(无时区)
        } else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFLiteralDate")) {
            bi.setDataType(IBillItem.LITERALDATE);
        } else {
            isref = Boolean.TRUE;
            bi.setDataType(IBillItem.UFREF);
            bi.setRefType("<" + rivo.getRefclass() + ">");
        }

        bi.setShow(true);
        if (name != null) {
            bi.setName(name);
        } else {
            bi.setName(rivo.getName());
        }
        try {
            if (isref) {
                model = (AbstractRefModel) Class.forName(rivo.getRefclass()).newInstance();
            }
        } catch (Exception e) {
            Debug.error("实例化参照类出错" + rivo.getRefclass());
            throw new IllegalArgumentException("实例化参照类出错" + rivo.getRefclass());
        }
        if (rivo.getIsneedpara() != null && rivo.getIsneedpara().booleanValue()) {
            // 处理自定义档案参照 wangyea 2013-06-08
            model.setPara1(rivo.getPara1());
            model.setPara2(rivo.getPara2());
            model.setRefNodeName(rivo.getRefclass());
            model.reset();// 自定义档案初始化
            UIRefPane ref = new UIRefPane();
            ref.setRefModel(model);
            bi.setComponent(ref);
        } else {
            // 非自定义档案参照处理 wangyea 2013-06-08
            IBillItemEditor itemEditor = BillItemEditorFactory.creatBillItemEditor(bi);
            bi.setComponent(itemEditor.getComponent());
        }
        setShowFormular(bi, model, isref);
    }
  /**
     * setShowFormular:设置BillItem显示公式,从方法rebuildBodyTemplet中抽象出来
     * 
     * @param bi
     *            被设置的BillItem
     * @param model
     *            BillItem使用的参照model
     * @author fitvincent
     */
    private static void setShowFormular(BillItem bi, AbstractRefModel model, Boolean isref) {
        // 设置显示公式:pk_def1->getcolvalue( , , , )
        StringBuffer showFormula = new StringBuffer();
        showFormula.append(bi.getKey());
        if (isref) {
            showFormula.append("->getcolvalue(");
            if (model.getBlurQueryTableName() != null) {
                showFormula.append(model.getBlurQueryTableName()).append(",");
            } else {
                if (model.getTableName().indexOf("fc_map_bankacct") != -1) {
                    showFormula.append("fc_map_bankacct").append(",");
                } else {
                    showFormula.append(model.getTableName()).append(",");
                }
            }
//            int dotindex = model.getRefCodeField().indexOf(".");
//            if (dotindex > 0) {
//                showFormula.append(model.getRefCodeField().substring(dotindex + 1)).append(",");
//            } else {
//                showFormula.append(model.getRefCodeField()).append(",");
//            }
            
            int dotindex = model.getRefNameField().indexOf(".");
            if (dotindex > 0) {
                showFormula.append(model.getRefNameField().substring(dotindex + 1)).append(",");
            } else {
                showFormula.append(model.getRefNameField()).append(",");
            }
            dotindex = model.getPkFieldCode().indexOf(".");
            if (dotindex > 0) {
                showFormula.append(model.getPkFieldCode().substring(dotindex + 1)).append(",");
            } else {
                showFormula.append(model.getPkFieldCode()).append(",");
            }
            showFormula.append(bi.getIDColName()).append(")");
        } else {
            showFormula.append("->").append(bi.getIDColName());
            String editFormula = bi.getIDColName() + "->" + bi.getKey();
            bi.setEditFormula(new String[] { editFormula });
        }
        bi.setLoadFormula(new String[] { showFormula.toString() });
    }
}

如下代码所示,把获取到的聚合VO设置到界面上,其中editor.setValue(aggVo)中通过调用execLoadFormula()方法来执行之前设置的显示公式。

public class LeftRightMediator implements IAppModelDataManager,
		AppEventListener {
  /**
	 * 把获取到的聚合VO设置到界面上
	 * setRightData
	 * @param aggVo	void
	 */
	private void setRightData(AggProvisionRuleVO aggVo) {
		editor.setValue(aggVo);
		this.getRightModel().initModel(aggVo);
	}
}






猜你喜欢

转载自blog.csdn.net/u014714841/article/details/80907633