APEX_ITEM and Beyond. Greg Jarmiolowski. SQLPrompt LLC

Similar documents
& ( ); INSERT INTO ( ) SELECT

Going to the Grid: What the APEX 5.1 Interactive Grid Means or You and Your Users. Karen Cannell

Course Overview. Copyright 2010, Oracle and/or its affiliates. All rights reserved.

Grid Essentials. APEX 18.1 Interactive Grids. Karen Cannell TH Technology

ORACLE: PL/SQL Programming

Application Express Dynamic Duo

Refactoring Application Express Greg Jarmiolowski SQLPrompt LLC

Database Developers Forum APEX

Oracle Database 11g: SQL and PL/SQL Fundamentals

AJAX with APEX. For More Information:

SQL STORED ROUTINES. CS121: Relational Databases Fall 2017 Lecture 9

Oracle Database: SQL and PL/SQL Fundamentals NEW

Review -Chapter 4. Review -Chapter 5

Oracle Database: SQL and PL/SQL Fundamentals Ed 2

5. Single-row function

CERTIFICATE IN WEB PROGRAMMING

ORACLE VIEWS ORACLE VIEWS. Techgoeasy.com

Hyperion Interactive Reporting Reports & Dashboards Essentials

Oracle Database 11g: SQL Tuning Workshop

Secure your APEX application

Using SQL with SQL Developer 18.2

IBM DB2 UDB V7.1 Family Fundamentals.

DB2 UDB: Application Programming

Oracle. SQL(Structured Query Language) Introduction of DBMS. Build In Function. Introduction of RDBMS. Grouping the Result of a Query

EDUVITZ TECHNOLOGIES

Teradata SQL Features Overview Version

UNIT 2 Set Operators

A Unit of SequelGate Innovative Technologies Pvt. Ltd. All Training Sessions are Completely Practical & Real-time

Utilising the data attribute. adding client side behaviour in Oracle APEX

Manipulating Database Objects

<Insert Picture Here>

Introduction to Computer Science and Business

Concepts of Database Management Eighth Edition. Chapter 2 The Relational Model 1: Introduction, QBE, and Relational Algebra

SQL: The Sequel. Phil Rhodes TAIR 2013 February 11, Concurrent Session A6

ADVANTAGES. Via PL/SQL, all sorts of calculations can be done quickly and efficiently without use of Oracle engine.

Oracle Database: Introduction to SQL Ed 2

Oracle Syllabus Course code-r10605 SQL

Oracle Application Express 5 New Features

COURSE OUTLINE: Querying Microsoft SQL Server

Querying Microsoft SQL Server 2012/2014

Database Systems: Design, Implementation, and Management Tenth Edition. Chapter 8 Advanced SQL

ORACLE TRAINING CURRICULUM. Relational Databases and Relational Database Management Systems

Optional SQL Feature Summary

Order Management Defaulting Rules reduce the amount of data input required when entering orders or returns.

MySQL for Developers with Developer Techniques Accelerated

1Z0-144 Q&As Oracle Database 11g: Program with PL/ SQL

20461: Querying Microsoft SQL Server 2014 Databases

Oracle Developer Track Course Contents. Mr. Sandeep M Shinde. Oracle Application Techno-Functional Consultant

SIT772 Database and Information Retrieval WEEK 6. RELATIONAL ALGEBRAS. The foundation of good database design

Global Variables Interface

Oracle APEX 19.1 The Golden Nuggets. Dietmar Aust Opal-Consulting, Köln

Table of Contents. Oracle SQL PL/SQL Training Courses

Database Systems: Design, Implementation, and Management Tenth Edition. Chapter 8 Advanced SQL

Oracle Database: SQL and PL/SQL Fundamentals

Sql Server Syllabus. Overview

Governance, Risk, and Compliance Controls Suite. Preventive Controls Governor Flow Rules User s Guide. Software Version

After completing this course, participants will be able to:

JavaScript Specialist v2.0 Exam 1D0-735

JavaScript Functions, Objects and Array

1 Prepared By Heena Patel (Asst. Prof)

Oracle Application Express 5.1

I, J, K. Eclipse, 156

