问题描述
基本上,我必须遍历对象的所有基线,直到找到修改“_ReqStatus”属性的作者并将该值复制到“_Ownr”属性中。对于当前基线,一切正常,但我无法通过模块的旧基线。我不得不提一下,我为 2000 个对象运行了脚本,每个对象至少有 20 个基线。
我的代码如下:
//scriptul recunoaste obiectele cu "ReqStatus modifica"
pragma runLim,0
Module m = current
History h
HistoryType ht
Object o
string attributName
string attributNameBaseline
string authorName
string newOwner
Baseline lBaseLine
noError()
for o in entire m do {
**for lBaseLine in module(o) do{ //These 2 code lines were my try to load all baselines
Module lBaseMod = load(module(o),false) //but with no results**
for h in o do
{
string owner = ""
attributName=""
attributName = h.attrName
authorName=""
owner = o."_Owner"
if isDeleted(o) then continue
if(attributName=="_ReqStatus")
{
authorName=h.author
//print authorName
//print "\n"
if(null owner)
{
print identifier(o)
print "\n"
newOwner = authorName
print newOwner"\n"
o."_Ownr" = newOwner
//print newOwner
break
}
}
}
}
}
ErrMess = lastError()
谢谢
解决方法
Tony Goodman 在 http://www.smartdxl.com/content/?p=418 提供了一个脚本“Smart History Viewer”,Michael Sutherland 在 https://www.ibm.com/mysupport/s/forumsquestion?id=0D50z00006HIGSUCA5 提供了一个脚本,如果您在 https://www.ibm.com/mysupport/s/forumshome 上搜索例如“dxl 历史”,您可能会发现更多代码示例,它们应该可以帮助您解决此主题。
您的问题是变量 o
。它仅在循环 for o in entire m
中设置,它始终引用当前版本的 o
中的 m
,从不引用基线中的相应对象。当您打开模块 lBaseMod
时,o
不会自动重新分配。
因此,使用类型为 Object
的新变量,将其设置为与 o
对应的基线中的对象,并浏览此新对象的历史记录,请参阅链接脚本以供参考。
此外,您应该重新设计脚本流程。使用您的方法,您可以为每个对象打开 m
的所有基线。在您的情况下,这意味着 2000 * 20 load
和 close
。在外循环中打开 m
的所有基线会快得多(虽然不一定消耗内存),可能使用跳过列表来收集必要的信息。
另请注意,当您测试脚本时,一段时间后“打印”会变得非常慢。如果您记住要打印的所有值,速度会更快,例如在 Buffer 中并在脚本末尾打印它,或将输出写入文件。