如何用DXL实现DOORS布尔属性赋值:另一属性非空时设为False
现有问题梳理
1. 代码逻辑与语法错误
- 逻辑完全写反:需求为「属性A不为空时设置B为False」,现有代码判断条件为
if((o."A") == null),仅在A为空时才执行赋值操作 - 布尔属性赋值格式错误:DOORS中布尔类型属性直接赋值为小写无引号的
false,你写的"False"是字符串类型,和属性B的布尔类型不匹配 - 冗余遍历逻辑:如果将脚本写在属性的DXL计算规则中,不需要手动遍历全模块对象,DXL属性默认针对单个当前对象
obj执行,不需要自行声明Object o和写for循环 - 空值判断不严谨:字符串类型属性的空值可能是
null也可能是空字符串,建议用obj."A" "" == ""统一判断空值 - DXL属性规则写法错误:DXL计算属性需要将计算结果赋值给内置变量
attr才会生效,你现有脚本没有对attr赋值,所以刷新后不会有任何显示变化
2. 操作流程错误
你将属性B设置为DXL计算属性的操作本身不符合需求:
- DXL计算属性是只读的,系统会根据脚本自动计算显示值,不支持手动编辑,也不会将计算结果实际写入属性存储,和你要的「自动修改属性B的值」的需求完全冲突
- 保存后看不到脚本通常有两个原因:一是你没有当前模块的属性定义修改权限,修改不会被保存;二是关闭窗口时没有点击确认/应用,默认放弃了修改
正确实现方案
根据你的使用场景二选一即可:
场景1:仅需要批量更新一次现有数据,属性B后续仍可手动编辑
直接将修正后的代码作为独立DXL脚本运行,不要写在属性的DXL规则中:
Module m = current Module // 校验模块编辑权限 if(!isEditable(m)) { error("请先进入模块编辑模式") halt } Object o for o in m do { // 判断A不为空时赋值 if(o."A" "" != "") { o."B" = false } }
操作步骤:
- 进入模块编辑模式
- 点击「工具」→「编辑DXL」→ 粘贴上述代码 → 点击「运行」即可完成全模块批量更新
场景2:每次修改属性A后自动更新属性B的值,无需手动执行脚本
需要给模块设置触发器,而非DXL计算属性:
// 创建模块级后置触发器,修改属性A时自动触发 Trigger t = createTrigger(module "", POST_MODIFY, ATTRIBUTE, "A", 10, void(Object o) { if(o."A" "" != "") { o."B" = false } } )
操作步骤:
- 进入模块编辑模式
- 点击「工具」→「编辑DXL」→ 粘贴上述触发器代码 → 点击运行,触发器会自动绑定到当前模块,之后每次修改任意对象的A属性都会自动更新B的值
- 触发器会持久化保存在模块中,不手动删除就会一直生效
内容的提问来源于stack exchange,提问作者Bijan Sanchez
相关产品推荐
相关产品推荐