Chapter 13 Introduction to SQL Programming Techniques

CMP-3440 Database Systems

MANAGING DATA(BASES) USING SQL (NON-PROCEDURAL SQL, X401.9)

AVANTUS TRAINING PTE LTD

Oracle APEX 5.2 / The Golden Nuggets. Dietmar Aust Opal-Consulting, Köln

Oracle Education Partner, Oracle Testing Center Oracle Consultants

SQL is an English like language consisting of commands to store, retrieve, maintain & regulate access to your database.

SQL User Defined Code. Kathleen Durant CS 3200

The NoPlsql and Thick Database Paradigms

Forms, Form Events, and Validation. Bok, Jong Soon

Querying Microsoft SQL Server

Copyright 2016 Ramez Elmasri and Shamkant B. Navathe

Querying Microsoft SQL Server 2008/2012

Database Technology. Topic 6: Triggers and Stored Procedures

Proje D2K. CMM (Capability Maturity Model) level Project Standard:- Corporate Trainer s Profile

Extend EBS Using Applications Express

Pl Sql Copy Table From One Schema To Another

APEX Shared Components. Aljaž Mali, Abakus Plus d.o.o.

Oracle Reports Developer 10g: Build Reports

Course Outline. MySQL Database Administration & Design. Course Description: Pre-requisites: Course Content:

CS Exam 1 Review Suggestions - Spring 2017

Querying Microsoft SQL Server

Oracle Application Express Workshop I Ed 2

Foreword Preface Db2 Family And Db2 For Z/Os Environment Product Overview DB2 and the On-Demand Business DB2 Universal Database DB2 Middleware and

Querying Data with Transact SQL

Course Details Duration: 3 days Starting time: 9.00 am Finishing time: 4.30 pm Lunch and refreshments are provided.

Introduction to Programming Using Java (98-388)

Exam Actual. Higher Quality. Better Service! QUESTION & ANSWER

Actual4Test. Actual4test - actual test exam dumps-pass for IT exams

Building Database-Centric Web Applications Using. Oracle HTML DB

When a database trigger routine does not have to take place before the triggering event, which timing should you assign to the trigger?

PHP & PHP++ Curriculum

Top 6 SQL Query Interview Questions and Answers

Course 20461C: Querying Microsoft SQL Server

QUERYING MICROSOFT SQL SERVER COURSE OUTLINE. Course: 20461C; Duration: 5 Days; Instructor-led

Table of Contents. PDF created with FinePrint pdffactory Pro trial version

An APEX Dashboard for Energy Trading

HTML Forms. By Jaroslav Mohapl

Transcription:

APEX_ITEM and Beyond Greg Jarmiolowski SQLPrompt LLC

Agenda Built-in Tabular Form Limitations Tabular Form Post Processing Built-ins Building Forms with APEX_ITEM Global Arrays Custom Post processing APEX_COLLECTIONS Validation Locking and Concurrency AJAX with Tabular Forms

What Are Tabular Forms Forms for editing multiple records at once Attribute pairs/many to many list management Questions and answers The detail for a master detail relationship

Example Form

How To Create A Tabular Form Wizard Tabular Form Element attributes of the report columns SQL Query (updatable report) SQL report using APEX_ITEM PL/SQL region using APEX_ITEM

Built-in Tabular Form Limitations Reasons for using the APEX_ITEM API Item types Checkboxes Radio Buttons Popup Key Very large list(s) of values Runtime item type determination Multiple tabular forms per page

APEX_ITEM Package Functions that return HTML input items Procedure for updating multiple records Checkbox Checksum Date Popup Display only Hidden Popup LOV Radiogroup Select List Text Textarea

How to Use APEX_ITEM SELECT APEX_ITEM.DATE_POPUP( 2, NULL, date_entered, MM/DD/YYYY )...

Post Processing APEX_ITEM.MULTI_ROW_UPDATE Takes an MRU string in the format: OWNER:TABLE:pk_col1,pk_idx:pk_col2,p_idx2 col,idx:col:idx.. Col is column name Idx is the number used in APEX_ITEM Can manipulate the posted values before processing

