It's all about the answers!

Ask a question

How to set artifact values using RM.Data.setAttributes?


Antje Rößle-Tuchel (59315) | asked Oct 09, 3:59 a.m.

I am trying to set an attribute value to another one if the artifact changed before. My code looks like following (according to https://jazz.net/wiki/bin/view/Main/RMExtensionsAPI702#SetAttributes)

 function resetProcessState(artRefsList){

    var toSave = [];
    // For each artifact in the module, reset process attributes
    artRefsList.forEach(function(item){
        console.log (item)
        // Create a new ArtifactAttributes object to contain the update data
        var artifactAttributes = new RM.ArtifactAttributes();
        var attributeValues = new RM.AttributeValues();
        //artifactAttributes.ref = item;
        artifactAttributes.values = attributeValues;
       
        // Reset some attribute values
        attributeValues['Variants']="something";
        toSave.push(artifactAttributes);
        console.log (toSave)
    });
   
    // Perform a bulk save of all attributes
    RM.Data.setAttributes(toSave[0], function(result){

        if(result.code === RM.OperationResult.OPERATION_OK)
        {
            console.log ("changed")
        }
        else{
            console.log (result)
        }
    })
 }

If I let the code so, nothing happens.

If I set the artifactAttributes.ref = item I get following error: Operation failed, Operation_Bad_Request.

If I change the code RM.Data.setAttributes(toSave[0], function(result) to RM.Data.setAttributes(toSave, function(result), I get the same error.

If I change the code RM.Data.setAttributes(toSave[0], function(result) to RM.Data.setAttributes(toSave[0].values, function(result), I get following error: 
  1. code: "OPERATION_BAD_REQUEST"
  2. message: "Illegal Argument: attributes"
Any hint how the RM.Data.SetAttributes first parameter has to be set is welcome.

2 answers



permanent link
Davyd Norris (2.8k217) | answered Oct 09, 8:19 a.m.
There are a whole lot of issues with this code:
 - How are you triggering this code? Can you show the entire example? What are you passing into the function via artRefsList?
 - in order to set attributes on an artefact, you first have to retrieve an item and its attributes. That sets up references to the attributes and their values that you then use in the setAttributes function. The line you have commented out is not correct but it's the line you need in order to set up the reference. The line should read:
    artifactAttributes.ref = item.ref;

Comments
Antje Rößle-Tuchel commented Oct 09, 8:26 a.m.
Sorry, this is my trigger:

RM.Event.subscribe(RM.Event.ARTIFACT_SAVED, function(artRef){
    artRefsList=[]
    artRefsList.push(artRef)    
    console.log(artRefsList)
    resetProcessState(artRefsList)
       
})

Davyd Norris commented Oct 09, 6:19 p.m.
OK 
 - firstly, the callback function is passed an array of artefact refs, so artRef is an array already.
 - secondly, you probably want to go through that array and make sure the artefacts that were saved are of the correct artefact type, unless you know for sure they are. That would be the time to push the correct types into your own array.

I think the main problem you have is a) you're pushing an array reference into your array, so everything else in your first code snippet will fail, and b) you're not setting a reference to the actual artefact that needs the values updated with new attribute values in that first snippet

permanent link
Antje Rößle-Tuchel (59315) | answered Oct 14, 9:22 a.m.

Thank you Davyd for your hints. With your help I got it now. See afterwards my solution:


let oldArtRef=[]

RM.Event.subscribe(RM.Event.ARTIFACT_SAVED, async function(artRef){
    console.log (oldArtRef)
    console.log (artRef)
    if (oldArtRef[0]){
        if (oldArtRef[0].uri != artRef[0].uri){
            oldArtRef = await resetProcessState(artRef)
        }
    }
    else{
        oldArtRef = await resetProcessState(artRef)
    }      
})


// Reset workflow state for the changed artifact to "New", if the artifact type is one of "Software Requirement" or "Required Value"
async function resetProcessState(artRef){
    return new Promise((resolve, reject)=> {
        RM.Data.getAttributes(artRef, [RM.Data.Attributes.ARTIFACT_TYPE], async function(result){
            console.log (result.data)
            var attrs = result.data[0]
            if (attrs.values["http://www.ibm.com/xmlns/rdm/rdf/ofType"].name==="Software Requirement" ||
            attrs.values["http://www.ibm.com/xmlns/rdm/rdf/ofType"].name==="Required Value"){
                let artifactAttributes = await new RM.ArtifactAttributes();
                let attributeValues = await new RM.AttributeValues();
                artifactAttributes.ref = artRef[0];
                artifactAttributes.values = attributeValues
               
                // Reset some attribute values
                attributeValues["State (Requirements Workflow)"]="New";
                console.log (attributeValues)
                console.log (artifactAttributes)
                await RM.Data.setAttributes(artifactAttributes, async function(result){
                    if(result.code === RM.OperationResult.OPERATION_OK){
                        resolve(artRef)
                    }
                    else{
                        reject(result)
                    }
                })
            }
        })    
    })

Your answer


Register or to post your answer.


Dashboards and work items are no longer publicly available, so some links may be invalid. We now provide similar information through other means. Learn more here.