It is not advisable to update IBA's without checking the objects out & then back in, but it can be done with a java method shown below:
public static void getIBA_WTP_Attr(WTPart wtp, String attrName, String newValue){
try{
Locale locale = Locale.getDefault();
wt.iba.value.IBAHolder ibaHolder=wt.iba.value.service.IBAValueHelper.service.refreshAttributeContainer((wt.iba.value.IBAHolder)wtp, null, null, null);
wt.iba.definition.service.StandardIBADefinitionService defService=new wt.iba.definition.service.StandardIBADefinitionService();
wt.iba.value.DefaultAttributeContainer attributeContainer=(wt.iba.value.DefaultAttributeContainer)ibaHolder.getAttributeContainer();
wt.iba.definition.litedefinition.AttributeDefDefaultView attributeDefinition=defService.getAttributeDefDefaultViewByPath(attrName);
System.out.println("Size:"+attributeContainer.getAttributeValues(attributeDefinition).length);
wt.iba.value.litevalue.StringValueDefaultView attValue= (wt.iba.value.litevalue.StringValueDefaultView)attributeContainer.getAttributeValues(attributeDefinition)[0];
System.out.println("Attribute Name: "+ attrName);
System.out.println("Value WAS: "+ attValue.getValue());
attValue.setValue(newValue);
System.out.println("Value IS: "+ attValue.getValue());
attributeContainer.updateAttributeValue(attValue);
wt.iba.value.service.StandardIBAValueService.theIBAValueDBService.updateAttributeContainer(ibaHolder, null, null, null);
wt.fc.PersistenceHelper.manager.save(wtp);
}
catch(WTException ew){
ew.printStackTrace();
}
catch (RemoteException er){
er.printStackTrace();
}
catch (ArrayIndexOutOfBoundsException ea){
ea.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
This sequence allows it:
attributeContainer.updateAttributeValue(attValue);
wt.iba.value.service.StandardIBAValueService.theIBAValueDBService.updateAttributeContainer(ibaHolder, null, null, null);
wt.fc.PersistenceHelper.manager.save(wtp);
L Jett (cadjett@aol.com;datajett@aol.com)
But it might still iterate it. Dont recall.
does anybody have idea how to modify iba value without iteration. with or without checkin check out
Thanks
Hello Anurag,
As it has been said earlier, it is not advisable to update IBA without iterating the object.
But, having said that you can use below snippet to do so.
public static Persistable updateIBAValue(IBAHolder ibaHolder, String ibaName, Object ibaValue)
throws RemoteException, WTException, WTPropertyVetoException
{
logger.debug("...Inside updateIBAValue...");
ibaHolder = IBAValueHelper.service.refreshAttributeContainer(ibaHolder, null, null, null);
StandardIBADefinitionService defService = new StandardIBADefinitionService();
DefaultAttributeContainer attributeContainer = (DefaultAttributeContainer) ibaHolder.getAttributeContainer();
AttributeDefDefaultView attributeDefinition = defService.getAttributeDefDefaultViewByPath(ibaName);
AbstractContextualValueDefaultView attrValue = null;
AbstractValueView abstractValueView[] = attributeContainer.getAttributeValues(attributeDefinition);
logger.debug("abstractValueView.length..."+abstractValueView.length);
if ((abstractValueView.length == 0))
{ // No existing value, needs to be created if approvedDate argument has a value
if (null != ibaValue)
{
if (attributeDefinition instanceof TimestampDefView && ibaValue instanceof Timestamp)
{
logger.debug("attributeDefinition is TimestampDefView...");
attrValue = new TimestampValueDefaultView((TimestampDefView) attributeDefinition,
(Timestamp) ibaValue);
}
else if (attributeDefinition instanceof StringDefView)
{
logger.debug("attributeDefinition is StringDefView...");
attrValue = new StringValueDefaultView((StringDefView) attributeDefinition, ibaValue.toString());
}
else if (attributeDefinition instanceof FloatDefView)
{
logger.debug("attributeDefinition is FloatDefView...");
if(ibaValue instanceof FloatingPoint){
logger.debug("ibaValue is FloatingPoint..."+ibaValue);
ibaValue = ((FloatingPoint)ibaValue).getValue();
logger.debug("ibaValue..."+ibaValue);
}
attrValue = new FloatValueDefaultView((FloatDefView) attributeDefinition, (Double) ibaValue, 5);
}
else if (attributeDefinition instanceof IntegerDefView)
{
logger.debug("attributeDefinition is IntegerDefView...");
attrValue = new IntegerValueDefaultView((IntegerDefView) attributeDefinition, (Long) ibaValue);
}
attributeContainer.addAttributeValue(attrValue);
}
else
{
System.out.println("ibaValue is null...");
return (Persistable)ibaHolder;
}
}
else
{ // Has existing value, needs to be updated/resetted
AbstractValueView avv = abstractValueView[0];
if (null == ibaValue)
{// Reset case
attributeContainer.deleteAttributeValue(avv);
}
else
{ // Update case
logger.debug("Update Case...");
if (avv instanceof TimestampValueDefaultView)
{
logger.debug("avv is TimestampValueDefaultView...");
((TimestampValueDefaultView) avv).setValue((Timestamp) ibaValue);
}
else if (avv instanceof StringValueDefaultView)
{
logger.debug("avv is StringValueDefaultView...");
((StringValueDefaultView) avv).setValue(ibaValue.toString());
}
else if (avv instanceof FloatValueDefaultView)
{
logger.debug("avv is FloatValueDefaultView...");
if(ibaValue instanceof FloatingPoint){
logger.debug("ibaValue is FloatingPoint for Update case..."+ibaValue);
ibaValue = ((FloatingPoint)ibaValue).getValue();
logger.debug("ibaValue..."+ibaValue);
}
((FloatValueDefaultView) avv).setValue((Double) ibaValue);
}
else if (avv instanceof IntegerValueDefaultView)
{
logger.debug("avv is IntegerValueDefaultView...");
((IntegerValueDefaultView) avv).setValue((Long) ibaValue);
}
attributeContainer.updateAttributeValue(avv);
}
}
ibaHolder.setAttributeContainer(attributeContainer);
StandardIBAValueService.theIBAValueDBService.updateAttributeContainer(ibaHolder, null, null, null);
WTCollection byPassIterationModifierSet = new WTHashSet();
byPassIterationModifierSet.add(ibaHolder);
WorkInProgressServerHelper.putInTxMapForValidateModifiable(byPassIterationModifierSet);
Persistable persObject = PersistenceHelper.manager.save((Persistable) ibaHolder);
// PersistenceServerHelper.manager.insert((Persistable)ibaHolder);
return persObject;
}
Please let me know, if you need any further info.
Hi.
I have IBAs with names that appear to be like "com.mycompany.MyAttribute".
I tried the code example above and am getting a null from this line:
AttributeDefDevaultview attributeDefinition = defService.getAttributeDefDefaultCviewByPath(ibaName);
It also gives a null if I try just "MyAttribute".
Are these a different flavor of IBA that needs a different set of API to get to?
Thanks in advance,
Kelly
I'm using the supported PersistableAdapter to update attribute information. You need to checkout the object before updating the object.
CREATE
PersistableAdapter obj = new PersistableAdapter("com.acme.AcmePart",null,null);
obj.load("name","number");
obj.set("name","my name");
obj.set("number","12345");
obj.persist();
10.1 Create with Folder information
LWCNormalizedObject obj = new LWCNormalizedObject("WCTYPE|wt.part.WTPart",null,null);
obj.load("name","containerReference","folder");
obj.set("name", "TestPart");
obj.set("containerReference", "OR:wt.pdmlink.PDMLinkProduct:1234"");
obj.set("folder", "/Default/Design/");
obj.persist();
obj.load("name","containerReference","folder");
obj.set("name", "TestPart");
obj.set("containerReference", "OR:wt.pdmlink.PDMLinkProduct:1234"");
obj.set("folder.id", "/Default/Design/");
obj.persist();
Retrieve
PersistableAdapter obj = new PersistableAdapter(my_persistable,null,null,null);
obj.load("name","number","booleanValue");
Object nameValue = obj.get("name");
Object numberValue = obj.get("number");
Boolean booleanValue = (Boolean) obj.get("booleanValue");
Retrieve Multi Value Attribute
Object value = obj.get(attributeName);
if (value instanceof Object[]) {
Object values[] = (Object[]) value;
…
} else {
objValue = value;
}
UPDATE
PersistableAdapter obj = new PersistableAdapter(my_persistable,null,Locale.US,new UpdateOperationIdentifier());
obj.load("attributeA","attribtueB");
obj.set("attributeA",new Boolean(true));
obj.set("attribtueB","PURPLE");
obj.apply();
...
PersistenceHelper.manager.modify(my_persistable);
I don't know if people are aware of this, but there is a group dedicated to Windchill Customization, go check it out! Windchill Customization
Hi there,
I had a similar issue, where I tried to change an IBA - Value during a promotion request process.
Thanks to the discussion here, i was able to solve it.
I posted the whole procedure here:
https://community.ptc.com/t5/Windchill-Customization/Info-How-to-set-attribute-for-quot-released-by-quot-quot/m-p/988177