我有一个用 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 钩子。