2

我有一个用 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 未提及在的脚本中发生错误的位置)跟踪到此行:

$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 钩子。

4

1 回答 1

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)。

By either quoting the variable or appending an empty string, you convert it into an expected string.

于 2010-12-28T19:35:45.633 回答