NC65使用UAP客开主子单据以及NC65常见的开发技术(超级详细附带图和源码)

news2024/9/20 16:23:10

NC65使用UAP客开主子单据以及NC65单据相关的开发技术(超级详细附带图和源码)

本篇主要讲述使用UAP开发工具客开主子单据包括:创建项目发布、创建发布元数据、生成主子单据、以及相关报错和打补丁。在单据相关技术主要包括:增加空按钮、增加导入导出按钮、复制单据相关修改、系统数据获取、列表多选、表体行的配置、编辑前后事件、参照弹框相关操作以及在客开的时候遇见的报错和解决方案

特殊说明: 如果是自建模块得话,在开发环境是可以使用的,如果打补丁到home将会出现该产品的用户数已达到产品授权数!的问题

元数据

MDP资源管理器窗口

  • UAP-Studio中,依次点击【窗口】-【显示视图】-【其他】
    在这里插入图片描述

  • 显示视图窗口中,【MDP视图】-【MDP资源管理器】

在这里插入图片描述

创建元数据

  • 在UAP-Studio中,依次点击【文件】-【新建】-【其他】-【UAP业务组件项目】
    在这里插入图片描述

  • 在UAP-Studio中,依次点击【选中项目右键】-【新建】-【其他】-【UAP业务组件】

在这里插入图片描述

  • 项目的目录结构如下
    在这里插入图片描述

  • 在UAP-Studio中打开透视图步骤

在这里插入图片描述

  • 项目目录如下:

在这里插入图片描述

  • 创建实体组件:一种是新建一种是导入已经有的实体组件
    在这里插入图片描述
    在这里插入图片描述
  • 拖拽实体,右键点击实体,选择【导入属性】,在弹出窗口中选择【从pdm(.xml)文件导入】,导入相应的pdm中的单个表

在这里插入图片描述

发布元数据

  1. 发布元数据

    如果是导入的bmf文件,发布元数据前需要检查元素据ID、实体ID、字段ID是否和原来元数据一致,如果一致会报错(该元数据已经发布或者其他的报错信息),报错可以选择继续发布元数据(发布元数据(忽略版本)如果确定各项ID不一致那么可以尝试建议不要)

在这里插入图片描述

  1. 生成VO代码
    在这里插入图片描述

  2. 生成实体对应的数据库表
    选中具体的实体(比如费用主表)-右键-生成建库sql脚本并执行(选中一个他会将主子表都发布)
    在这里插入图片描述

重点说明

以下接口必须实现以及接口路径:

  1. baseapp\METADATA\pf\pfbizitf.bmf
    在这里插入图片描述

  2. uapbs\METADATA\meta\general_interface.bmf
    在这里插入图片描述

  3. baseapp\METADATA\meta\IBillInterface.bmf
    在这里插入图片描述

特殊说明:

  1. 主子单据关联使用组合线,从主表拖拽到子表。关联字段访问策略选择nc.md.model.access.BodyOfAggVOAccessor

    在这里插入图片描述
    在这里插入图片描述

  2. 实体实现接口使用实现线,从实现线从实体拖拽到接口,并且在业务接口属性映射配置接口字段和实体字段的关联

    在这里插入图片描述

前台配置模块

  • 功能注册
    在这里插入图片描述

  • 菜单注册
    在这里插入图片描述

  • 业务模块初始化(如果在已有的模块客开单据则不需要这一步)
    需要在admin账号下进行操作,其他账号找不到该节点,如果该模块下没有功能就算模块初始化了也不会看到对应的模块
    在这里插入图片描述

后台生成代码及脚本

  • 在UAP-Studio中,依次点击【选中项目右键】-【新建】-【其他】-【主子表单据节点】
    在这里插入图片描述

  • 设置功能功能、菜单、单据信息
    在这里插入图片描述

  • 选择客开的单据所需要的动作

    在这里插入图片描述

  • 自定义查询模板和打印模板名称
    在这里插入图片描述

  • 生成的资源以及资源的路径(重要)

后续补充

分配权限及效果展示

分配权限

首先在用户权限分配节点获取对应人员的角色信息,然后在职责-集团给对应角色分配对应节点权限
在这里插入图片描述

效果展示

  1. 节点展示
    在这里插入图片描述

  2. 单据展示
    在这里插入图片描述

出补丁

发布元数据

