Windchill 开发 根据实例对象查询关联的ECN

开发环境:windchill 11.0 M030
在Windchill二次开发时,通过ptc官方提供的api,我们可以很容易的获取ECN对象的 受影响对象和产生对象。例如:

// 获取变更后的对象
QueryResult qr = ChangeHelper2.service.getChangeablesAfter((WTChangeOrder2) obj)

现在有如下开发场景,需要在新的ECN创建时,校验受影响对象是否有其他未关闭的ECN。
这时候,我考虑从数据库查询,ECN的结构稍微复杂点,ECN与变更任务关联,变更任务再与产生对象关联。
根据部件编号查询所有有关联的ECN对象,数据库查询如下:

-- 根据部件编号,查询产生对象中包含该部件任意版本的ECN
select a1.IDA2A2,a1.name,a1.wtChgOrderNumber,a2.IDA2A2,a2.description,a2.statestate
from WTChangeOrder2Master a1 join WTChangeOrder2 a2 on a1.ida2a2=a2.ida3masterreference
where a2.branchidIterationInfo in
(select branchida3a5 from IncludedIn2 where branchida3b5 in(select branchida3a5 from ChangeRecord2 where ida3b5 in(select IDA2A2 from wtpart where wtpart.ida3masterreference in(select IDA2A2 from wtpartmaster where wtpartnumber='部件编号')))
)

在实际开发中,一般并不需要用高级查询完整执行上面的sql。例如校验,只需要查出 WTChangeOrder2 表中的生命周期状态就可以了;然后将上面sql中最内层和次内层子查询,替换成文档或EPM对象,就可以查询他们相关的ECN了。
使用高级查询,代码实现如下:

import org.apache.log4j.Logger;
import wt.change2.ChangeRecord2;
import wt.change2.IncludedIn2;
import wt.change2.WTChangeOrder2;
import wt.doc.WTDocument;
import wt.epm.EPMDocument;
import wt.fc.Persistable;
import wt.fc.PersistenceServerHelper;
import wt.fc.QueryResult;
import wt.fc.ReferenceFactory;
import wt.fc.WTObject;
import wt.part.WTPart;
import wt.query.ClassAttribute;
import wt.query.QueryException;
import wt.query.QuerySpec;
import wt.query.SearchCondition;
import wt.query.SubSelectExpression;
import wt.util.WTException;
/*** @author 彭秉浪 PengBingLang@dingtalk.com*/
public class TestUtil {private static final Logger logger = Logger.getLogger(TestUtil.class.getName());/*** 在创建ECN后调用,校验受影响对象是否有其他未关闭的ECN*/public static void checkOldECN(WTObject newECN, WTObject obj, StringBuffer errorMsg) {try {QuerySpec qs1 = new QuerySpec();qs1.setAdvancedQueryEnabled(true);int a1 = 0;SearchCondition sc1 = null;if (obj instanceof WTPart) {a1 = qs1.addClassList(WTPart.class, false);qs1.appendSelectAttribute("thePersistInfo.theObjectIdentifier.id", a1, false);sc1 = new SearchCondition(WTPart.class, WTPart.NUMBER, SearchCondition.EQUAL, ((WTPart) obj).getNumber());} else if (obj instanceof WTDocument) {a1 = qs1.addClassList(WTDocument.class, false);qs1.appendSelectAttribute("thePersistInfo.theObjectIdentifier.id", a1, false);sc1 = new SearchCondition(WTDocument.class, WTDocument.NUMBER, SearchCondition.EQUAL, ((WTDocument) obj).getNumber());} else if (obj instanceof EPMDocument) {a1 = qs1.addClassList(EPMDocument.class, false);qs1.appendSelectAttribute("thePersistInfo.theObjectIdentifier.id", a1, false);sc1 = new SearchCondition(EPMDocument.class, EPMDocument.NUMBER, SearchCondition.EQUAL, ((EPMDocument) obj).getNumber());}qs1.appendWhere(sc1, new int[] { a1 });SubSelectExpression sse1 = new SubSelectExpression(qs1);QuerySpec qs2 = new QuerySpec();qs2.setAdvancedQueryEnabled(true);int a2 = qs2.addClassList(ChangeRecord2.class, false);qs2.appendSelectAttribute("roleAObjectRef.key.branchId", a2, false);ClassAttribute ca2 = new ClassAttribute(ChangeRecord2.class, "roleBObjectRef.key.id");SearchCondition sc2 = new SearchCondition(ca2, SearchCondition.IN, sse1);qs2.appendWhere(sc2, new int[] { a2 });SubSelectExpression sse2 = new SubSelectExpression(qs2);QuerySpec qs3 = new QuerySpec();qs3.setAdvancedQueryEnabled(true);int a3 = qs3.addClassList(IncludedIn2.class, false);qs3.appendSelectAttribute("roleAObjectRef.key.branchId", a3, false);ClassAttribute ca3 = new ClassAttribute(IncludedIn2.class, "roleBObjectRef.key.branchId");SearchCondition sc3 = new SearchCondition(ca3, SearchCondition.IN, sse2);qs3.appendWhere(sc3, new int[] { a3 });SubSelectExpression ssc3 = new SubSelectExpression(qs3);QuerySpec qs4 = new QuerySpec();qs4.setAdvancedQueryEnabled(true);int a4 = qs4.addClassList(WTChangeOrder2.class, true);qs4.appendSelectAttribute(WTChangeOrder2.BRANCH_IDENTIFIER, a4, true);qs4.appendSelectAttribute(WTChangeOrder2.LIFE_CYCLE_STATE, a4, true);ClassAttribute ca4 = new ClassAttribute(WTChangeOrder2.class, "iterationInfo.branchId");SearchCondition sc4 = new SearchCondition(ca4, SearchCondition.IN, ssc3);qs4.appendWhere(sc4, new int[] { a4 });QueryResult qr = PersistenceServerHelper.manager.query(qs4);// 查询oidReferenceFactory refefence = new ReferenceFactory();String oid = refefence.getReferenceString((Persistable) newECN);logger.debug("----------------------->WTObject newECN oid " + oid);while (qr.hasMoreElements()) {Object[] objectArr = (Object[]) qr.nextElement();if (objectArr[0] instanceof WTChangeOrder2) {WTChangeOrder2 ecn = (WTChangeOrder2) objectArr[0];String lifeCycleState = ecn.getLifeCycleState().toString();String branchId = String.valueOf(ecn.getBranchIdentifier());logger.debug("----------------------->ECN State " + lifeCycleState + " " + branchId);// 已解决 已取消if ("RESOLVED".equals(lifeCycleState) || "CANCELLED".equals(lifeCycleState)) {continue;}if (oid.indexOf(branchId) < 0) {errorMsg.append(obj.getDisplayIdentity() + "对象被其他ECN占用:" + ecn.getDisplayIdentity() + "\n");}}}} catch (QueryException e) {e.printStackTrace();} catch (WTException e) {e.printStackTrace();}}
}

Windchill 开发 根据实例对象查询关联的ECN相关推荐