Post Processing Basics THE REPORT SQL SELECT apex_item.hidden(1, emp_id) emp_id, apex_item.text(2, emp_fname) emp_fname, apex_item.text(3, emp_lname) emp_lname FROM emp THE SUBMIT PROCESS BEGIN APEX_ITEM.MULTI_ROW_UPDATE( SCOTT:EMP:EMP_ID,1 EMP_FNAME,2:EMP_LNAME,3 ); END; Simple All or nothing

APEX Global Collections Each form element has an HTML name attribute Posted values are added to Nested Tables Called Global Arrays in some docs type vc_arr2 is table of varchar2(32767) index by binary_integer; Arrays are in package apex_application Named g_f01 to g_f50 plus g_fcs Correspond to g_ and the name attribute of the form element Helper utility prints matrix of posted arrays http://jornica.blogspot.com/2008/02/apexglobalarrays. html

SELECT apex_item.hidden(50, ROWNUM) AS row_number, apex_item.hidden(49, pk_column) AS pk Report Source SQL, apex_item.radiogroup(rownum, radio_value, selected_value, value_label) as radiobutton FROM wherever WHERE whatever Column Attributes Tables & Views APEX_ITEM API wwv_flow.accept Page Process

Processing Global Arrays BEGIN FOR i IN 1.. apex_application.g_f01.count LOOP -- shorten the submitted first name to 20 characters apex_application.g_f02(i) := SUBSTR(apex_application.g_f02(i),1,20); -- shorten the submitted last name to 20 characters apex_application.g_f03(i) := SUBSTR(apex_application.g_f03(i),1,20); END LOOP; APEX_ITEM.MULTI_ROW_UPDATE( SCOTT:EMP:EMP_ID,1 EMP_FNAME,2:EMP_LNAME,3 ); END;

Global Collection Basics Idx g_f01 g_f02 g_f03 g_f50 g_fcs 1 13432 4 1..B2449.. 2 14567 1..A3609.. 3..Z8134.. <input type= text" value="4" name="f02"/> Tabular form elements are posted to server and then stored in the apex_application arrays The name attribute of the item corresponds with the array name G_fcs is populated by md5_checksum function Non selected checkboxes and radio buttons (and disabled elements) are not posted

Radio Button and Checkbox Issues List type form elements may be single or multiselect Select lists from APEX_ITEM are only single select Multi-select items are commonly stored as children of the main record APEX makes it simple to use multi-selects stored as colon delimited strings

Radio Button and Checkbox Issues Unselected form elements are not posted to the server Global array positions (idx) will not match other elements in the row

Checkbox Considerations Checkboxes and radiobuttons present unique challenges If checkbox values are consistent across all rows you can use the row key for the value Otherwise you need the value and a way to associate it with the row key

Radiogroup Considerations Radio buttons present even more challenges HTML radio input types are grouped by NAME Only one radio button per group can be selected

Matching Keys and Values Three main methods Store the PK in the value attribute of the element and associate the p_idx with a database value Store the PK and the database value in the value attribute and use any p_idx (Compound Key) Store the database value in the value attribute using a rownum derived p_idx and then store that rownum in a hidden item (Triangulation)

Matching Keys and Values ID Name Red Green Blue Element Hidden Display Only Radio Radio Radio P_idx -> 1 2 3 4 5 Value Primary Key Database Value Primary Key Primary Key Primary Key Store PK in value of element and use the p_idx to get the value for database

Matching Keys and Values --delete using pk FORALL i IN 1.. g_f01.count DELETE mytable WHERE id = apex_application.g_f01(i); --insert using posted values FORALL red IN 1.. g_f03.count INSERT INTO mytable(id, color) VALUES (apex_application.g_f03(red), 'RED');

Compound Keys ID Name Red Green Blue Element Hidden Display Only Radio Radio Radio P_idx -> 1 2 3 3 3 Value Primary Key (PK) Database Value PK RED PK GREEN PK BLUE Store PK and DB value in value attribute of element

Compound Keys DECLARE l_key_arr wwv_flow_global.vc_arr2; BEGIN FORALL i IN 1.. apex_application.g_f01.count DELETE mytable WHERE ID = apex_application.g_f01(i); FOR x IN 1.. apex_application.g_f03.count LOOP l_key_arr := apex_util.string_to_table (apex_application.g_f03(x), ' '); INSERT INTO mytable(id, color) VALUES (l_key_arr(1), l_key_arr(2)); END LOOP; END;

