PeopleCode Evaluate

A question came up today that I have wondered about for a while: how does break and evaluate work in PeopleCode? I think I have been telling it wrong, so I decided to do a little experiment.

Note: This test uses the Unit Test Framework.

In my first series of tests, I wanted to know if the “break” is required.

import TTS_UNITTEST:TestBase;

class EvalTest extends TTS_UNITTEST:TestBase
   method EvalTest();
   method Run();
end-class;

method EvalTest
   %Super = create TTS_UNITTEST:TestBase("TestBaseTest");
end-method;

method Run
   /+ Extends/implements TTS_UNITTEST:TestBase.Run +/
   
   Local string &testVal = "one";
   
   %This.Msg("Test 1");
   Evaluate &testVal
   When = "one"
   When = "two"
      %This.Msg("In eval for 'one' and 'two'");
   When = "three"
      %This.Msg("In eval for 'three'");
   End-Evaluate;
   
   %This.Msg("Test 2");
   Evaluate &testVal
   When = "one";
   When = "two";
      %This.Msg("In eval for 'one' and 'two'");
   When = "three";
      %This.Msg("In eval for 'three'");
   End-Evaluate;
   
   %This.Msg("Test 3");
   Evaluate &testVal
   When = "one"
   When = "two"
      %This.Msg("In eval for 'one' and 'two'");
      Break;
   When = "three"
      %This.Msg("In eval for 'three'");
      Break;
   End-Evaluate;
   
end-method;

Here’s the output:

Test 1
In eval for 'one' and 'two'
Test 2
Test 3
In eval for 'one' and 'two'

Most importantly, notice that test 1 and test 2 behave exactly the same way. So, the “break” doesn’t seem to make any difference.

Secondly, the semicolons on the “when” lines do make a big difference. Two “when” lines one after another make for an either/or effect. But, if you put a semicolon afterward, PeopleCode interprets that as a statement and breaks the either/or.

Exploring the syntax, I found that the “=” sign is not required. This works just as well:

   Local string &testVal = "one";
   
   %This.Msg("Test 1");
   Evaluate &testVal
   When "one"
   When "two"
      %This.Msg("In eval for 'one' and 'two'");
   When "three"
      %This.Msg("In eval for 'three'");
   End-Evaluate;

Here’s another series of examples that proves that you can use more than just the “=” sign. It also shows that two “when” clauses perform the logical “or” operation. I don’t think there is a way to do an “and”.

   
   Local number &testVal = 10;
   
   %This.Msg("Test 1");
   Evaluate &testVal
   When > 5
   When < 11
      %This.Msg("In eval for '> 5' and '< 11'");
   When = 100
      %This.Msg("In eval for '= 100'");
   End-Evaluate;
   
   
   %This.Msg("Test 2");
   Evaluate &testVal
   When > 5
   When < 2
      %This.Msg("In eval for '> 5' and '< 2'");
   When = 100
      %This.Msg("In eval for '= 100'");
   End-Evaluate;

Here’s the output:

Test 1
In eval for '> 5' and '< 11'
Test 2
In eval for '> 5' and '< 2'

I did find a situation where the break does make a difference! If the condition can match multiple “when” clauses, it does make a difference.

   
   Local number &testVal = 10;
   
   %This.Msg("Test 1");
   Evaluate &testVal
   When > 5
      %This.Msg("In eval for '> 5'");
   When < 100
      %This.Msg("In eval for '< 100'");
   End-Evaluate;
   
   %This.Msg("Test 2");
   Evaluate &testVal
   When > 5
      %This.Msg("In eval for '> 5'");
      Break;
   When < 100
      %This.Msg("In eval for '< 100'");
      Break;
   End-Evaluate;

Here’s the output:

Test 1
In eval for '> 5'
In eval for '< 100'
Test 2
In eval for '> 5'

And, we can’t forget the other clause.

   
   Local number &testVal = 2;
   
   %This.Msg("Test 1");
   Evaluate &testVal
   When > 5
      %This.Msg("In eval for '> 5'");
   When > 100
      %This.Msg("In eval for '> 100'");
   When-Other
      %This.Msg("Other!");
   End-Evaluate;
   
   
   %This.Msg("Test 2");
   Evaluate &testVal
   When > 1
      %This.Msg("In eval for '> 5'");
   When > 100
      %This.Msg("In eval for '> 100'");
   When-Other
      %This.Msg("Other!");
   End-Evaluate;

Here’s the output:

Test 1
Other!
Test 2
In eval for '> 5'

Leave a Comment

Your email address will not be published. Required fields are marked *