Thursday, 28 June 2012
Text Area with Character Counter in a Tabular Form
This small example shows how to create a textarea in a tabular form with a character counter, similar to the one for the page item of type "Textarea":
http://apex.oracle.com/pls/otn/f?p=31517:276
APEX Tabular Form and ORA-01403: no data found
If you get the "ORA-01403: no data found" error after running your code while updating or validating a tabular form, you will need to find out which array is causing it. This error occurs if the referenced array does not exist - apex_application.g_f01..g_f50. For example, if you use a PL/SQL block similar to this:
1. Firefox
2. Firebug
Activate the firebug and use the HTML option to go over the elements (columns) in your tabular form. Firebug will show the associated array number and you can use that information to correct you code.
DECLARE vrow BINARY_INTEGER; BEGIN FOR i IN 1 .. apex_application.g_f01.COUNT LOOP vrow := apex_application.g_f01 (i); UPDATE dept SET dname = apex_application.g_f04 (vrow), loc = apex_application.g_f05 (vrow) WHERE empno = apex_application.g_f02 (vrow); END LOOP; END;The easiest way to debug is to use:
1. Firefox
2. Firebug
Activate the firebug and use the HTML option to go over the elements (columns) in your tabular form. Firebug will show the associated array number and you can use that information to correct you code.
Sunday, 24 June 2012
Comparing Strings
I just received an interesting question regarding report filtering. The problem was the following:
1. There was a checkbox with multiple choices in the form.
2. The data would be saved as a concatenated string of values (String1:String2:String3).
3. The problem was in filtering that column since the filter would also be the same checkbox containing multiple values.
The solution for that is quite simple. All you need to do is to create a function which will compare the two strings and return something if it finds a match.
CREATE OR REPLACE FUNCTION compare_checkbox_strings ( p_checkbox IN VARCHAR2, p_column IN VARCHAR2 ) RETURN NUMBER IS l_vc_arr2 apex_application_global.vc_arr2; v_count NUMBER; BEGIN l_vc_arr2 := apex_util.string_to_table (p_checkbox); FOR i IN 1 .. l_vc_arr2.COUNT LOOP EXIT WHEN v_count > 0; v_count := INSTR (':' || p_column || ':', ':' || l_vc_arr2 (i) || ':'); END LOOP; IF v_count > 0 THEN RETURN 1; ELSE RETURN 0; END IF; END compare_checkbox_strings;Now, you can use it in your SQL Query like this:
SELECT * FROM your_table WHERE compare_checkbox_strings (:p1_your_checkbox, your_column) = 1;You can find a working example here: http://apex.oracle.com/pls/otn/f?p=31517:275
Monday, 18 June 2012
BLOB over DB Link
Using a DB Link to query BLOB's from a remote database could be a problem. Recently, I had to show images comming from a remote server in an APEX application. Selecting from a remote table would result in an error. Creating a copy of the remote table by issuing the following statement worked without any problems:
After searching for a solution I found an interesting way to get it working:
Jiri's Microblog
Basically, all you need to do is to:
1. create a local copy of the table you get the data from as
2. create two types for storing the information
3. create a pipelined function to get the required row
Now, selecting from the function using the following SQL:
will get that BLOB for you.
INSERT INTO dbt_images SELECT * FROM dbt_images@remote_db WHERE ID = p_id;
After searching for a solution I found an interesting way to get it working:
Jiri's Microblog
Basically, all you need to do is to:
1. create a local copy of the table you get the data from as
CREATE TABLE dbt_images AS SELECT * FROM dbt_images@remote_db WHERE 1 = 2;
2. create two types for storing the information
CREATE OR REPLACE TYPE object_row_type AS OBJECT ( ID NUMBER, NAME VARCHAR2 (256), image BLOB, creator NUMBER, created DATE ); /
CREATE OR REPLACE TYPE object_table_type AS TABLE OF object_row_type; /
3. create a pipelined function to get the required row
CREATE OR REPLACE FUNCTION get_remote_blob (p_id IN NUMBER) RETURN object_table_type PIPELINED IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO dbt_images SELECT * FROM dbt_images@remote_db WHERE ID = p_id; COMMIT; FOR cur IN (SELECT ID, NAME, image, creator, created FROM dbt_images) LOOP PIPE ROW (object_row_type (cur.ID, cur.NAME, cur.image, cur.creator, cur.created )); END LOOP; DELETE FROM dbt_images WHERE ID = p_id; COMMIT; RETURN; END get_remote_blob; /
Now, selecting from the function using the following SQL:
SELECT ID, image, NAME, DBMS_LOB.getlength (image) FROM TABLE (getblob (p_id));
will get that BLOB for you.
Subscribe to:
Posts (Atom)