Triangulation Keys Simple to create key structure Flattens the checkbox or radio button arrays to one array each SELECT apex_item.hidden(50, ROWNUM) AS row_number, apex_item.hidden(49, pk_column) AS pk, apex_item.radiogroup(rownum, radio_value, selected_value, value_label) as radiobutton FROM wherever WHERE whatever

Triangulation Keys g_f49 is primary key g_f50 points to the array with the value All item values are in index 1 of arrays 1 to 48 (except for checkboxes and multiselects)

Triangulation Keys DECLARE l_arrnum VARCHAR2(50); l_stmt VARCHAR2(200); l_arrval VARCHAR2(100); BEGIN FOR i IN 1.. apex_application.g_f49.count LOOP -- build string to find the array number stored in array 50 l_arrnum := 'apex_application.g_f' LPAD(LTRIM(RTRIM(apex_application.g_f50(i))),2, '0'); -- build pl/sql block to extract value(s) as delimited string l_stmt := 'BEGIN ' ' :l_arrval := apex_util.table_to_string(' l_arrnum -- eg apex_application.g_f10 ', '':''); END;'; -- run block using out bind value EXECUTE IMMEDIATE l_stmt USING OUT l_arrval; save_response(:g_resp_id, apex_application.g_f49(i), l_arrval); END LOOP; END;

