UDN-企业互联网技术人气社区

板块导航

浏览  : 23767
回复  : 82

[UAP RIA] 征集需求场景--》参照多选

  [复制链接]
发表于 2014-11-27 14:25:49 | 显示全部楼层
楼主   这个问题求指导啊  我设置的多个参照最后保存在数据库中的只有一个pk   
使用道具 举报

回复

发表于 2014-11-27 14:36:21 | 显示全部楼层
我的业务需求是   选择多个参照   自动增加表体行数 选择多个参照后 我想通过  getHeadItem 获取 所有的pk  但是只获取到一个。
使用道具 举报

回复

展翔的头像 楼主
发表于 2014-11-27 14:39:01 | 显示全部楼层
Kd_zc 发表于 2014-11-27 14:36
我的业务需求是   选择多个参照   自动增加表体行数 选择多个参照后 我想通过  getHeadItem 获取 所有的pk  ...

是表头选取多个参照数据吗,然后表体添加多行数据吧
使用道具 举报

回复

发表于 2014-11-28 11:29:15 | 显示全部楼层
展翔 发表于 2014-11-27 14:39
是表头选取多个参照数据吗,然后表体添加多行数据吧

后面想想  直接在表体增加多行数据  还是比较不错的选择。。   都放表头 感觉是自己给自己找事儿了。
使用道具 举报

回复

展翔的头像 楼主
发表于 2014-11-28 11:50:52 | 显示全部楼层
Kd_zc 发表于 2014-11-28 11:29
后面想想  直接在表体增加多行数据  还是比较不错的选择。。   都放表头 感觉是自己给自己找事儿了。
...

嗯,一般都是添加在表体多行的
使用道具 举报

回复

发表于 2014-11-28 14:49:51 | 显示全部楼层
我在参照这块 又遇到一个问题。。  我在表头给表体的一个字段赋值 幅值上去的是pk    他不显示名称。显示的是主键,    如果手动选择  就显示的是名称。   自定义的一个参照。
使用道具 举报

回复

发表于 2014-12-1 21:44:52 | 显示全部楼层
我在子表上做参照  多选  之后  每一个都拆成一条子表数据   拆的过程中 我在表体编辑后事件写的。

UIRefPane refPane = (UIRefPane) panel.getBodyItem("pk_batchcode")
                                        .getComponent();
                        String[] pk_csaleorderid_b = refPane.getRefModel().getPkValues();
                        List<String> relist = new ArrayList<String>(
                                        Arrays.asList(pk_csaleorderid_b));// 参照返回的PK数组转换成List

                        for (int j = 0; j < panel.getRowCount(); j++) {// 根据行数取出已经存在的监控事项

                                if (e.getRow() == j) {// 选中行不进行取数

                                        continue;

                                } else {

                                        String serialnum = panel.getBodyValueAt(j, "pk_batchcode")
                                                        .toString();// 取出监控事项

                                        relist.remove(serialnum);// 去掉参照返回的PK中与已存在的监控事项重复的PK

                                }

                        }

                        for (int i = 0; i < relist.size(); i++) {

                                SuperVO sBvo;
                                try {
                                        panel.addLine();
                                        sBvo = HYPubBO_Client.queryByPrimaryKey(SaleorderBVO.class,
                                                        pk_csaleorderid_b[i]);
                                        SuperVO sHvo = HYPubBO_Client.queryByPrimaryKey(
                                                        SaleorderHVO.class,
                                                        (String) sBvo.getAttributeValue("pk_csaleorderid"));
                                        panel.setHeadItem("fpraysource", "0001ZZ10000000006DHD");
                                        panel.setHeadItem("vtrantypecode", "CG01");
                                        // 合同金额
                                        panel.setHeadItem("ntotaltaxmny",
                                                        sHvo.getAttributeValue("def8"));
                                        panel.setHeadItem("fbillstatus", -1);

                                        panel.setBodyValueAt(
                                                        (String) sHvo.getAttributeValue("pk_csaleorderid"),
                                                        i, "csourceid");
                                        panel.setBodyValueAt("0001ZZ10000000005E3I", i,
                                                        "csourcetypecode");
                                        panel.setBodyValueAt(
                                                        sHvo.getAttributeValue("pk_batchcode"), i,
                                                        "pk_batchcode");
                                        panel.setBodyValueAt(
                                                        (String) sHvo.getAttributeValue("vbillcode"), i,
                                                        "vsourcecode");
                                        // 设置标题金额。由销售订单子表成交价格带出。
                                        panel.setBodyValueAt(
                                                        (UFDouble) sBvo.getAttributeValue("norigtaxmny"),
                                                        i, "ntaxmny");
                                        // 车辆
                                        panel.setBodyValueAt(
                                                        (String) sHvo.getAttributeValue("def4"), i,
                                                        "pk_batchcode");
                                        // 物料
                                        panel.setBodyValueAt(
                                                        (String) sHvo.getAttributeValue("def3"), i,
                                                        "pk_material");
                                        // panel.addLine();
                                } catch (UifException e1) {
                                        // TODO 自动生成的 catch 块
                                        e1.printStackTrace();
                                }
                        }
                        panel.getBodyPanel().delLine();// 删除多余空行

                }