  1. SpringDataJpa系列三之QBE(按照实例对象查询)

    本文章参考文档为<SpringDataJpa从入门到精通> 我们看一下JpaRepository的UML类图 我们可以看到, 自JpaRepository开始, 就实现了一个名叫Query ...

  2. 前端与移动开发----JS高级----面向对象编程,类与实例对象,继承,严格模式,模板字符串,class封装tab栏

    JS高级01 回顾上阶段 Javascript组成 ECMAScript: 基础语法 (变量, 表达式, 循环, 判断, 函数, 对象等) DOM: document 操作标签(获取, 增加, 插入, ...

  3. Windchill 开发 判断图纸关联类型

    Windchill 开发 判断图纸关联类型 本文使用 windchill 11.0 M030 开发环境. 在Windchill系统中,图纸和部件的关联类型,最常见的有 所有者.图像 等,例如: 每种关 ...

  4. MyBatis关联对象查询

    一.mapper接口的传参 Mapper文件中不能存在id重复的sql语句,所以,mapper接口中方法重载是没有意义的. Mapper接口传参的几种形式 1.1接口方法传一个基本类型的参数 接口方法 ...

  5. [iOS开发]Category、Extension和关联对象

    文章目录 什么是Category? 分类和扩展 Category的实质 Category结构体 从C++开始看起 对象方法列表结构体 类方法列表结构体 协议列表结构体 属性列表结构体 category ...

  6. AutoCAD的COM开发时无法获取AtuoCAD实例对象解决方案

    问题 当在使用com接口做AutoCAD二次开发的时候,在有的电脑上会遇到无法获取AutoCAD实例对象的问题. 解决方案 需要在注册表中关闭UAC 1.打开运行输入RegEdit 2.在注册表中找到 ...

  7. windchill开发笔记

    windchill开发中用到的各种API及知识点 1.关于树结构的节点展示问题: 在xml树结构的构建中,通常使用如下代码来进行树节点的展示 //节点展示级别(full,one,none),可以写St ...

  8. myeclipse java可视化_使用MyEclipse可视化开发Hibernate实例

    使用MyEclipse可视化开发Hibernate实例 2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中. 这个实例主要演示如何使用My ...

  9. SNF快速开发平台MVC-高级查询组件

    1.   高级查询 在我们做项目的时候经常想要按名称.编号进行查询数据,可在开发时会把最常用的查询条件写上,不常用的就不写了,也是因为把所有字段都写上太多了,布局不好看而且不实用.还有些查询条件几百年 ...

最新文章

  1. 微信小程序直播如何接入?开源代码接入案例分享
  2. 博客基础_django_python从入门到实践_创建项目_创建应用
  3. AS3.0函数定义的方法
  4. 视频传输面临的挑战和解决之道
  5. c语言上机题库程序设计,C语言上机程序设计题库及答案.docx
  6. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果
  7. ASP.NET Core使用Session
  8. 关于keeplive
  9. RapidMiner遇到的问题
  10. 微创器械行业调研报告 - 市场现状分析与发展前景预测
  11. 在没有原始数据的情况下, 我把列线图转换成了网页计算器
  12. skimage rescale_intensity函数
  13. 休闲娱乐 - 如何打坐
  14. Moveit报错:Unable to identify any set of controllers that can actuate the specified joints
  15. Rasa自定义NLU组件
  16. MJUPC-022_编程挑战系列赛第二十二场(以梦为“码“ “数“说未来)题解(C/C++代码)
  17. python 矩阵求转置、行列式、迹、求逆
  18. 性能测试---如何确定最大并发用户数
  19. Mybatis Plugin拦截器处理特殊字符串
  20. python学习资源整理

热门文章

  1. 电脑重装系统打印机脱机状态怎么恢复正常
  2. matlab复杂周期信号类建立,实验五 基于Matlab的信号频谱分析(复杂)
  3. 团体程序设计天梯赛 L2-002 链表去重
  4. 培训机构小程序功能分析
  5. CSDN写博客教程--笔记
  6. NOIP2016 秀逗记口胡题解
  7. cadence 电源完整性仿真学习笔记1
  8. centos7基于阿里云授时服务器进行本地ntp集群配置
  9. 如何成为一个不怕裁员的人?
  10. passive的作用和原理