Page 1 of 2

Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 1:19 pm
by DanD
I have a Rich Display that staff in our warehouse uses to create ASNs (EDI Advance Ship notifications) & corresponding carton labels.

I'm running into an issue where when the users sort the data in the grid in a certain way, they expect the output for the ASN labels to be created in the same fashion.

Ideally before the customer hits the button to return control back to the RPG program for processing, I'd like to read thru the grid in the order that it is displayed to the user & populate a hidden field in each row of the grid to store the corresponding grid line number (similar to RRN - only in the order that the user sees the data).

Then in the back-end, I would use this hidden value to output the labels in the order that the user sees them.

I was wondering if anyone had a js example of reading thru a grid in the order that it is sorted on the screen.

Thanks

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 2:18 pm
by emhill
Someone correct my JavaScript here but try something like this:

====================
var data = getObj("your_grid");
var gridrec = data.grid.getRecordCount();

for (var i=1; i < gridrec + 1; i++) {
data.grid.setDataValue(i, "your_hidden_field", i);
}
====================
var "i" should equal the row number and that would be what you place in your hidden field.

Someone please correct me if I'm leading Dan astray!!!!

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 3:00 pm
by Scott Klement
Eric's answer makes sense. I didn't test it, though.

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 3:22 pm
by DanD
Thank you Eric & Scott.

I was thinking more about this & was thinking that I could utilize the grid's rowNumber functionality/keyword that ProfoundUI has as part of the loop.

However, the solution that Eric came up with seems more straight-forward.

I'll let you know if I encounter any issues.

-Dan

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 5:20 pm
by DanD
I may be having a denser-than-normal moment - I'm stumped & am hoping that someone can find an error in my logic.

My grid has an ID of s1_items
One of the fields within the grid has the following properties:

id: s1_sortedRow
widget type: textbox
value: s1_sortrow (bound as a data type decimal with length of 5, 0)

I cannot get the s1_sortrow to be passed back to the RPG. I was debugging the program in RPG & always receiving a 0 for each s1_sortrow when I was watching the variable. Then I realized that I wasn't actually using the variable within the program & perhaps the program was compiled not to show unreferenced data items. Added dsply s1_sortrow;

Problem still persists.

I tried this as Eric originally referenced & then slightly redid it - same results.

This is my on-click event (pui.click is referenced because there is a variable in the response field)

Code: Select all

console.log('Here');
setTimeout(function() {
  var myGrid  = getObj("s1_items");
  var gridrec = myGrid.grid.getRecordCount();

  for (var i=1;i<=gridrec;i++) {
    console.log(i);
    myGrid.grid.setDataValue(i, "s1_sortrow", i);
  }
},20);

pui.click(this,true);
I then seemed to remember that the variable name may need to be referenced in upper case - so tried this:

Code: Select all

console.log('Here');
setTimeout(function() {
  var myGrid  = getObj("s1_items");
  var gridrec = myGrid.grid.getRecordCount();

  for (var i=1;i<=gridrec;i++) {
    console.log(i);
    myGrid.grid.setDataValue(i, "S1_SORTROW", i);
  }
},20);

pui.click(this,true);
I'm sure that I'm missing something obvious - just hoping that a second set of eyes can see it.

Thanks
-Dan

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 5:35 pm
by Scott Klement
It is not valid to have both an 'onclick' event and also have a variable bound to the response property. You can't do both on the same button.

Instead, you should consider having a separate (hidden) button with the response property bound, and use pui.click() to click that separate button when you're done with your onclick event.

Another problem with your code is that you're running the grid row stuff in a timeout. That means its going to run AFTER the pui.click(), which means the values are unlikely to be sent to the server. (Or best case scenario, it becomes a 'race condition' where its a race to see whether the timeout or the pui.click completes first, possibly resulting in only some of the values being set before the screen is submitted... which wouldn't be good, either.)

Can you explain why this is in a timeout?

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 6:11 pm
by emhill
Dan,

Your element name in the setDataValue needs to match exactly as it is defined in the "id" entry in the properties.

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Wed Dec 11, 2019 6:28 pm
by Scott Klement
Eric,

grid.setDataValue() takes a bound field name (not an element name or "id" property) as its parameter. The setDataValue() API will automatically convert whatever you pass to uppercase for you, so its not required that you type the parameter in all uppercase.
https://docs.profoundlogic.com/x/fwCQAQ

The part that corresponds to the 'id' property is the part that's passed to getObj() -- and you're right that it is case-sensitive and must match exactly.

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Thu Dec 12, 2019 10:20 am
by emhill
Thanks for the clarification, Scott!!!!

Re: Identifying row in a grid by the way the user sorts in RPG

Posted: Thu Dec 12, 2019 11:24 am
by DanD
Another problem with your code is that you're running the grid row stuff in a timeout.
Can you explain why this is in a timeout?
Yes - ignorance on my part... :-) There have been numerous occasions where I had unexpected results when working with grids. More often than not, when I sent the suspect code in question to support, I was instructed to put it in a timeout.

In this case, when running my program thru debug when testing the js that Eric provided, my variable wasn't getting populated in the RPG. So I thought that I'd try a timeout.
I cannot get the s1_sortrow to be passed back to the RPG. I was debugging the program in RPG & always receiving a 0 for each s1_sortrow when I was watching the variable. Then I realized that I wasn't actually using the variable within the program & perhaps the program was compiled not to show unreferenced data items.
It turns out that the issue I was experiencing did indeed have to do with the s1_sortrow being unreferenced in the program. When I removed the timeout & added in dsply s1_sortrow; into the program, I now get the desired results (as opposed to simply setting a breakpoint & doing an eval on s1_sortrow, which because it wasn't referenced, showed 0). Had I realized this initially, I wouldn't have added the timeout.

So problem seems to be resolved. Thank you again Eric & Scott - sorry for wasting your time with an error on my part.

And as an aside,
It is not valid to have both an 'onclick' event and also have a variable bound to the response property. You can't do both on the same button.
Just wanted to make you aware that I've done this with a few of my screens in the past - and by following the logic in documentation, it seems to work appropriately. If both response & onclick defined, onclick takes precedence & response ignored by default. Passing true as an optional parameter within pui.click causes the response to be triggered & ignores the onclick. Therefore, passing pui.click(this, true) will force the response to run instead of the onclick - so when run within the onclick, it works.

https://docs.profoundlogic.com/pages/vi ... Id=3276856

Thank you again for your assistance.
-Dan