Checkbox Function APEX_ITEM.CHECKBOX Arguments: p_idx = The form element name, e.g. 1 equals f01, 2 equals f02, etc. Typically the p_idx argument is constant for a given column. p_value = When checked return this value p_attributes = Custom HTML arguments added to the HTML input type of checkbox. p_checked_values = Colon (by default delimted list of values p_checked_values_delimitor = Defaults to a colon ":" and is used to pass multiple values in one string. p_item_id = Will set the ID of the item to this value (id="..."). Must be unique! Try concatenating some string with rownum. Required for 508 compliance p_item_label = Creates an invisible label for an item. Used for Section 508 Compliance. Class is hideme508.

Multiple Checkbox Function Most examples of checkboxes show one idx per column Not easy to do this in SQL with a varying number of columns (case range >= x) SELECT_LIST_FROM_LOV but no CHECKBOX_FROM_QUERY or similar

Multiple Checkbox Function

CREATE OR REPLACE FUNCTION multi_checkbox_from_list( p_idx IN NUMBER, p_value_list IN VARCHAR2 -- p_value_list in the format of a APEX static LOV eg Label1;Value1,Label2;Value2, p_checked_values IN VARCHAR2 -- p_checked_values in the format of a colon delimited string eg Value1:Value2 ) RETURN VARCHAR2 IS l_list_arr wwv_flow_global.vc_arr2; l_list_item wwv_flow_global.vc_arr2; l_return VARCHAR2(32000); BEGIN l_list_arr := apex_util.string_to_table(p_value_list, ','); FOR i IN 1.. l_list_arr.count LOOP l_list_item := apex_util.string_to_table(l_list_arr(i), ';'); -- 2nd position in new array is the value l_return := l_return '<label>'; l_return := l_return apex_item.checkbox(p_idx => p_idx, p_value => l_list_item(2), p_checked_values => p_checked_values); -- 1st position is the label l_return := l_return l_list_item(1) '</label>'; END LOOP; RETURN l_return; END multi_checkbox_from_list;

Some Limitations When working with tabular forms Submitted data is not stored in session state No easy way to validate MRU Checksum Error If you use the built in processing

APEX Collections To The Rescue APEX collections are a view and an API to work with the data in the underlying tables Each collection instance belongs to and can only be viewed by the owning session Has a name, row index, 50 varchar columns, one LOB column and a checksum column

Not All Collections Are The Same APEX_COLLECTION data stored in tables with an API to read and write APEX Global Collections VARCHAR array package variables PL/SQL types not SQL types

How To Create And Populate create_collection (delete_collection) create_or_truncate_collection add_member update_member create_collection_from_query create_collection_from_query_b

Create Collection From Query Cannot pass query into function with :BIND syntax Convert :BIND to v( BIND ) REGEXP_REPLACE(sql, ':([a-za-z0-9_]*)', 'v(''\1'') ') p_generate_md5 parameter creates checksum of columns in SQL create_collection_from_query_b does not offer checksum

Querying Your Collection Works just like a regular table or view Multiple collections can be joined or unioned SELECT c001, c002,..., c050 FROM apex_collections WHERE collection_name = :mycoll

APEX Collections Checksum API for collections can compute checksums for stored columns When creating the members from a query the checksum process locks the row to read it The checksum can be used for lost update detection and to prevent tampering with read only elements

Post Processing With Collections CREATE_OR_TRUNCATE_COLLECTION Loop over values from APEX_APPLICATION collections and use ADD_MEMBER or Dump all your APEX_APPLICATION collections into it with ADD_MEMBERS Generating a checksum here allows you to determine what records changed

SELECT apex_item.hidden(50, ROWNUM) AS row_number, apex_item.hidden(49, pk_column) AS pk Report Source, apex_item.radiogroup(rownum, radio_value, selected_value, value_label) as radiobutton wwv_flow_collections FROM wwv_flow_collections WHERE collection_name = :l_collection Column Attributes APEX_ITEM API Tables & Views wwv_flow.accept wwv_flow_collections Page Process

Validation Errors Report query outer joined to collection Submit process to CREATE_OR_TRUNCATE_COLLECTION Submit process finds validation errors and stores information in collection Submit process to update data for records without validation error Branch to same page and report query will access any error messages in collection (or just limit it to those with errors if errors are present)

Taking it a step further Extract core report query to On Load process that creates collection from the query Report query selects from the collection instead of your tables On Submit process saves submitted values in another collection Joining collections by key and comparing MD5_ORIGINAL column shows dirty records Take this approach as far as you want add error messages; decide what and when to process; etc

Combining AJAX and Tabular Forms Basic AJAX functionality requires three components 1.Trigger for form element 2.Javascript function to make AJAX call 3.On Demand Process in APEX

Combining AJAX and Tabular Forms Trigger for form element options Attribute of the element <input type="text" onchange="setpriorityseq(391120, this.value )" value="" name="f07"/> Register event on page load

Combining AJAX and Tabular Forms Registering event handlers on page load if (window.addeventlistener) { window.addeventlistener("load", s_registerclicks, true); } else if (window.attachevent) { window.attachevent("onload", s_registerclicks); } function s_registerclicks() { } var answerarr = new Array(); answerarr = document.getelementsbyname('f03'); for (var i = 0; i < answerarr.length; i++) { } answerarr[i].onchange = function() { return s_changedelement(this); }; s_changedelement is the actual handler of the change

Combining AJAX and Tabular Forms Javascript function to make AJAX call function SetPrioritySeq(prec, pval) { var get = new htmldb_get(null,$v('pflowid'),'application_process=updatepriseq',0); get.addparam('x01',prec); // the primary key get.addparam('x02',pval); // the update value greturn = get.get(); get = null; greturn = (!greturn)?'null':greturn; }

Combining AJAX and Tabular Forms On Demand Process in APEX DECLARE l_grid NUMBER; l_priority_seq grievance.arb_priority_seq%type; BEGIN l_grid := wwv_flow.g_x01; -- the primary key l_priority_seq := wwv_flow.g_x02; -- the value to update UPDATE grievance SET arb_priority_seq = l_priority_seq WHERE grid = l_grid; END;

Useful Helper Functions Find the nth element in delimited array REGEXP_SUBSTR(:PX,'[^:]+',1,n) Count elements in delimited array REGEXP_COUNT(:PX,'[^:]+')

Useful Helper Functions When using checkboxes for list management instead of deleting and reinserting you can find the intersect -- old minus new equals those we need to delete l_delete_arr := l_old_arr MULTISET EXCEPT l_new_arr; -- new minus old equals those we need to insert l_insert_arr := l_new_arr MULTISET EXCEPT l_old_arr; * Works only on table types declared in SQL