Pregunta

I tiene una secuencia de comandos API ClearQuest escrito en Perl. Si hago esto:

#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);
}

Me sale el siguiente error:

ST(2) does not contain a string. at D:/Program Files/Rational/Common/lib/perl5/site_perl/5.8.6/CQPerlExt.pm line 43.

Rastreé este mensaje de error (CQ THX por no mencionar donde en MI script de donde se produjo el error) a esta línea:

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

Hmmm ... Tal vez no se estableció $buildsheetId. Déjame ver, imprima la declaración de depuración anterior cuando lo fijo:

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);
}

( Nota: . El mismo código que el anterior, pero con print anterior declaración de depuración activado)

Ahora funciona!

¿Por qué funciona mediante la simple impresión está el valor? Este no es el único lugar en el que tengo este problema:

print qq(DEBUG: \$buildsheetId = "$buildsheetId"\n);
my $record = $cq->GetEntity(BSHEET_RECORD_TYPE, $buildsheetId);

Una vez más, no menos que GetEntity imprimo la variable $buildsheetId.

¿Por qué importa si imprimir el valor de una variable Perl antes de hacer una llamada a la API ClearQuest?


ACTUALIZACIÓN

Aquí está toda la producción de mi script:

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"

Tenga en cuenta que mi guión está a sólo 559 líneas largas, por lo que los errores de subrutina no son de mi programa. Sin embargo, las dos líneas DEBUG: son. Una de ellas es antes de crear el método BuildEntity y otro antes de un método GetEntity. Voy a tener que rastrear hacia abajo, donde esas líneas Subroutine redefined están viniendo. Lo tomo que son una especie de gancho CQ VB en ejecución.

¿Fue útil?

Solución

A ver si esto ayuda (retire la impresión de depuración):

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

o

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

Si funciona, el problema era que de alguna manera, los cheques de la API si un valor es un entero o una cadena (estoy suponiendo que las entrañas ClearQuest están en C, no es puro Perl, por lo que hay una diferencia en cuanto a la forma en que su valor fue creado - ver http: // www .sdsc.edu / ~ Moreland / cursos / IntroPerl / docs / manual / vaina / perlguts.html # Working_with_SVs ).

Por cualquiera citando la variable o añadiendo una cadena vacía, que la convierten en una cadena esperada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top