56
Hooked on Classic (Reports) Learn tips & techniques to make them sing Jorge Rimblas 1.1

Hooked on Classic (Reports): learn tips & techniques to make them sing

Embed Size (px)

Citation preview

Hooked on Classic (Reports)Learn tips & techniques to make them sing

Jorge Rimblas

1 . 1

Jorge RimblasSenior APEX Consultant

@rimblasrimblas.com/blog

Oracle Database since 1995APEX since it was HTMLDB in 2004Kscope16 APEX Track Content Leadjrimblas in OTN Forums

Co-author of"Expert Oracle Application Express, 2nd Edition"with "Themes & Templates" chapter

1 . 2

North America’s largest APEX consulting firm

12 years working with Oracle APEX

80 employees and growing

Committed to APEX innovation

Our services: application development,

coaching, consulting, EBS extensions, and

Forms migration

Learn more at insum.ca

1 . 3

AgendaWhy?Template TypesGeneric Column Templates

Analytic FunctionsLimitationsResources

Named Column Templates

2

The "Manual" Approachhtp.p('<ul>');for t in ( select id , todo , decode(completed_by , null, '' , 'check' || '-') checked from app_todos)loop htp.p('<li>' || t.todo || ' <i class="fa fa-' || t.checked || 'square-o">' || '</i>' || '</li>'); end loop;htp.p('</ul>');

3 . 1

Why?Standard Functionality

Ease of useFlexibility

No PL/SQL loops3 . 2

Classic Report examples

3 . 3

3 . 4

TemplateTypes

4 . 1

Generic Columns&

Named Columns

4 . 2

Generic Columns

Named Columns

Column Template

Row Template

4 . 3

4 . 4

GenericColumns

5 . 1

Every column looks the same <td> #COLUMN_VALUE#</td>

5 . 2

Every column looks the same <td class="t-Report-cell" #ALIGNMENT# headers="#COLUMN_HEADER_NAME#"> #COLUMN_VALUE#</td>

5 . 3

Column Template ConditionsFour Column TemplatesCondition for each templateCondition types: PL/SQL Expression, even or oddrows

5 . 4

Using conditions

5 . 5

Duplicate the template

5 . 6

Modify the template

5 . 7

Assign the template

5 . 8

Step by step detailsrimblas.com/blog/2014/05/using-conditions-with-column-templates/

5 . 9

NamedColumns

6 . 1

SQL Named Columnsselect PRODUCT_ID , PRODUCT_NAME , PRODUCT_DESCRIPTION , CATEGORY , PRODUCT_AVAIL , LIST_PRICE from PRODUCTS

#PRODUCT_ID##PRODUCT_NAME##PRODUCT_DESCRIPTION##CATEGORY##PRODUCT_AVAIL##LIST_PRICE#

#COLUMN_VALUE#

Generic Columns

6 . 2

SQL Named Columnsselect PRODUCT_ID , PRODUCT_NAME , PRODUCT_DESCRIPTION , CATEGORY , PRODUCT_AVAIL , LIST_PRICE from PRODUCTS

#1##2##3##4##5##6#

Positional Columns

6 . 3

Simple List

6 . 4

Simple List<ul> <li>Orange Juice <i class="fa fa-check-square-o"></i></li> <li>Milk <i class="fa fa-check-square-o"></i></li> <li>Eggs <i class="fa fa-square-o"></i></li> <li>Bread <i class="fa fa-square-o"></i></li> <li>Cornflakes <i class="fa fa-square-o"></i></li></ul>

<li>#TODO# <i class="fa fa-#CHECKED#square-o"></i></li>

<ul>

</ul>

Before Rows

After Rows

6 . 5

Simple List Template

6 . 6

Simple List <li>#TODO# <i class="fa fa-#CHECKED#square-o"></i></li>

select id , todo , decode(completed_by , null, '' , 'check' || '-') checked , completed_by , completed_onfrom app_todos

Demo p220

6 . 7

DemoAdding a link to edit

6 . 8

BenefitsStandard Classic Report Functionality

Edit LinksDynamic Actions

Dialog CloseRefresh

6 . 9

NamedColumnsMixing Layouts

7 . 1

Contact List

7 . 2

Two types of rows

<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr>

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

7 . 3

<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr>

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

select party_id , party_name , role , type_name , entry , active_ind from parties

7 . 4

<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr>

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

select party_id , party_name , role , type_name , entry , active_ind from parties where party_id = 41

