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

Conditional routing based on Document attributes

ipsomiadis
6-Contributor

Conditional routing based on Document attributes

Hello all,

I am trying to have a conditional routing in a workflow, based on a specific attribute of the routed document.

In the expression I use this:

//get the attributes of the document.
wt.iba.value.IBAHolder holder = wt.iba.value.service.IBAValueHelper.service.refreshAttributeContainerWithoutConstraints(doc);
wt.iba.value.DefaultAttributeContainer ac = (wt.iba.value.DefaultAttributeContainer) holder.getAttributeContainer();

if (ac != null) {
wt.iba.value.litevalue.AbstractValueView[] avalues = ac.getAttributeValues();

for (int i=0;i<avalues.length;i++) {
wt.iba.value.litevalue.AbstractValueView val = avalues[i];
if (val.getDefinition().getName().equals("contracttype")) IPselect= val.getLocalizedDisplayString();
break;
}
}
}catch(Exception e) { System.out.println("Caught Exception:" + e.toString()); }

Then in the OR I have put this:

result="IP_Yes";

if (IPselect.equalsIgnoreCase("Consulting")) result="IP_No";

if (IPselect.equalsIgnoreCase("Service Agreement")) result="IP_No";

The problem I have is that some times it gets the value from the document (thus "IPselect" has a value in the workflow) and some others not.

Any ideas?

Thank you in advance

John

1 ACCEPTED SOLUTION

Accepted Solutions
ipsomiadis
6-Contributor
(To:ipsomiadis)

It is solved. I found the error.

Originally I was telling to check this:

              

                if (val.getDefinition().getName().equals("contracttype")) IPselect= val.getLocalizedDisplayString();

                break;

So the if was break at the first attribute it was getting (any attribute). Obvisously it was not the one i wanted. So I have put the break inside like that:

                if (val.getDefinition().getName().equals("contracttype")) {

                IPselect= val.getLocalizedDisplayString();

                break;

                }

So now it will check all the attributes, and it will stop when it will get the "contracttype".

Regards

John

View solution in original post

7 REPLIES 7

Thank you for your comment.

The problem is that when the process run, sometimes I get the value of the attribute and sometimes not.

Regards

John

ipsomiadis
6-Contributor
(To:ipsomiadis)

It is solved. I found the error.

Originally I was telling to check this:

              

                if (val.getDefinition().getName().equals("contracttype")) IPselect= val.getLocalizedDisplayString();

                break;

So the if was break at the first attribute it was getting (any attribute). Obvisously it was not the one i wanted. So I have put the break inside like that:

                if (val.getDefinition().getName().equals("contracttype")) {

                IPselect= val.getLocalizedDisplayString();

                break;

                }

So now it will check all the attributes, and it will stop when it will get the "contracttype".

Regards

John

Good for:

- keeping all brain cells really busy and working hard

- keeping us all humble

How good you feel when you find the problem seems to be in proportion to how hard it is to find the problem.

Ioannis Psomiadis‌,

You may want to consider switching over from wt.iba.value.IBAHolder to com.ptc.core.lwc.server.PersistableAdapter.  I think your code is being deprecated.  And the new code is fewer lines.  Check it out in the context of the other posting:  Re: PBO Attribute captured in a workflow

doc = (wt.doc.WTDocument)primaryBusinessObject;  // you can skip this - you already instantiated "doc"

com.ptc.core.lwc.server.PersistableAdapter obj = new com.ptc.core.lwc.server.PersistableAdapter(doc,null,null,null);

obj.load("contracttype");

IPselect = (String)obj.get("contracttype");

ipsomiadis
6-Contributor
(To:BenPerry)

Happy New Year Ben,

Thank you for your tip. I will test it in our development environment and I will let you know.

Regards

John

ipsomiadis
6-Contributor
(To:BenPerry)

Hello Ben,

 

I have tried to use the persistable adapter in a new promotio request workflow.

the code is as per below:

 

try {

wt.epm.EPMDocument doc =  (wt.epm.EPMDocument) primaryBusinessObject;

com.ptc.core.lwc.server.PersistableAdapter obj = new com.ptc.core.lwc.server.PersistableAdapter(doc,null,null,null);

obj.load("com.bicworld.Type");

ditatype = (String)obj.get("com.bicworld.Type");

}catch(Exception e) { System.out.println("Caught Exception:" + e.toString()); }

 

The ditatype nevertheless in the workflow is empty. it does not get the value of the object.

Spelling is triple-checked 🙂 and i cannot understand why is that happening.

 

after the robot, i have the conditional expression:

if (ditatype.equalsIgnoreCase("BOM Engineering")) result="Engineering";
if (ditatype.equalsIgnoreCase("BOM Package")) result="Engineering";
if (ditatype.equalsIgnoreCase("Design Visual")) result="Design";
if (ditatype.equalsIgnoreCase("Mechanical Properties")) result="Engineering";
if (ditatype.equalsIgnoreCase("Package Material")) result="Package";
if (ditatype.equalsIgnoreCase("Part Material and Masterbatch")) result="Engineering-Technical";
else result="KDM-QA";

 

but it is always selecting the KDM-QA branch of the workflow.

 

any ideas?

 

Thank you in advance

 

Announcements