ClearQuest Perl API - 除非我打印,否则不设置值?

时间:2010-12-28 19:18:05

标签: perl clearquest

我有一个用Perl编写的ClearQuest API脚本。如果我这样做:

#print qq(DEBUG: Buildsheet ID is "$buildsheetId"\n);
$cq->SetNameValue("ParentBuildSheetID", $buildsheetId);

#
# Now Create the Record Type and Fill in the Fields
#
my $record;
eval { $record = $cq->BuildEntity(TASK_RECORD_TYPE); };
if ($@) {
    croak qq(Error when attempting to create record type ")
    . TASK_RECORD_TYPE . qq("\n$@\n);
}
if (not $record) {
    die qq(Cannot create entity ") . TASK_RECORD_TYPE . qq("\n);
}

我收到以下错误:

ST(2) does not contain a string. at D:/Program Files/Rational/Common/lib/perl5/site_perl/5.8.6/CQPerlExt.pm line 43.

我在此行中追踪了此错误消息(THX CQ,因为没有提及错误发生在 MY 脚本中的位置):

$cq->SetNameValue("ParentBuildSheetID", $buildsheetId);

嗯...也许我没有设置$buildsheetId。让我通过在我设置它之前打印出DEBUG语句来检查:

print qq(DEBUG: Buildsheet ID is "$buildsheetId"\n);
$cq->SetNameValue("ParentBuildSheetID", $buildsheetId);

#
# Now Create the Record Type and Fill in the Fields
#
my $record;
eval { $record = $cq->BuildEntity(TASK_RECORD_TYPE); };
if ($@) {
    croak qq(Error when attempting to create record type ")
    . TASK_RECORD_TYPE . qq("\n$@\n);
}
if (not $record) {
    die qq(Cannot create entity ") . TASK_RECORD_TYPE . qq("\n);
}

注意:与上面的代码相同,但启用了之前的print调试语句。)

现在有效!

为什么单纯打印出值才能起作用?这不是我遇到这个问题的唯一地方:

print qq(DEBUG: \$buildsheetId = "$buildsheetId"\n);
my $record = $cq->GetEntity(BSHEET_RECORD_TYPE, $buildsheetId);

同样,GetEntity失败,除非我打印出变量$buildsheetId

为什么在进行ClearQuest API调用之前打印出变量的Perl值会有什么影响呢?


更新

这是我的脚本的整个输出:

H:\>addTask.cqpl -user WeintraubH -pass Cape01may -buildsheet 5618 -task cm  
DEBUG: Buildsheet ID is "5618"
Subroutine NoteEntryInit redefined at (eval 1) line 850.
Subroutine SetLog redefined at (eval 1) line 1084.
DEBUG: $buildsheetId = "5618"

请注意,我的脚本只有559行,因此子程序错误不是来自我的程序。但是,两条DEBUG:行是。一个是在创建BuildEntity方法之前,另一个是在GetEntity方法之前。我将不得不追查那些Subroutine redefined行的来源。我认为它们是某种VB CQ挂钩运行。

1 个答案:

答案 0 :(得分:4)

看看这样做是否有帮助(删除调试打印):

$cq->SetNameValue("ParentBuildSheetID", $buildsheetId . "");

$cq->SetNameValue("ParentBuildSheetID", "$buildsheetId");

如果它有效,你的问题是,不知何故,你的API检查一个值是一个int还是一个字符串(我假设ClearQuest内部是在C中,而不是纯粹的Perl,所以你的方式有所不同值已创建 - 请参阅http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlguts.html#Working_with_SVs)。

通过引用变量或附加空字符串,可以将其转换为预期的字符串。