这样写 他的表体编辑后事件怎么控制呢  再次点击参照 会依旧触发这个事件。
使用道具 举报

回复

展翔的头像 楼主
发表于 2014-12-2 08:42:38 | 显示全部楼层
Kd_zc 发表于 2014-12-1 21:44
我在子表上做参照  多选  之后  每一个都拆成一条子表数据   拆的过程中 我在表体编辑后事件写的。

UIRefP ...

你可以把这个参照放在表头上呀,利用表头的编辑后事件进行
使用道具 举报

回复

展翔的头像 楼主
发表于 2015-1-20 11:53:24 | 显示全部楼层
本帖最后由 展翔 于 2015-1-21 15:46 编辑


千呼万唤始出来,下面给大家一个参照多选的参考形式
整体思路形式:
1.对于在参照上进行多项的选择的值以pk@pk的形式存储在数据库中
2.解析处理:因为单据面板卡片、列表构造不一样,需要进行卡片、列表分开处理

卡片修改方案如下:
一:修改Object nc.ui.bd.ref.AbstractRefModel.getValue(String field)
public Object getValue(String field) {
  Object[] values = getValues(field);

  Object value = null;
  String strValue = "";
  if (values != null && values.length > 1) {
   for (Object pkobj : values) {
    strValue += pkobj + "@";
   }
   strValue = strValue.substring(0, strValue.lastIndexOf("@"));
   value = strValue;
  } else {
   value = values[0];
  }

  return value;
}

二.去掉长度检查规则
如果是向导生成的业务单据,需要去除参照数据库字段的长度限制,默认是20,同时需要扩充改字段长度

三.卡片显示解析
打开声明 void nc.ui.bd.ref.BatchMatchContext.executeBatch()

   /**
    * 添加参照多选逻辑判断、不改变现有功能
    */

   if (pkValue instanceof String[]) {
    strPKValues = (String[]) pkValue;
   } else if (pkValue.toString().contains("@")) {
    strPKValues = pkValue.toString().split("@");
   } else {
    strPKValues = new String[] { pkValue.toString() };
   }

四:列表显示参照多选
1.BillModel.getRelationItemValues()方法修改
       /**
        * 添加参照多选逻辑、不影响以前功能
        */
       if (pk2RowMap.get(pk) == null && pk!=null) {
        if(pk.contains("@")){
         String[] pks = pk.split("@");
         for(String pkinfo:pks){
          pk2RowMap.put(pk, Integer.valueOf(dataIndex));
          pkList.add(pkinfo);
          dataIndex++;
         }
        }
       }
2.BillModel.setRelationValueToModel()方法修改
//添加参照多选逻辑、不影响以前功能
        String showv = "";
        if(v.length > 1){
         for(Object obj:v){
          showv+=obj+",";
         }
         showv = showv.substring(0, showv.lastIndexOf(","));
         setValueAt(showv, row, o .getName());
        }
五:最终效果展示
列表界面显示:
1.png
卡片界面显示:
2.png



参照多选代码包.rar

120.32 KB, 下载次数: 306

售价: 10 U币  [记录]

参照多选代码

使用道具 举报

回复

发表于 2015-1-20 14:13:48 | 显示全部楼层
还是少弄这些奇葩需求吧,系统实现起来太费劲。
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部