A multi-level rowset is one that has a parent-child-grandchild relationship structure. Such rowsets can be really handy when you need to emulate the structure of the component buffer (scroll levels).
For this example I'm going to use a structure based on PeopleTools security - the
USER_ROLES page in the
USERMAINT component which is located at:
The reason I'm using PeopleTools security is that it is available for all PeopleSoft applications (HRMS, Campus Solutions, Finance etc).
A simplified version of the scroll structure in the USER_ROLES page is:
+ Level 0: Operator ID (PSOPRDEFN) - Level 1: Role (PSROLEUSER_VW)
What I want is to create a rowset that emulates this scroll structure so that I can store the roles a particular user may have.
The first step is to declare the rowsets and use an appropriate naming convention and suffix with the scroll level which I makes sense:
Local Rowset &rsUser0; Local Rowset &rsRoles1; Local Rowset &rsUserRoles;
&rsUser0 is for
&rsRoles1 is for
&rsUserRoles is the multi-level rowset with the structure we want.
Now we need to create the standalone rowsets for level 0 and level 1 in our scroll structure:
&rsUser0 = CreateRowset(Record.PSOPRDEFN); &rsRoles1 = CreateRowset(Record.PSROLEUSER_VW);
Finally we can create the multi-level rowset:
&rsUserRoles = CreateRowset(&rsUser0, &rsRoles1);
This gives us a rowset where each user (operator ID) can have one or more roles. In our example, we could then populate the standalone rowset from the component buffer like so:
Local Rowset &rs0; &rs0 = GetLevel0(); &rs0.CopyTo(&rsUserRoles);
You might have a case where you want multiple children at a scroll level. Here's another example using the
PSOPRALIAS page on the
The structure this time is:
+ Level 0: PSOPRDEFN - Level 1: PSOPRALIAS + Level 1: PSOPRALIASTYPE - Level 2: PSORPALIASFIELD
Now we have three scroll levels and two children at the same scroll level (scroll 1 has
Once again we start with the standlone rowsets for each record in the scroll structure. However this time, using a bottom-up approach we link the lower scroll levels to the higher scroll levels as follows:
Local Rowset &rsUser0, &rsAlias1, &rsAliasType1, &rsAliasField2; &rsAliasField2 = CreateRowset(Record.PSOPRALIASFIELD); &rsAliasType1 = CreateRowset(Record.PSOPRALIASTYPE, &rsAliasField2); &rsAlias1 = CreateRowset(Record.PSOPRALIAS, &rsAliasType1); &rsUser0 = CreateRowset(Record.PSOPRDEFN);
Now to create the multilevel rowset.
Local Rowset &rsUserAlias; &rsUserAlias = CreateRowset(&rsUser0, &rsAlias1);
When you are referencing anything below scroll 0, you need to use the same syntax as you would when populating a rowset from the component buffer.
For example, if I wanted to populate the
PSOPRALIAS (scroll 1) of the
&rsUserAlias multilevel rowset with the Rowset fill method (for standalone rowsets) for just the
PS user, the code would look like this:
&rsUserAlias(1).GetRowset(Scroll.PSOPRALIAS).Fill("where OPRID = 'PS'");
The same applies for getting to a particular field. For example, say I wanted to message out the field
PSOPRALIAS.OPRALIASTYPE. This would be the code to use with the
&rsUserAlias multilevel rowset:
MessageBox(0, "", 0, 0, "Operator Alias Type = " | &rsUserAlias(1).GetRowset(Scroll.PSOPRALIAS)(1).PSOPRALIAS.OPRALIASTYPE.Value);
Getting information out of the multilevel rowset still provide the same challenges though. Which is why you might want to create scroll level rowsets that reference scroll levels on your multilevel rowset. The previous examples can be simplified this way by creating
&rsUserAlias1 which references the
PSOPRALIAS scroll at level 1 on the
&rsUserAlias multilevel rowset.
Local Rowset &rsUserAlias1; &rsUserAlias1 = &rsUserAlias(1).GetRowset(Scroll.PSOPRALIAS); MessageBox(0, "", 0, 0, "Operator Alias Type = " &rsUserAlias1.PSOPRALIAS.OPRALIASTYPE.Value);
Remember, when it comes to rowsets, its all about context!