Thursday, April 8, 2021

Two ways to fetch the current records (Interactive Grid #10)


Last but not least tip no. 10!

#10 Two ways to fetch the current records

This will be the last blog in the series for now, but no less interesting than the others :-)

In this entry, we want to show how you can fetch the records of an interactive grid in two different ways. 
The first method is using a JavaScript function, as the second method we employ a PL/SQL function. Both are easy to implement. You can determine your approach depending on what you want to do with the data. Personally, I prefer PL/SQL and avoid JavaScript code whenever it´s possible but every developer thinks differently here :-)

Let's have a closer look at how we can do this.

1) Fetch records via JavaScript 

We start with a new application or page where we will add an interactive grid. In our example we use the table "EMP" as source. Then we give the Interactive Grid a Static ID, for example "my_ig". In our case we only want to fetch the values of the "EMPNO" column and save them in a page item. This is a very basic example, but it suffices to show how it works. Next we need a page item that we call "P1_EMPNO_JS". When that is done, we add a Dynamic Action and set the following:
  • Event: 'Page change (Interactive Grid)'
  • Selection type: 'Region' 
  • Region: 'The Interactive Grid you add to the page'
The Dynamic Action is fired every time the selection of the Interactive Grid changes. We can also use a button or some other DA event. The final thing we need is a 'True' action that executes JavaScript Code. Here we enter the following JavaScript function:

var l_empno;
// fetch the model for the interactive grid
var model = apex.region("my_ig").widget().interactiveGrid("getViews""grid").model;

// loop through the records
model.forEach(function(igrow) {
   if(l_empno == null){
       // first row without seperator ":"
       l_empno = igrow[model.getFieldKey("EMPNO")];
   else {
       // add seperator ":" to each additional row
       l_empno = l_empno + ':' + igrow[model.getFieldKey("EMPNO")];

// Set Page Item
apex.item"P1_EMPNO_JS" ).setValue (l_empno);

What we are doing here is getting the model of the Interactive Grid, and looping through each row and writing the value of "EMPNO" to a variable. At the end we store the result of the variable in a page item.

That´s it ;-)

2) Fetch records via PL/SQL 

In our second example we use the same Interactive Grid as before. We need a second Page Item, which we call "P1_EMPNO_SQL", and another Dynamic Action, which, as in the previous example, is also fired on a "Page change (Interactive Grid)" event. For the DA we need a 'True' action that executes PL/SQL code and enter the following:

    l_region_id number;
    l_context   apex_exec.t_context
    l_empno_ids number
    l_empno     varchar2(1000 CHAR);
    -- Get the region id for the IG
    select region_id
      into l_region_id
      from apex_application_page_regions
     where application_id = :APP_ID
       and page_id        = :APP_PAGE_ID
       and static_id      = 'my_ig';

    -- Get the query context for the IG
    l_context := apex_region.open_query_context (
                        p_page_id => :APP_PAGE_ID,
                        p_region_id => l_region_id );

    -- Get the column positions for column(s)
    l_empno_ids := apex_exec.get_column_position( l_context, 'EMPNO' );

    -- Loop through the query of the context
    while apex_exec.next_row( l_context ) loop 
        if l_empno is null then
            -- first row without seperator ":"
            l_empno := apex_exec.get_number( l_context, l_empno_ids );
            -- add seperator ":" to each additional row
            l_empno := l_empno || ':' || apex_exec.get_number( l_context, l_empno_ids );
        end if;    
    end loop;
    -- Set Page Item
    :P1_EMPNO_SQL := l_empno;

    -- Close query context
    apex_exec.close( l_context );
      when others then        
        apex_exec.close( l_context );

What we're doing here is the same process as before in our JavaScript function. We get the query context of the Interactive Grid, loop through each row and write the value "EMPNO" to a variable. Some APEX APIs are used to achieve this, which will not be described in further detail here, but we are going to have a closer look at them in future blogs, so keep an eye out.

The examples here are very basic but show what can be achieved with a bit of customization. You can do a lot this way, for example fetching the records of the IG in order to insert or update data in this or another table. Using the JavaScript approach, it is possible to make your page more interactive, for example to show or hide regions/items/buttons based on the selected data. 

Feel free to let us know if these tips and tricks helped you. 
If you have questions or suggestions, please leave us a comment ;-)

Here is the demo app for reference.


Labels: , ,


At April 9, 2021 at 2:05 AM , Blogger thoughts said...

Excellent! This is very helpful and well written.

At March 3, 2022 at 5:56 PM , Anonymous Anonymous said...

Help full on Apex 21.1 :)

At May 28, 2022 at 5:32 PM , Anonymous Anonymous said...

Awesome bro. Love you.

At June 15, 2022 at 11:14 AM , Blogger Daniel Borgstrom said...

I doubt this will work on an interactive grid if you update och add rows. Interactive report yes, but interactive grid no.

At October 18, 2022 at 1:52 PM , Anonymous Anonymous said...

I tried your demo app to make sure I understood these techniques. Unfortunately, pages 8-10 of the demo app return a "400 Bad Request" error. Hopefully this is an easy fix.

Thanks for providing these posts.

At December 15, 2022 at 1:36 PM , Anonymous Anonymous said...

How to assign some pre define rows to an interactive grid through database ?


Post a Comment

Note: Only a member of this blog may post a comment.

Subscribe to Post Comments [Atom]

<< Home