9

I am quite confused with how Oracle apex_application.gfnn works and whether it only works for standard SQL reports in Oracle ApEx or only with SQL (Updateable reports, i.e. tabular forms).

Basically I am trying to achieve the following using this sample SQL, which is just a Standard SQL Report but I'm unsure if what I am trying to achieve is possible with this type or report, i.e.:

select id,
       name,
       telephone,
       apex_item.checkbox2(10,id) as "Tick when Contacted",
       apex_item.text(20,my_date) as "Date Contacted",
       apex_item.textarea(30,my_comment,5,80) as "Comment"
from   my_table

Based on the above SQL, assume this SQL query returns 10 rows. Now using checkbox as my driving id, I tick the checkbox of all odd records/rows, i.e. rows 1,3,5,7,9 and for each of these rows, I also enter a date value (f20) together with a comment (f30)

Keeping this in mind, I then want to created a page process that is called when the user presses the "Save" button that will iterate through these checked rows and store for each record, my date and my comment but only for the rows that I have selected.

So based on the above, I would expect to have 5 news rows in my table with the following columns:

ID      MY_DATE      MY_COMMENT
1       26/08/2012   Comment A
3       27/08/2012   Comment B
5       28/08/2012   Comment C
7       29/08/2012   Comment D
9       30/08/2012   Comment E

Unfortunately I am unsure how to achieve this using apex_application.G_F10.COUNT.

I want to be able to access the content of each of these array elements (f20) and f(f30) for each row that I have ticked the checkbox with.

Is this possible or have I misunderstood how apex_application.G_Fnn works? If this is not possible, how I can achieve this? Do I need a tabular report?

halfer
  • 19,824
  • 17
  • 99
  • 186
tonyf
  • 34,479
  • 49
  • 157
  • 246
  • Tonsils, your new question http://stackoverflow.com/q/12163564/814048 made me realize i made a very stupid mistake in my code. I amended my answer. Sorry about that. – Tom Aug 29 '12 at 07:30
  • Hi Tom - no problems. Appreciate that you amended your answer, also much clearer now. I will keep this mind when I need to use a checbox scenario again. BTW, does this amended answer relate to a tabular SQL Updateable SQL report or just a standard report? – tonyf Aug 29 '12 at 14:27
  • Depends what you mean with standard report! For a tabular form: definitely yes since that is the kind we're working with here. – Tom Aug 29 '12 at 15:13

1 Answers1

11

You're very close.

select apex_item.checkbox2(10, empno) select_me,
apex_item.text(20, empno) empno,
apex_item.text(30, ename)||apex_item.hidden(50, empno) ename
from emp

I'm concatenating the hidden item since i don't want it in its own column. Messes with the layout.
Also, the hidden item is there because of how checkboxes work. Checkboxes only submit their values for checked items. This would mean that array 10 has 3 values. The other arrays would still contain the values for all rows.
This is why i added the hidden empno again: so we can match the checked values to the other rows.

On submit process:

DECLARE
   v_empno emp.empno%TYPE; 
   v_ename emp.ename%TYPE;
BEGIN
   --f10: checkbox
   --f20: empno
   --f30: ename
   --f50: empno again
   for i in 1..apex_application.g_f10.count
   loop
      for j in 1..apex_application.g_f50.count loop
         if apex_application.g_f10(i) = apex_application.g_f50(j) 
         then         
            -- access values for the selected rows in the other arrays
            v_empno := apex_application.g_f20(j);
            v_ename := apex_application.g_f30(j);

            apex_debug_message.log_message('Employee: '||v_empno||' - '||v_ename);
         end if;
      end loop;
   end loop;
END;

Run page, enable debug, select records 2, 4 and 6, submit.

record selection and query output

Debug output:

debug output: BLAKE, JONES, FORD

All you now need to do is put your processing in that loop.

Tom
  • 6,988
  • 1
  • 26
  • 40
  • Thanks again Tom but just want to confirm something and may throw a spanner in the works, but with regards to f20 and f30, assume f20 is a date field that a user actually types in and not from a database table column, together with f30, which is a textarea field that a user can enter a comment in and again is not from a database table column. Will your processing still work for this scenario or are changes required? – tonyf Aug 27 '12 at 13:31
  • It depends on what you mean actually: if you plan on using the standard multi-row processing that you'd use for a standard tabular form: you can't. Also, with manual tabular forms you can't have tabular form validations (declared ones in the validations processing point). You also do not get checksumming and optimal locking, which are important in systems with concurrent users. – Tom Aug 27 '12 at 13:47
  • Oh and hey, you could use apex_item.date_popup2 for a date field! – Tom Aug 27 '12 at 13:54
  • So Tom, based on what you have stated, how would you go about doing what I am after for f20 and f30 fields which are manually entered? Would you use an apex_collection to store these fields or some other means? Thanks. – tonyf Aug 27 '12 at 13:59
  • It of course depends on your specs what you could and may do or where there is some wiggle-room. If you'd stay this course you'll need to write validation for these fields, no way around that. The dates could be a pain though. Using a datepicker might alleviate, but you'll still need to do a TO_DATE somewhere and process the error, and output them. Same for the textarea. I'd advise processing these in a seperate process than your actual updating. Abort processing when a validation error occurs. – Tom Aug 27 '12 at 14:20
  • Tom from 'Ask Tom'? You gotta listen to this guy. – ecruz Mar 15 '13 at 18:56
  • Unfortunately, I'm not Thomas Kyte from Ask Tom, but I try my hardest ;) – Tom Mar 15 '13 at 19:31
  • Perfect, exactly what I was searching for! May I quickly ask if there is any limit to the amount of numbers used in the g_fnn? – Moptan Aug 23 '16 at 12:54
  • @Moptan there are only arrays f01 through f50 for use during submit (and some additional ones but details, focus on these). You can just fill those out and go ahead. You may run into some trouble if the total amount of data sent goes over a certain threshold but can't confirm - just don't run into that :) – Tom Aug 23 '16 at 13:08