为什么DXL脚本可以在DOORS中运行但不能以批处理模式运行时有哪些常见原因?

时间:2019-05-21 01:17:43

标签: ibm-doors

我有一个dxl脚本,该脚本在DOORS应用程序中运行时有效,但在以批处理模式运行时却不起作用。我不确定为什么会这样。在批处理模式下运行时,出现以下错误:

门:断言失败,行3173,document.cpp:!nls_(“意外:树根没有名称属性”)堆栈

我知道创建GUI之类的操作可能会导致此错误,但是我没有这样做。奇怪的是,脚本停止在不同的模块和模块的不同部分中运行。因此,每次运行时,脚本都会在DOORS的不同区域分解。

我认为这是可能导致批处理模式下错误的相关代码:

Buffer bsz = create

void addNewLineSeparator(Buffer& b)
{
if (length(b) > 0)
{
    b += "\n"
}
}

void display(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRich(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRichWithColour(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRichWithColor(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void display(Attr__ a)
{
string s = richText a
    if (!null s)
    {
        displayRich s
    }
}

string showOut(Object o, int depth) {
Link l
    LinkRef lr
    ModName_ otherMod = null
    Module linkMod = null
    ModuleVersion otherVersion = null
    Object othero
    string disp = null
    string s = null
    string plain, plainDisp
    int plainTextLen
    int count
    bool doneOne = false
    string linkModName = "*"
    for l in all(o->linkModName) do {
        otherVersion = targetVersion l
            otherMod = module(otherVersion)
            if (null otherMod || isDeleted otherMod) continue
                othero = target l
                if (null othero) {
                    load(otherVersion, false)
                }
        othero = target l
            if (null othero) continue
                if (isDeleted othero) continue
                    doneOne = true
                    if (depth == 1) {
                        s = fullName(otherMod)
                            if (isBaseline(otherVersion)) {
                                s = s " [" versionString(otherVersion) "]"
                            }
                        if (s == "")
                            displayRich("\\pard " " ")
                        else
                            displayRich("\\pard " s)
                    }
    }
return s
}
for o in m do
    {
        print showOut(o, 1)

}

1 个答案:

答案 0 :(得分:0)

任何可能依赖于视图的事情都可能发生这种情况。 DOORS的批处理模式可能很挑剔。另外,DOORS对于内存管理也不是很谨慎-如果可以的话,将代码分成几部分可能更有意义,其中一个部分运行一个轻量级的集合,该集合在'eval_'函数中运行其他代码。这将有助于使内存解除分配的运行更加平稳(我曾经用来对数据库进行完整链接清单的一个技巧-已打开和关闭超过16000个模块!)

要对您的编辑进行回复:

您显示的代码是Layout DXL,它在显示视图时进行评估-具体来说,“ displayRich”函数尝试获取一个RTF字符串并将其放入相应的列中-但该列不存在,因为视图上下文不是以批处理模式创建的。

一个简单的解决方法是将整个代码包装在以下位置:

if(!isBatch){
     // Your Code Here
}

这将确保仅当用户以非批处理模式运行DOORS时才计算DXL。