Search code examples
perlapiclearquest

ClearQuest Perl API -- Adding a Child Record to another record


I have a ClearQuest database with a record type called "BuildSheet". On a BuildSheet record, you can attach tasks which are another record type.

I thought I could create a task record type, via the BuildEntity Session method, then do a EditEntity Session method on the BuildSheet record, and add the Task Id field via the AddFieldValue Entity method.

Unfortunately, my attempt to create the Type record fails. It gets tripped by the eval statement:

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

The eval is failing when I attempt to create the TASK_RECORD_TYPE record. I get the following error message:

Error when attempting to create record type "Task"
Permission denied for user WeintraubH to perform action Create (of type SUBMIT)
at D:/Program Files/Rational/Common/lib/perl5/site_perl/5.8.6/CQPerlExt.pm line 43.
  at H:\svn\addTask.cqpl line 340
    main::createTask('TASK', 'cm', 'HEADLINE',
      'FMS-CWA_APP_B35_HF276', 'DESCRIPTION', 'FMS-CWA_APP_B35_HF276',
      'PRIORITY', 2, 'EFFORT', ...) called at H:\svn\addTask.cqpl line 236

Now, I can bring up a BuildSheet record, go into the Child Record tag, click Create and build my task record that way, so apparently I do have permission.

What it seems is that I must somehow associate the "Task" record with a "BuildSheet" before I try to create it, but how?


Solution

  • I found the culprit. They have a hook on the BuildEntity method in order to ensure that the Task record I'm trying to create is connected to a parent record. Stupid *#@#*$&@.

    Anyway I found the hook script (written in VB) and found where they were trying to trip me up:

    Set oSession = GetSession   
    
    pRequestIDValue = oSession.NameValue("ParentRequestID")
    pTaskIDValue = oSession.NameValue("ParentTaskID")
    pBuildSheetIDValue = oSession.NameValue("ParentBuildSheetID")
    NewTaskPermittedValue = oSession.NameValue("NewTaskPermitted")     
    
    curUser = oSession.GetUserLoginName
    
    if (pBuildSheetIDValue <> "") or (pTaskIDValue <> "") _
        or ((pRequestIDValue <> "")  and (NewTaskPermittedValue = "Yes")) then  
        task_AccessControl = TRUE 
    else 
        task_AccessControl = FALSE                    
    end if
    

    To get around this, I set ParentBuildSheetID with the SetNameValue method before I attempted to create the record:

    $cq->SetNameValue("ParentBuildSheetID", $buildsheetId);
    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);
    }
    

    Now, that worked!