Page 1 of 1

Bind to array element?

Posted: Wed Feb 11, 2015 3:41 pm
by jwurst
Is it possible to bind to an array element instead of to an individual field?

I have a situation where I need a horizontal row of fields. Since I can't have a horizontal subfile, these have all become individual fields. There are 4 x 20 fields, each with a bunch of display attributes. The program behind will load and processing everything using arrays. I'd really like to bind directly to the array elements.

Fortunately RPG allows arrays to be associated with data structures, making use of individual fields feasible, but I'm hoping for a more elegant solution. Any ideas?

Re: Bind to array element?

Posted: Wed Feb 11, 2015 4:39 pm
by Scott Klement
Jeff,

Open Access works by creating a DDS-defined record layout that's used to communicate between an RPG program and the Profound UI handler. So when you're defining the field in the binding dialog, you're not really defining it directly in your RPG program, instead you're defining it in a DDS-described display file object.

DDS does not have the concept of arrays. Therefore, we can't possibly support them directly in a binding dialog. (Just like in green-screen...)

The trick that people have used for this sort of thing is to define the DDS fields like MYFIELD01, MYFIELD02, MYFIELD03, etc and then overlay them with an array in your RPG program. (Which, I think is what you're already doing if I understand correctly.)

That's about the best way I can think of.

Re: Bind to array element?

Posted: Wed Feb 11, 2015 6:04 pm
by jwurst
Thanks. Its good to know whats possible.

I've been working on this all afternoon, struggling because some properties only allow me to bind to indicators. I have 20 fields in my on-screen field array. I needed 80 indicators in 4 groups of 20. I found a nice workaround that I think would work for any output property, not just for indicators.
I have 20 fields so I define a field that is 20 characters long and associate it with a data structure in the RPG code.
I bind that char(20) field to a single field on the screen and then in my screen's onload I run this:

Code: Select all

var str = getElementValue("RIListFld");
var riid = "";
for (i = 0; i < 20; i++) { 
   riid = str.substring(i,i+1);
   if(riid=='1') {
      applyProperty("rsls"+(i+1),"css class 2","RI");
   }
}
In the RPG:

Code: Select all

d  RIList                 1     20    dim(20)
d  RIListFld              1     20           
"rsls" is the prefix on the 20 fields (rsls1, rsls2, ..., rsls20)
In the program all I have to do is say "eval RIList(x) = *on" to set one of these fields to reverse image.

Re: Bind to array element?

Posted: Wed Feb 11, 2015 6:21 pm
by Scott Klement
That should work just fine.

I don't think CSS class has to be an indicator, though? So another possibility would be to bind each field's CSS class to something like rslsCSS01, rslsCSS02, rslsCSS03, etc. Then you could overlay the rslsCSSxx with an array in RPG, and just assign "RI" to the ones where you want reverse image, or *BLANKS to the others. That would eliminate the need for special Javascript.

Re: Bind to array element?

Posted: Thu Feb 12, 2015 10:43 am
by jwurst
You're right. Its only "read only" and "set focus" that I am otherwise stuck with indicators on.

But it seems focus isn't working. I tried a slightly different method for that one. I tried sending the name of the field to receive focus over in a bound field.

Code: Select all

var focusid = getElementValue("FocusID");
if(focusid.trim().length > 0) {
  getObj(focusid).select();
}
But this isn't working. Neither does
getObj(focusid).focus();
Nor
applyProperty(focusid,"set focus","true");
It seems like something is grabbing focus after "onload" runs. This works if I try it in a button click event.

Re: Bind to array element?

Posted: Thu Feb 12, 2015 11:06 am
by Scott Klement
Yes, the onload runs after we've built the screen but before we show it to the user. Obviously, we need to do the 'set focus' at the time that we show the display to the user, so your code will end up running before ours does -- and the focus won't be set.

We could look into, perhaps, fixing it so tht applyProperty() would work here, but I don't think there's much we can do about .focus() or .select(), just because of the timing of it.

If you think we should look into updating applyProperrty() so you can set the focus this way, please start a support ticket on this by e-mailling support@profoundlogic.com.

Re: Bind to array element?

Posted: Thu Feb 12, 2015 2:00 pm
by Scott Klement
Also, keep in mind that when it says "indicators", it doesn't necessarily mean "numbered indicators".

So you could have indicators named "focus01", "focus02", "focus03", and could overlay these with an array in your RPG program.