ClearQuest Perl API - значение не установлено, если я его не распечатал? - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть сценарий ClearQuest API, написанный на Perl.Если я делаю это:

#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.

Почему это важно, если явывести значение Perl переменной до того, как я выполню вызов ClearQuest API?


UPDATE

Вот весь вывод моего скрипта:

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 Ответ

4 голосов
/ 28 декабря 2010

Проверьте, помогает ли это (удалите отладочную печать):

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

или

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

Если это работает, ваша проблема в том, что каким-то образом ваш API проверяет, является ли значение целым или строковым (я предполагаю, что внутренности ClearQuest находятся в C, а не в чистом Perl, так что есть разница в том, как значение создано - см. http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlguts.html#Working_with_SVs).

Используя кавычку в переменной или добавляя пустую строку, вы конвертируете ее в ожидаемую строку.

...