使用开发工具发布元数据(将bmf文件拷贝到对应目录,未知原因发布不成功)

  1. 配置数据源信息
    在这里插入图片描述

  2. 发布数据源,以及实体对应的数据表

  3. 查看元数据是否发布成功

    能看到模块无法在元数据管理找到对应的元数据(疑问)
    在这里插入图片描述

  4. 查看实体对应的数据库表是否创建成功
    直接对应数据库查询对应表名称

单据所需要的脚本

  1. 脚本位置
    在这里插入图片描述

  2. 执行脚本insert_All.sql

    所有的脚本都在insert_All.sql中,如果需要执行某一个脚本(比如注册功能)可以执行insert_FunctionRegister.sql脚本

如果需要放在已有得菜单下,记得先在菜单和功能里注册

打补丁到home

  • 打补丁moudel
    在这里插入图片描述

  • 打补丁到resources
    在这里插入图片描述

相关报错与问题(重点)

相关报错
  • 元数据实体对应的数据库表没有创建: 参照发布元数据第三步,生成数据库表

  • 元数据名称和字段名称不一致导致报错: 更改为一致,删除原有的数据库表,重新生成数据库表并且重新发布元数据(如果继续报错从发布到生成单据从头走一遍)

  • 复制单据违反唯一约束条件 (NC20240810.PK_CSDJ_TEMPSALEH): 需要增加复制处理器
    在这里插入图片描述

  • 保存成功但是查询不到数据: 检查在增加处理器中是否给单据日期字段赋初始值

    package nc.ui.csdj.dyts.ace.handler;
    
    import nc.ui.pubapp.uif2app.event.IAppEventHandler;
    import nc.ui.pubapp.uif2app.event.billform.AddEvent;
    import nc.vo.pub.pf.BillStatusEnum;
    import nc.vo.pubapp.AppContext;
    import nc.ui.pub.bill.BillCardPanel;
    
    public class AceAddHandler implements IAppEventHandler<AddEvent> {
    
    	@Override
    	public void handleAppEvent(AddEvent e) {
    		String pk_group = e.getContext().getPk_group();
    		String pk_org = e.getContext().getPk_org();
    		BillCardPanel panel = e.getBillForm().getBillCardPanel();
    		// 设置主组织默认值
    		panel.setHeadItem("pk_group", pk_group);
    		panel.setHeadItem("pk_org", pk_org);
    		// 设置单据状态、单据业务日期默认值
    		panel.setHeadItem("vbillstatus", BillStatusEnum.FREE.value());
            //设置单据日期
    		panel.setHeadItem("dbilldate", AppContext.getInstance().getBusiDate());
    	}
    }
    
    

    在这里插入图片描述

  • **删除时或者点击其他按钮报错:**实体[xxx]没有实现制定的业务接口:nc.itf.uap.pf.metadata.IHeadBodyQueryItf或者是 nc.uap.pf.metadata.HeadBodyQueryImpl

    1. 找到对应的bmf文件,主实体实现businInterface接口
      在这里插入图片描述

    2. 没有元数据文件(或者第一种方法不生效),我们可以选择直接执行sql语句
      5205ef20-5eae-4c75-bad8-16639152e622固定值-该值为单据主子VO查询的ID

      insert into md_bizitfmap  (BIZINTERFACEID,   BIZITFIMPCLASSNAME,   CLASSATTRID,   CLASSATTRPATH,   CLASSID,   DR, INDUSTRY, INTATTRID,   TS,   VERSIONTYPE) values
        ('5205ef20-5eae-4c75-bad8-16639152e622',   '',   '',   '',   '主实体ID',   0,   '',   '5205ef20-5eae-4c75-bad8-16639152e622',   to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss'),   null); 
      

      在这里插入图片描述

  • 单据号规则报错:

    在这里插入图片描述

    在这里插入图片描述

    解决方法:

    1、用集团管理员登录是否有该单据的编码规则

    2、向导生成的脚本可能丢失,手动执行一下
    在这里插入图片描述

  • Error to init aggVOStyle

在这里插入图片描述

解决方法:

元数据的访问策略有问题

在这里插入图片描述

  • 流程平台缓存中不存在该单据或交易类型
    在这里插入图片描述

    解决方法:
    1、执行一下动作脚本在这里插入图片描述

    2、查下数据库是否有值
    select * from bd_billtype where pk_billtypecode =‘H2H1’

  • 保存单据信息报错
    保存单据信息时报is not found in jndi

    解决方法:

    1、 清除缓存、重启客户端

    2、 缺少module.xml,对应项目META-INF下有个module.xml文件,复制到nchome重启客户端

  • 单据已删除请刷新页面
    用元数据生成的档案能新增保存,但是修改、提交等按钮报以上错误

    原因:

    1、 元数据的业务接口映射有问题,没有锁主键而是锁了别的字段

    2、 修改了元数据的主键名称

    3、 与ts时间戳有关系

  • 没有找到设置得单据模板信息
    在这里插入图片描述

    解决方法
    1、 功能节点默认模板配置单据模板bt,查询模板qt

    2、 配置功能节点发现还是报错,说明数据库有冗余数据

    select * from pub_systemplate where funnode like ‘%功能节点编号%’

    删除查询出来的数据

  • 点击查询得时候报位置错误
    解决方法
    单据查询模板有问题,可能某个字段做了修改或者丢失

  • This Attribute is not in the Ref
    在这里插入图片描述

    解决方法

    在这里插入图片描述

    字段前不能加别名

客开问题
  1. 发布元数据所在表
    md_component,md_class,md_property,md_table,md_column

  2. 功能注册和菜单注册所在表
    dap_dapsystem sm_funcregister

  3. 自定参照得bmf所在路径
    modules\uapbd\METADATA\metadata\udi

NC65单据相关技术点

增加一个空按钮

引用<ref bean="separatorAction" />

在这里插入图片描述

增加导入导出

配置按钮XML

以下为客开单据增加导入导出按钮

  • 导入导出按钮xml

    <?xml version="1.0" encoding="gbk"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<!-- 导入导出按钮 -->
    	<!-- 导入导出 -->
    	<bean id="importExportMenu" class="nc.funcnode.ui.action.MenuAction">
    		<property name="code">
    			<value>importExport</value>
    		</property>
    		<property name="name" value="导入导出" />
    		<property name="actions">
    			<list>
    				
                       <ref bean="ImportData" />        <!-- 导入Excel -->
                       <ref bean="ExportData" />        <!-- 导出Excel -->
                       <ref bean="ExportTemplate" /> 	 <!-- 导出模板 -->
    			</list>
    		</property>
    	</bean>
    
    	<!-- 导入Excel -->
    	<!-- 具体的导出规则下面做出解释 -->
          <bean id="ImportData" class="nc.ui.uif2.excelimport.ImportAction">
          <property name="model" ref="bmModel" />
          <property name="importableEditor" ref="ImportExportEditor" />
          <property name="btnName" value="导入临时单Excel" />
          </bean>
          
          <!-- 导出模板到Excel -->
          <bean id="ExportTemplate" class="nc.ui.uif2.excelimport.ExportExcelTemplateAction">
          <property name="model" ref="bmModel" />
          <property name="importableEditor" ref="ImportExportEditor" />
          <property name="btnName" value="导出模板" />
          </bean>
          
          <!-- 导入编辑器主要用于导入的时候-执行新增-保存-取消 -->
          <bean id="ImportExportEditor" class="nc.ui.uif2.excelimport.DefaultUIF2ImportableEditor">
          <property name="billcardPanelEditor" ref="billForm" />
          <!-- ref中的值为新增动作id -->
          <property name="addAction" ref="addAction" />
          <!-- ref中的值为取消动作id -->
          <property name="cancelAction" ref="cancelAction" />
    	  <!-- ref中的值为保存动作id -->
          <property name="saveAction" ref="saveScriptAction" /> 
          <property name="appModel" ref="bmModel" />
          </bean>
          
          <!-- 导出数据到Excel -->
          <bean id="ExportData" class="nc.ui.uif2.excelimport.ExportAction">
          <property name="model" ref="bmModel" />
          <property name="importableEditor" ref="ImportExportEditor" />
          <property name="btnName" value="导出临时单到Excle" />
         </bean>
    </beans>
    
  • 引入导出导出xml到主xml,并且将导出导出按钮加入列表

    <import resource="classpath:/nc/ui/csdj/dyts/ace/view/dyts_excelImport.xml" />
    

    引入位置
    在这里插入图片描述

    加入列表
    在这里插入图片描述

  • 设置列表视图可以对选(实现多行导出Excel)

    <property name="multiSelectionEnable" value="true" />
    

    在这里插入图片描述

Excel导入规则

当以列中的数字设置主子关系,当数字相同时,他为一张单据如图:

在这里插入图片描述

如果想要同时导入多张单据,那么像上图,只要保证主子单据中的数字一致就欧克了

效果图

在这里插入图片描述

设置导出的时候需要导出什么字段

在这里插入图片描述

复制单据

增加复制处理器

package nc.ui.csdj.dyts.action;

import nc.ui.pubapp.uif2app.actions.intf.ICopyActionProcessor;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.csdj.dyts.AggTempsaleh;
import nc.vo.uif2.LoginContext;

public class CopyActionProcessor implements
		ICopyActionProcessor<AggTempsaleh> {

	@Override
	public void processVOAfterCopy(AggTempsaleh paramT,
			LoginContext paramLoginContext) {
		paramT.getParentVO().setPrimaryKey(null);
		paramT.getParentVO().setVbillcode(null);
		paramT.getParentVO().setTs(null);
		String[] codes =paramT.getTableCodes();
		if (codes != null && codes.length>0) {
			for (int i = 0; i < codes.length; i++) {
				String tableCode = codes[i];
				 CircularlyAccessibleValueObject[] childVOs = 	paramT.getTableVO(tableCode);
				 for (CircularlyAccessibleValueObject childVO : childVOs) {
					 try {
						childVO.setPrimaryKey(null);
						childVO.setAttributeValue("ts",null);
					} catch (BusinessException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

	
}

修改单据配置文件

<property name="copyActionProcessor"><bean class="nc.ui.csdj.dyts.action.CopyActionProcessor" /></property>

在这里插入图片描述

表体行配置

主要配置表体得增行、删行、复制行、粘贴行等

<bean class="nc.ui.pubapp.uif2app.actions.BodyAddLineAction" />
<bean class="nc.ui.pubapp.uif2app.actions.BodyInsertLineAction" />
<bean class="nc.ui.pubapp.uif2app.actions.BodyDelLineAction" />
<bean class="nc.ui.pubapp.uif2app.actions.BodyCopyLineAction" />
<bean class="nc.ui.pubapp.uif2app.actions.BodyPasteLineAction" />

修改配置文件
在这里插入图片描述

系统数据获取

生成单据号

前置任务:配置单据号规则

//两种都可以

new HYPubBO().getBillNo(单据类型, 组织, null, null);

new BillcodeGenerater ().getBillCode (单据类型, 组织,null,null);

生成主键

KeyGenerator.getInstance().getKey(20);
new SequenceGenerator().generate(pk_corp,num);

系统变量

InvocationInfoProxy
WorkbenchEnvironment
ClientEnvironment

设置列表多选

无多选框

<property name="multiSelectionEnable" value="true" />

位置:

在这里插入图片描述

有多选框

<property name="multiSelectionMode" value="1" />
<property name="multiSelectionEnable" value="true" />

位置:

在这里插入图片描述

特殊情况(非客开单据)

getBillListPanel().setMultiSelect(true);

在这里插入图片描述

获取多选数据

其中m_billVo,、m_billHeadVo、m_billBodyVo为聚合、主、子VO的全路径名

AggregatedValueObject selectedBillVOs[] = getbillListPanel()
						.getMultiSelectedVOs(m_billVo, m_billHeadVo,
								m_billBodyVo);

其中BillManageModel为当前单据的Model

Object[] obj = (Object[]) ((BillManageModel) getModel()).getSelectedOperaDatas();

设置表头表体编辑前后事件

表头编辑前后事件

  1. 表头表尾编辑前事件
    配置文件

    <!-- 表头表尾字段编辑前事件 -->
    				<bean class="nc.ui.pubapp.uif2app.event.EventHandlerGroup">
    					<property name="event" value="nc.ui.pubapp.uif2app.event.card.CardHeadTailBeforeEditEvent" />
    					<property name="handler">
    						<bean class="nc.ui.csdj.dyts.ace.handler.AceHeadTailBeforeEditHandler" />
    					</property>
    				</bean>
    

    代码

    package nc.ui.csdj.dyts.ace.handler;
    
    import nc.ui.bd.ref.AbstractRefGridTreeModel;
    import nc.ui.pub.beans.UIRefPane;
    import nc.ui.pub.bill.BillCardPanel;
    import nc.ui.pubapp.uif2app.event.IAppEventHandler;
    import nc.ui.pubapp.uif2app.event.card.CardHeadTailBeforeEditEvent;
    
    /**
     * 单据表头表尾字段编辑前事件
     * @author Administrator
     *
     */
    public class AceHeadTailBeforeEditHandler implements IAppEventHandler<CardHeadTailBeforeEditEvent> {
    
    	@Override
    	public void handleAppEvent(CardHeadTailBeforeEditEvent e) {
    		// TODO 自动生成的方法存根
    		e.setReturnValue(true);
    		BillCardPanel cpanel = e.getBillCardPanel();
        	String key = e.getKey();
        	if("pk_cust".equals(key)){//根据客户分类过滤客户
        		String pk_custclass = (String)cpanel.getHeadItem("pk_custclass").getValueObject();
        		//获取参照Model
        		AbstractRefGridTreeModel refModel = (AbstractRefGridTreeModel)((UIRefPane)cpanel.getHeadItem(key).getComponent()).getRefModel();
        		//若客户分类不为空,过滤
        		if(null != pk_custclass && !"".equals(pk_custclass.trim())){
        			refModel.addWherePart(" and pk_supclass = '"+pk_custclass+"' ");
        			refModel.setClassWherePart(" pk_custclass = '"+pk_custclass+"' ");
        		}else{
        			refModel.addWherePart(" and 1 = 1 ");//重设参照过滤条件
        			refModel.setClassWherePart(" 1 = 1 ");
        		}
        	}
    	}
    }
    
  2. 表头表尾编辑后事件
    配置文件

    <!-- 表头表尾字段编辑后事件 -->
    				<bean class="nc.ui.pubapp.uif2app.event.EventHandlerGroup">
    					<property name="event" value="nc.ui.pubapp.uif2app.event.card.CardHeadTailAfterEditEvent" />
    					<property name="handler">
    						<bean class="nc.ui.csdj.dyts.ace.handler.AceHeadTailAfterEditHandler" />
    					</property>
    				</bean>
    

    代码

    package nc.ui.csdj.dyts.ace.handler;
    
    import nc.ui.pub.beans.UIRefPane;
    import nc.ui.pub.bill.BillCardPanel;
    import nc.ui.pubapp.uif2app.event.IAppEventHandler;
    import nc.ui.pubapp.uif2app.event.card.CardHeadTailAfterEditEvent;
    
    /**
     * 单据表头表尾字段编辑后事件
     * @author Administrator
     *
     */
    public class AceHeadTailAfterEditHandler implements IAppEventHandler<CardHeadTailAfterEditEvent> {
    
    	@Override
    	public void handleAppEvent(CardHeadTailAfterEditEvent e) {
    		// TODO 自动生成的方法存根
    		BillCardPanel cpanel = e.getBillCardPanel();
        	String key = e.getKey();
        	if("pk_custclass".equals(key)){//客户分类变更时清空客户
        		cpanel.setHeadItem("pk_cust", null);
        	}else if("pk_cust".equals(key)){
        		String pk_custclass = (String)cpanel.getHeadItem("pk_custclass").getValueObject();
        		if(null == pk_custclass || "".equals(pk_custclass)){
        			//获得关联的客户分类主键
        			pk_custclass = (String)((UIRefPane)cpanel.getHeadItem(key).getComponent()).getRefValue("pk_supclass");
        			cpanel.setHeadItem("pk_custclass", pk_custclass);
        			//停止编辑,使得焦点依旧在客户字段时再点击参照按钮时依然能够触发beforeEdit事件
        			cpanel.stopEditing();
        		}
        	}
    	}
    }
    

表体编辑前后事件

  1. 表体编辑前事件
    配置文件

    <!-- 表体字段编辑前事件 -->
    				<bean class="nc.ui.pubapp.uif2app.event.EventHandlerGroup">
    					<property name="event" value="nc.ui.pubapp.uif2app.event.card.CardBodyBeforeEditEvent" />
    					<property name="handler">
    						<bean class="nc.ui.csdj.dyts.ace.handler.AceBodyBeforeEditHandler" />
    					</property>
    				</bean>
    

    代码

    package nc.ui.csdj.dyts.ace.handler;
    
    import nc.ui.bd.ref.AbstractRefGridTreeModel;
    import nc.ui.pub.beans.UIRefPane;
    import nc.ui.pub.bill.BillCardPanel;
    import nc.ui.pubapp.uif2app.event.IAppEventHandler;
    import nc.ui.pubapp.uif2app.event.card.CardHeadTailBeforeEditEvent;
    
    /**
     * 单据表体字段编辑前事件
     * @author Administrator
     *
     */
    public class AceHeadTailBeforeEditHandler implements IAppEventHandler<CardHeadTailBeforeEditEvent> {
    
    	@Override
    	public void handleAppEvent(CardHeadTailBeforeEditEvent e) {
    		// TODO 自动生成的方法存根
    		e.setReturnValue(true);
    		BillCardPanel cpanel = e.getBillCardPanel();
        	String key = e.getKey();
        	if("pk_cust".equals(key)){//根据客户分类过滤客户
        		String pk_custclass = (String)cpanel.getHeadItem("pk_custclass").getValueObject();
        		//获取参照Model
        		AbstractRefGridTreeModel refModel = (AbstractRefGridTreeModel)((UIRefPane)cpanel.getHeadItem(key).getComponent()).getRefModel();
        		//若客户分类不为空,过滤
        		if(null != pk_custclass && !"".equals(pk_custclass.trim())){
        			refModel.addWherePart(" and pk_supclass = '"+pk_custclass+"' ");
        			refModel.setClassWherePart(" pk_custclass = '"+pk_custclass+"' ");
        		}else{
        			refModel.addWherePart(" and 1 = 1 ");//重设参照过滤条件
        			refModel.setClassWherePart(" 1 = 1 ");
        		}
        	}
    	}
    }
    
  2. 表体编辑后事件
    配置文件

    <!-- 表体字段编辑后事件 -->
    				<bean class="nc.ui.pubapp.uif2app.event.EventHandlerGroup">
    					<property name="event" value="nc.ui.pubapp.uif2app.event.card.CardBodyAfterEditEvent" />
    					<property name="handler">
    						<bean class="nc.ui.csdj.dyts.ace.handler.AceBodyAfterEditHandler" />
    					</property>
    				</bean>
    

    代码

    package nc.ui.csdj.dyts.ace.handler;
    
    import nc.ui.pubapp.uif2app.event.IAppEventHandler;
    import nc.ui.pubapp.uif2app.event.card.CardBodyAfterEditEvent;
    
    /**
     * 单据表体字段编辑后事件
     * @author Administrator
     *
     */
    public class AceBodyAfterEditHandler implements IAppEventHandler<CardBodyAfterEditEvent>{
    
    	@Override
    	public void handleAppEvent(CardBodyAfterEditEvent e) {
    		
    	}
    }
    

注意事项

  1. e.setReturnValue(true)该行代码为必须代码,如果返回false将不能编辑,该代码主要用于编辑前事件
  2. 放置位置
    在这里插入图片描述

参照框设置多选和筛选条件

弹窗增加参照框

select * from bd_refinfo,参照信息表bd_refinfo中name为参照名称同时也是下列中日历的取值

UIRefPane refDate = new UIRefPane();		
refDate.setRefNodeName("日历");

获取单据参照框

  1. 获取表头参照框

    //参照面板
    UIRefPane headRefPane =(UIRefPane)billCardPanel.getHeadItem("key").getComponent();
    //参照模型
    AbstractRefModel refHeadModel = headRefPane.getRefModel();	
    
  2. 获取表体参照框

    UIRefPane bodyRefPane =(UIRefPane)billCardPanel.getBodyItem("vbillno").getComponent();
    AbstractRefModel refBodyModel = bodyRefPane.getRefModel();
    

设置多选和过滤条件

设置多选保存的时候还是保存第一个主键,而且显示的时候还是显示一个(未解决)

  • 列表参照
    在这里插入图片描述

  • 树型参照
    在这里插入图片描述

  • 树表型参照
    在这里插入图片描述

参照基类:

三种常用类型的参照,Model提供了三个抽象类:

  1. 列表参照: AbstractRefModel
  2. 树型参照: AbstractRefTreeModel
  3. 树表型参照: AbstractRefGridTreeModel

参照类代码示例:

不同类型的参照对应的参照类须继承上述的相应基类

  1. 树形参照:参考nc.ui.train.pub.ref.CustClassRefModel
  2. 树表型参照:参考nc.ui.train.pub.ref.CustRefModel
BillItem headItem = billCardPanel.getHeadItem("selfee");
UIRefPane ref = (UIRefPane) headItem.getComponent();
ref.setMultiSelectedEnabled(true);//设置可以多选
ref.setNotLeafSelectedEnabled(false);//不允许选择非末级
//设置动态参照类
ref.setRefModel(参照类.class);
//设置既可以输入值又可以参照得值
ref.setAutoCheck(false);

String value ="11000A2342,11000B2345";
//设置多选值
ref.setPKs(value.split(","));
//以下为设置过滤条件的配置
AbstractRefModel refModel = (AbstractRefModel)ref.getRefModel();

//设置国家
ref.setPk_country("0001Z010000000079UJJ");
//设置集团
ref.setPk_group(AppContext.getInstance().getPkGroup());
//设置用户
ref.setPk_user(AppContext.getInstance().getPkUser());
//设置过滤条件
refModel.addWherePart(" and pk_supclass = '"+pk_custclass+"' ");
//设置只显示一级
//refModel.addWherePart(" and length(pid)-1");
//有可能是关联相关的设置例如:选择县参照,该值为省的pk(未验证)
refModel.setClassWherePart(" pk_custclass = '"+pk_custclass+"' ");

ustRefModel

BillItem headItem = billCardPanel.getHeadItem("selfee");
UIRefPane ref = (UIRefPane) headItem.getComponent();
ref.setMultiSelectedEnabled(true);//设置可以多选
ref.setNotLeafSelectedEnabled(false);//不允许选择非末级
//设置动态参照类
ref.setRefModel(参照类.class);
//设置既可以输入值又可以参照得值
ref.setAutoCheck(false);

String value ="11000A2342,11000B2345";
//设置多选值
ref.setPKs(value.split(","));
//以下为设置过滤条件的配置
AbstractRefModel refModel = (AbstractRefModel)ref.getRefModel();

//设置国家
ref.setPk_country("0001Z010000000079UJJ");
//设置集团
ref.setPk_group(AppContext.getInstance().getPkGroup());
//设置用户
ref.setPk_user(AppContext.getInstance().getPkUser());
//设置过滤条件
refModel.addWherePart(" and pk_supclass = '"+pk_custclass+"' ");
//设置只显示一级
//refModel.addWherePart(" and length(pid)-1");
//有可能是关联相关的设置例如:选择县参照,该值为省的pk(未验证)
refModel.setClassWherePart(" pk_custclass = '"+pk_custclass+"' ");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物流管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;物品分类管理&#xff0c;物流公司管理&#xff0c;物流信息管理&#xff0c;配送信息管理 微信端账号功能包括&#xff1a;系统首页&a…

半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型

半导体器件制造行业作为高科技领域的核心驱动力&#xff0c;正积极探索和实践以5G智能工厂数字孪生平台为核心的新型制造模式。这一创新不仅极大地提升了生产效率与质量&#xff0c;更为制造业的未来发展绘制了一幅智能化、网络化的宏伟蓝图。 在半导体器件制造5G智能工厂中&a…

python 山峦图

效果&#xff1a; 代码&#xff1a; import matplotlib.pyplot as plt import numpy as npdef mountain_plot(data_dict, colorsNone):if colors is None:colors get_colors_from_map(len(data_dict), "Spectral")x list(data_dict.keys())# Y轴位置y_positions …

某锂电厂房项目密集母线槽上红外测温的案例分享

1 行业背景 在政策和技术推动下&#xff0c;锂电产业迅速发展&#xff0c;产业规模持续扩大&#xff0c;同时对供电设备的可靠性要求提高。密集型母线槽作为厂房重要电力传输设备若出现触头温升过高&#xff0c;可能导致停电甚至烧毁等故障&#xff0c;会对生产线安全和企业效…

Java反序列化漏洞分析

相关学习资料# http://www.freebuf.com/vuls/90840.htmlhttps://security.tencent.com/index.php/blog/msg/97http://www.tuicool.com/articles/ZvMbInehttp://www.freebuf.com/vuls/86566.htmlhttp://sec.chinabyte.com/435/13618435.shtmlhttp://www.myhack58.com/Article/ht…

【Qt笔记】QTabWidget控件详解

目录 引言 一、基本功能 二、核心属性 2.1 标签页管理 2.2 标签位置 2.3 标签形状 2.4 标签可关闭性 2.5 标签可移动性 三、信号与槽 四、高级功能 4.1 动态添加和删除标签页 4.2 自定义标签页的关闭按钮行为 4.3 标签页的上下文菜单 五、样式设置 六、应用示例…

git使用“保姆级”教程1——简介及配置项设置

一、git介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于&#xff1a;敏捷高效地处理任何或小或大的项目。Git 是Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。版本控制&#xff1a; 版本控制&#xff08;Revision control&#xff…

鸿蒙环境服务端签名直传文件到OSS

本文介绍如何在鸿蒙环境下将文件上传到OSS。 背景信息 鸿蒙环境是当下比较流行的操作环境&#xff0c;与服务端签名直传的原理类似&#xff0c;鸿蒙环境上传文件到OSS是利用OSS提供的PutObject接口来实现文件上传到OSS。关于PutObject的详细介绍&#xff0c;请参见PutObject。…

大厂常问的MySQL事务隔离到底怎么回答

什么是事务 事务就是一组原子性的SQL查询&#xff0c;或者说一个独立的工作单元。事务内的语句&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败。 关于事务银行系统的应用是解释事务必要性的一个经典例子。 假设一个银行的数据库有两张表&#xff1a;支票表&#x…

OpenAI o1大模型:提示词工程已死

OpenAI 最近发布了最新大模型 o1&#xff0c;通过强化学习训练来执行复杂的推理任务&#xff0c;o1 在多项基准测试中展现了博士级别的推理能力&#xff0c;甚至在某些情况下可以与人类专家相媲美。 当你使用 o1 的时候&#xff0c;会发现文档中多了一项提示词建议。 翻译一下&…

OBB-最小外接矩形包围框-原理-代码实现

前言 定义&#xff1a;OBB是相对于物体方向对齐的包围盒&#xff0c;不再局限于坐标轴对齐&#xff0c;因此包围点云时更加紧密。优点&#xff1a;能够更好地贴合物体形状&#xff0c;减少空白区域。缺点&#xff1a;计算较为复杂&#xff0c;需要计算物体的主方向&#xff0c…

二叉树的遍历【C++】

对于二叉树系列的题&#xff0c;必须要会遍历二叉树。 遍历的有&#xff1a;深度优先&#xff1a;前序、中序、后序&#xff0c;广度优先&#xff1a;层序遍历 什么序是指处理根节点在哪个位置&#xff0c;比如前序是指处理节点顺序&#xff1a;根左右。 接下来要说明的是&…

深入浅出Docker

1. Docker引擎 Docker引擎是用来运行和管理容器的核心软件。通常人们会简单的将其指代为Docker或Docker平台。 基于开放容器计划&#xff08;OCI&#xff09;相关的标准要求&#xff0c;Docker引擎采用了模块化的设计原则&#xff0c;其组件是可替换的。 Docker引擎由如下主…

从理论到实践:全面指导企业实现数字化转型的战略路径

全球企业数字化转型的必然性 在全球范围内&#xff0c;数字化转型成为了企业战略中的核心命题。随着云计算、大数据、人工智能等新兴技术的快速发展&#xff0c;企业的运营模式、管理体系及客户体验正在发生深刻的变革。数字技术不仅为企业带来了新的商业机会&#xff0c;还使…

【Elasticsearch】-图片向量化存储

需要结合深度学习模型 1、pom依赖 注意结尾的webp-imageio 包&#xff0c;用于解决ImageIO.read读取部分图片返回为null的问题 <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</versio…

【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

海报制作哪个软件好?这些在线工具不容错过

国庆节的脚步越来越近&#xff0c;不少公司正计划利用这个时机开展一些特别的庆典活动。 在这些活动中&#xff0c;海报作为一种传统的宣传方式&#xff0c;仍然是不可或缺的。但在制作海报时&#xff0c;我们可能会遇到创意瓶颈、时间限制或者预算约束等问题。 幸运的是&…

高棉语翻译神器上线!中柬互译,OCR识别,语音翻译一应俱全,《柬埔寨语翻译通》App

全新的高棉语翻译神器已经正式上架&#xff01; 无论你是安卓还是iOS用户&#xff0c;现在都可以轻松开始使用&#xff0c;开启你的翻译之旅&#xff01; 这款应用不仅仅是一个简单的翻译工具&#xff0c;它还支持中文与高棉语的双向翻译。翻译结果可以语音播放&#xff0c;翻…

AI服务器是什么?为什么要用AI服务器?

AI服务器的定义 AI服务器是一种专门为人工智能应用设计的服务器&#xff0c;它采用异构形式的硬件架构&#xff0c;通常搭载GPU、FPGA、ASIC等加速芯片&#xff0c;利用CPU与加速芯片的组合来满足高吞吐量互联的需求&#xff0c;为自然语言处理、计算机视觉、机器学习等人工智…

企业微信-前往服务商后台页面对接解决方案

序 我会告诉你在哪里点我会告诉你在哪里配置点下去他只返回auth_code的&#xff0c;我怎么登录 正文 他是在这个位置 是这样&#xff0c;应用授权安装第三方应用后&#xff0c;企业微信&#xff08;管理员角色&#xff09;是可以从pc端企业后台点第三方应用的。 如果我没记…