如何通过脚本创建EA.Propertytype对象及实现Tagged Value Types查询
Tagged Value Type操作脚本问题解答
1. 为啥手动创建EA.Propertytype对象不行?
EA的COM对象(包括EA.Propertytype)不能直接声明后就赋值使用,这类对象都是EA内部管理的,只能从Repository.Propertytypes集合里获取已有的实例,或者通过EA官方提供的合法API创建(不过Tagged Value Type没有直接的创建API,你用SQL插入后刷新集合的路子是对的,但自己手动构造对象实例根本行不通)。你写的var TVT as EA.Propertytype;只是声明了一个空引用,根本没创建EA认可的对象,自然没法赋值。
2. Repository.Propertytypes.GetByName()没返回结果的可能原因
- 大小写敏感:这个方法对名称大小写较真,你传的参数必须和Tagged Value Type的名称(对应
t_propertytypes表的property字段)完全一致,包括大小写、空格都不能错。 - 没刷新集合:如果刚用SQL新增/修改了类型,必须先调用
Repository.Propertytypes.Refresh(),不然集合里还是旧缓存,GetByName()肯定找不到新条目。 - 名称带特殊字符:如果名称里有单引号、空格这类特殊字符,直接传参可能导致匹配失败,得确保参数是原始的正确名称。
3. 能用的getTV_Type实现方案
方案一:搞定GetByName()的正确用法
只要名称没问题、集合也刷新了,直接用这个方法就行:
function getTV_Type(tagNaam) { // 先刷新集合确保数据是最新的 Repository.Propertytypes.Refresh(); let tvt = Repository.Propertytypes.GetByName(tagNaam); return tvt; // 找到就返回EA.Propertytype对象,找不到返回null }
方案二:遍历集合(稳得一批的兜底方案)
要是GetByName()还是不好使,遍历集合是最靠谱的方式:
function getTV_Type(tagNaam) { Repository.Propertytypes.Refresh(); let count = Repository.Propertytypes.Count; for(let i = 0; i < count; i++) { let tvt = Repository.Propertytypes.GetAt(i); if(tvt.Tag === tagNaam) { // 注意:Tag属性对应数据库里的property字段 return tvt; } } return null; // 没找到就返回null }
方案三:SQL查询+集合取对象(避免手动造对象)
如果你想用SQL先确认存在,再从集合里拿对象(毕竟没法手动造EA.Propertytype):
function getTV_Type(tagNaam) { // 先用SQL查有没有这个类型 let sql = formatString("SELECT property FROM t_propertytypes WHERE property = '{0}';", [tagNaam]); let xmlResult = Repository.SQLQuery(sql); // EA的SQLQuery返回XML格式,判断有没有结果 if(xmlResult.indexOf("<Row>") !== -1) { Repository.Propertytypes.Refresh(); // 从集合里拿对象 return Repository.Propertytypes.GetByName(tagNaam); // 也可以换成上面的遍历方式,更稳妥 // let count = Repository.Propertytypes.Count; // for(let i = 0; i < count; i++) { // let tvt = Repository.Propertytypes.GetAt(i); // if(tvt.Tag === tagNaam) return tvt; // } } return null; }
额外优化:你的新增脚本可以加个去重判断
你提到新增类型仅在类型不存在时生效,给addTV_Type加个判断就行:
function addTV_Type(tagNaam, description, notes) { // 先检查有没有这个类型 let existing = getTV_Type(tagNaam); if(existing) { return; // 已经存在就不插了 } let sql = formatString("INSERT INTO t_propertytypes (property, description, notes) VALUES ('{0}', '{1}', '{2}');", [tagNaam, description, notes]); Repository.SQLQuery(sql); Repository.Propertytypes.Refresh(); }
内容的提问来源于stack exchange,提问作者Rob Aarnts
相关产品推荐
相关产品推荐

