我有一个用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挂钩运行。
答案 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)。
通过引用变量或附加空字符串,可以将其转换为预期的字符串。