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.

このエラー メッセージ ( MYスクリプトのどこでエラーが発生したかを言及していないための 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ますが、 variable を出力しないと失敗します$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 行しかないので、サブルーチン エラーは私のプログラムによるものではないことに注意してください。ただし、2DEBUG:行はあります。1 つはメソッドを作成するBuildEntity前で、もう 1 つはメソッドを作成する前GetEntityです。Subroutine redefinedそれらの線がどこから来ているのか追跡する必要があります。私は、それらがある種の VB CQ フックを実行していると考えています。

4

1 に答える 1

4

これが役立つかどうかを確認します(デバッグ出力を削除します):

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

また

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

それが機能する場合、あなたの問題は、どういうわけか、値が int か文字列かを API がチェックすることでした (ClearQuest 内部は純粋な Perl ではなく C にあると想定しているため、値がどのように作成されたかという点で違いがあります) - http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlguts.html#Working_with_SVsを参照)。

変数を引用符で囲むか空の文字列を追加することで、期待される文字列に変換します。

于 2010-12-28T19:35:45.633 に答える