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.