For a single rowOr the 1st Party Row

Use both types of rows

Special Case

7 . 5

7 . 6

AnalyticFunctions

8 . 1

Analytics Syntax<function> (<arg1>, <arg2>, ) OVER ( < partition clause > < sorting clause > < windowing clause > )

row_number() over ( partition by party_id order by party_name, entry )

8 . 2

Analyticsselect party_id , party_name , entry , row_number() over ( partition by party_id order by party_name, entry) rn from parties

PARTY_ID PARTY_NAME ENTRY RN--------- ------------------ -------------------------------- -------1 Scott, Michael 800 555-1212 11 Scott, Michael 952 555-1212 21 Scott, Michael [email protected] 321 Schrute, Dwight 800 555-1212 121 Schrute, Dwight [email protected] 221 Schrute, Dwight [email protected] 321 Schrute, Dwight [email protected] 441 Halpert, James D. 800 555-1212 1

8 rows selected.

8 . 3

count(*) as analyticselect party_id , party_name , row_number() over ( partition by party_id order by party_name, entry) rn , count(*) over ( partition by party_id ) total_rows from parties

PARTY_ID PARTY_NAME RN TOTAL_ROWS--------- ------------------ --- -----------1 Scott, Michael 1 31 Scott, Michael 2 31 Scott, Michael 3 321 Schrute, Dwight 1 421 Schrute, Dwight 2 421 Schrute, Dwight 3 421 Schrute, Dwight 4 441 Halpert, James D. 1 1

8 rows selected.

8 . 4

KISS series on Analyticsby Connor McDonald

youtu.be/nk4I4ta4ZuU8 . 5

select party_id , party_name , role , type_name , entry , row_number() over (partition by party_id order by party_name, entry) rn from parties

:RN = 18 . 6

Putting it all together

9 . 1

Create a new template

9 . 2

<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr>

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

Column Template 1 Column Template 2

9 . 3

:RN = 1<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr><tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

Column Template 1

Adding some markup

9 . 4

<tr class="newContact rowStatus_#ACTIVE_IND#"> <td colspan="2" class="t-Report-cell heading"> <a href="#LINK#" class="contactEdit" data-id="#PARTY_ID#">&EDIT_BUTTON.</a> <span class="name">#PARTY_NAME#</span> - <span class="roleName">#ROLE#</span> <i class="fa cfa-check_#ACTIVE_IND# cfa-1_5x" title="#ACTIVE_IND#"></i> </td></tr><tr> <td align="right" class="t-Report-cell contactType">#TYPE_NAME#</td> <td class="t-Report-cell contactEntry">#ENTRY#</td></tr>

<tr> <td colspan="2"> <a href="#LINK#">&EDIT_BUTTON.</a> #PARTY_NAME# - #ROLE# <i class="fa"></i> </td></tr><tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

Column Template 1

Adding some markup

:RN = 1

9 . 5

<tr> <td align="right">#TYPE_NAME#</td> <td>#ENTRY#</td></tr>

Column Template 2

9 . 6

Contact List

9 . 7

Limitations

10 . 1

Some HTML knowledgeTemplates are not that re-usableNew columns require template changesOnly 4 template conditionsPotential Pagination IssuesLimited support for Interactive Reports

10 . 2

Interactive ReportsDetail View

10 . 3

Blogs & ReferencesDemo App [ ]Demo Video Series

Using Conditions with Column Templates

KISS Analytics playlist

APEX Reports: Color Row Based On Column Value

APEX Reports: Custom Layout with Named Column (Row Template)

Reinventing APEX Reporting

Oracle APEX 5 Classic Report Templates

apex.oracle.com/pls/apex/f?p=89361 Download

http://rimblas.com/blog/videos/

rimblas.com/blog/2014/05/using-conditions-with-column-templates/

https://www.youtube.com/playlist?list=PLJMaoEWvHwFJDyhMLCkNSSUQWw9waFkIj

ww.eberapp.com/pls/apex/f?p=BLOG:READ:0::::ARTICLE:5983100346022749

ww.eberapp.com/pls/apex/f?p=BLOG:READ:0::::ARTICLE:5976400346831048

morneau.me/reinventing-apex-reporting/

storm-petrel.com/orablog/2015/12/20/oracle-apex-5-classic-report-templates/

11

Q&AHooked on Classic (Reports)

@rimblasJorge Rimblas

12

13

Your one stop for everything APEX

apex.world

14