我有一个用 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);
同样,除非我打印出变量 $buildsheetId
,否则 GetEntity
会失败。
为什么在执行 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 行长,因此子例程错误不是来 self 的程序。但是,这两行 DEBUG:
是。一个是在创建 BuildEntity
方法之前,另一个是在 GetEntity
方法之前。我必须追踪这些 Subroutine redefine
行的来源。我认为它们是某种正在运行的 VB CQ 钩子(Hook)。
最佳答案
看看这样做是否有帮助(删除调试打印):
$cq->SetNameValue("ParentBuildSheetID", $buildsheetId . "");
或
$cq->SetNameValue("ParentBuildSheetID", "$buildsheetId");
如果它有效,你的问题是,你的 API 会以某种方式检查一个值是 int 还是 string(我假设 ClearQuest 内部结构是 C 语言,而不是纯 Perl 语言,所以在你的值已创建 - 请参阅 http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlguts.html#Working_with_SVs )。
通过引用变量或附加空字符串,您可以将其转换为预期的字符串。
关于perl - ClearQuest Perl API - 值未设置,除非我打印它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548751/