Tampilkan postingan dengan label Report. Tampilkan semua postingan
Tampilkan postingan dengan label Report. Tampilkan semua postingan

Kamis, 01 Mei 2014

Hidden treasure of Interactive Report

Salah satu feature terbaik dari APEX adalah Interactive Report. Pada posting kali ini saya akan membuka feature dari IR dalam hal query reference.

  • Feature query IR<OPERATOR>_<COLUMN_ALIAS>.
  • Salah satu yang sering kita pakai adalah IR_DEPARTMENT_ID artinya kita melakukan filter terhadap kolom department ID, IR by default: EQUAL. Ternyata banyak lagi operator yang bisa kita pakai dalam melakukan filter.
    Daftar valid operator
Operator Description
EQ Equals (this is the default)
NEQ Not equals
LT Less than
LTE Less than or equal to
GT Greater than
GTE Greater than or equal to
LIKE SQL 'like' operator
N is null
NN is not null
C Contains
NC not contains
IN SQL 'in' Operator
NIN SQL 'not in' Operator
    sumber : Advanced Interactive Report by David Peake.
     
  • URL reference terhadap saved report.
  • Jika kita memiliki beberapa saved report, maka kita bisa melakukan reference ke page tujuan dengan memilih apakah memakai saved report 1 atau yang lain dalam contoh : IR_REPORT_DEFAULT atau IR_REPORT_CHART.

Sabtu, 08 Februari 2014

QR Codes on APEX

Anda ingin menampilkan QR code kedalam APEX seperti ini ?
Jangan khawatir anda bisa memakai bantuan Google Developer untuk menampilkan di APEX.

Demo : di sini

Sabtu, 01 Februari 2014

Dynamic Highlight on classic & interactive report

Pada posting kali ini sya akan menunjukkan bagaimana melakukan highlight secara bersamaan pada classic report dan interactive report memakai Dynamic Action(DA).

Skenario :
  • Sebuah Item Parameter bisa hidden atau select list : PXX_DEPT_HL.
  • Sebuah report classic thd : DEPT 
  • select null "icon"
    ,deptno, DNAME
    ,case when deptno = :PXX_DEPT_HL then 'HIGHLIGHT' else null end HIGHLIGHT 
    from dept
    
  • Sebuah report interactive EMP.
  • select EMP.EMPNO as EMPNO,
        EMP.ENAME as ENAME,
        EMP.JOB as JOB,
        EMP.MGR as MGR,
        EMP.HIREDATE as HIREDATE,
        EMP.SAL as SAL,
        EMP.COMM as COMM,
        EMP.DEPTNO as DEPTNO ,case when deptno = :PXX_DEPT_HL then 'HIGHLIGHT' else null end HIGHLIGHT 
     from EMP EMP
    
  • Saat icon pada report calssic di clik / atau nilai PXX_DEPT_HL berubah akan memeri hilghlight pada kedua report sesuai nilainya

Logic :
  • Pada column icon buatlah sebuah link dengan action url:
    javascript:$s('PXX_DEPT_HL','#DEPTNO#');
  • Pada column dname HTML Expression:
    <span id="#HIGHLIGHT#DNAME#R#">#DNAME#</span>
  • Pada report interactive buatlah format highlight row dengan kodisi highlight=HIGHLIGHT.
  • Buatlah DA thd item PXX_DEPT_HL dengan event : change dan action : refresh report classic.
  • Buatlah DA pada report classic dengan event : after refresh dengan action : Execute Javascript Code :
    $("[id^=HIGHLIGHT]").closest('tr').children('td').css("background-color", "#FD4");
    dan Refresh region report interactive.

Demo : disini

Selasa, 28 Januari 2014

Dynamic Interactive Report Using Collection

Salah satu kelemahan Interactive Report (IR) adalah hanya menyediakan type source SQL tidak ada pilihan untuk PL/SQL. Sehingga kita tidak bisa membuat dynamic query seperti pada classic report.


Namun hal tersebut masih kita bisa cari solusinya dengan cara :
  • Membuat function return table pipelined atau.
  • Memakai bantuan query terhadap APEX collection.
Pada posting saya ini akan menjelaskan pada teknik kedua yaitu Memakai bantuan query terhadap APEX collection.

Skenario :
  • Kita akan membuat IR thd semua tabel yang ada di  skema HR untuk contoh demo (EMP & OEHR_EMPLOYEES).
  • Kita hanya membatasi max  kolom sejumlah 10.
  • Skema akses apex memiliki system privilege : SELECT ANY DICTIONARY.
Logic & Process :
  • Membuat sebuah fungsi  yg secara dinamis bisa me-return 10 nama kolom tabel input.
  • create or replace 
    function get_report_headers 
    (
      p_table     in varchar2 default 'EMP'
    , p_separator in varchar2 default ','
    , p_type      in varchar2 default 'HEADER'
    , p_num       in number default 1
    ) return varchar2 as 
      v_temp_arr apex_application_global.vc_arr2;
      v_list varchar2(32767);
    begin
     if p_type = 'HEADER' then
      SELECT column_name bulk collect
        into v_temp_arr
        FROM USER_TAB_COLUMNS
       WHERE owner = 'HR'
         and table_name = p_table
         and owner = 'HR'
         and data_type <> 'BLOB'
       order by column_id;
      v_list := apex_util.table_to_string(v_temp_arr,p_separator); 
      return v_list;
     else
      if p_num > 10 then
       v_list := null;
      else
       begin 
        SELECT initcap(REPLACE(column_name,'_',' ')) 
          into v_list
          FROM USER_TAB_COLUMNS
         WHERE owner = 'HR'
           and table_name = p_table
           and owner = 'HR'
           and column_id = p_num; 
        exception when others then v_list := null;   
       end;    
       end if;
      return v_list;   
      
     end if;
    end get_report_headers;
    
  • Buatlah sebuah page dengan 10 item dan sebuah IR.
  • Pada before header buatlah sebuah process untuk membuat sebuah collection unik.
  • declare
     v_query VARCHAR2(32767):=null;
     v_collection varchar2(100) := nvl(:P20_COLL_NAME,'DYNAMIC_'||:SESSION_ID);
    begin
     v_query := 'select '||
                 get_report_headers(p_table => :P20_TABLE_NAME) ||
                ' from HR.' || nvl(:P20_TABLE_NAME,'EMP');
    
    IF APEX_COLLECTION.COLLECTION_EXISTS (p_collection_name => v_collection) THEN                 
      APEX_COLLECTION.DELETE_COLLECTION(p_collection_name => v_collection);
      APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(p_collection_name => v_collection
                                                  ,p_query           => v_query );
    else
      APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(p_collection_name => v_collection
                                                  ,p_query           => v_query );
    end if;
    end;
    
  • Pada before header buatlah sebuah process mengisi 10 item yang telah dipersiapkan untuk nama header kolom.
  • :P20_C01 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 1);
    :P20_C02 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 2);
    :P20_C03 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 3);
    :P20_C04 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 4);
    :P20_C05 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 5);
    :P20_C06 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 6);
    :P20_C07 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 7);
    :P20_C08 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 8);
    :P20_C09 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 9);
    :P20_C10 := get_report_headers(p_table => :P20_TABLE_NAME,p_type => 'COLUMN', p_num => 10);
    
  • Buatlah IR :
  • select *
      from APEX_collections
     where collection_name = :P20_COLL_NAME;
    
  • Buatlah heading column secara dinamis me-refer ke item serta kondisi thd nilai item reference (C001...C010).
  • Buatlah semua kolom condition : never (selain C001...C010).
Demo :  Dynamic IR with collection