cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

We are working to address an issue with subscription email notifications. In the meantime, be sure to check your favorite boards for new topics.

Getting one value from collection attribute

VladiSlav
17-Peridot

Getting one value from collection attribute

Hello everyone!

 

I get information from the server using the OData REST API.
I have a global attribute, which is a collection:

VladiSlav_0-1594283448306.png

I want the server to return only one value from the collection when requested. In the request, I want to specify a value that will determine the desired collection value.

I understand that such logic can not be written in the request. Therefore, I tried to implement this in the JavaScript domain file.

I thought that it should be a function that first receives the values ​​of the collection attributes from Windchill, matches them, and then uses the value passed to the function as a key and returns the desired value.

 

I saw that in JavaScript you can use classes from Java:

var EntityAttribute = Java.type('com.ptc.odata.core.entity.property.EntityAttribute');

But I do not know how to use the code to get the values ​​of global attributes.

I did not find documentation for odataWeb.jar (com.ptc.odata...) library.
Tell me, please, how can I do this?
Thank you in advance!
Best Regards!

3 REPLIES 3
DmitryC
12-Amethyst
(To:VladiSlav)

Hi VladiSlav,

 

Are you trying to search for parts by the value of this collection?

Have you tried the filter?

 

 

 

/Windchill/servlet/odata/ProdMgmt/Parts?$filter=contains(ThisAttr,'36')

 

 

 

 

Keep in mind that the response might be in XML or JSON format, to request it as a JSON just include it in your request header.

 

Here is a JS example of an async function that looks for a part by number:

 

 

 

function getWcPartByNumber(number, callback) {		
  let filter = "$filter=Number eq '" + number + "'";
  let orderBy = "$orderby=Revision desc";
  let filterUrl = wcHost + "/Windchill/servlet/odata/ProdMgmt/Parts?" + filter + "&" + orderBy;
		
  let xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status != 200) {
      callback(this.statusText, this);
    }
    if (this.readyState == 4 && this.status == 200) {
      callback(null, this);
    }
  };
	
  xhttp.open("GET", filterUrl, true);
  xhttp.setRequestHeader("Content-type", "application/json; charset=utf-8");
  xhttp.setRequestHeader("dataType", "json");
  xhttp.setRequestHeader("Prefer", "odata.maxpagesize=200");
  xhttp.send(null);	
}

 

 

 

 

And here is a call for this function with the following parsing of the response and a check if this collection of yours contains a certain value:

 

 

 

getWcPartByNumber (wtPartNumber, function(err, data) {
  if (err != null) {
    alert (err);
  } else {
    let dataObj = JSON.parse(data.responseText);

    if (dataObj.value.length != 0 && dataObj.value[0].ThisAttr.includes(36)) {
      // Do Something
    }
  }
});

 

 

 

 

With XML response it should be somewhat similar.

 

 

Kind regards,

Dmitry. 

DmitryC
12-Amethyst
(To:VladiSlav)

Hi VladiSlav,

 

Are you trying to search for parts by the value of this collection?

Have you tried the filter?

 

/Windchill/servlet/odata/ProdMgmt/Parts?$filter=contains(ThisAttr,'36')

 

 

Keep in mind that the response might be in XML or JSON format, to request it as a JSON just include it in your request header.

 

Here is a JS example of an async function that looks for a part by number:

 

function getWcPartByNumber(number, callback) {		
  let filter = "$filter=Number eq '" + number + "'";
  let orderBy = "$orderby=Revision desc";
  let filterUrl = wcHost + "/Windchill/servlet/odata/ProdMgmt/Parts?" + filter + "&" + orderBy;
		
  let xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status != 200) {
      callback(this.statusText, this);
    }
    if (this.readyState == 4 && this.status == 200) {
      callback(null, this);
    }
  };
	
  xhttp.open("GET", filterUrl, true);
  xhttp.setRequestHeader("Content-type", "application/json; charset=utf-8");
  xhttp.setRequestHeader("dataType", "json");
  xhttp.setRequestHeader("Prefer", "odata.maxpagesize=200");
  xhttp.send(null);	
}

 

 

And here is a call for this function with the following parsing of the response and a check if this collection of yours contains a certain value:

 

getWcPartByNumber (wtPartNumber, function(err, data) {
  if (err != null) {
    alert (err);
  } else {
    let dataObj = JSON.parse(data.responseText);

    if (dataObj.value.length != 0 && dataObj.value[0].ThisAttr.includes(36)) {
      // Do Something
    }
  }
});

 

 

With XML response it should be somewhat similar.

 

 

Kind regards,

Dmitry. 

VladiSlav
17-Peridot
(To:DmitryC)

Thank you very much for your reply!

Your answer tells me that I can pass any value to a function
But, unfortunately, I need to get not part, but the value of IBA.
Tell me, please, how can I run such a function that does not have the prefix "function_"?

Top Tags