Senin, 19 November 2012

Example on Using RESTful Web Service on APEX (User Agent Tracking)

Setelah pada contoh sebelumnya kita membuat RESTful web service dengan output XML, pada contoh ini kita akan membuat dengan dengan output response TEXT.

Kasus kita ingin melakukan tracking User Agent (UA) dengan bantuan mini API dari useragentstring.com yang di dokumentasikan disini.

Oke sekarang kita implementasikan ke dalam apex dengan RESTful web service.

  1. Buatlah Web Service Reference seperti berikut:
    • Name : UA Info
    • URL : http://www.useragentstring.com/?uas=&G_UA.&getText=all
    • Basic Authentication : No
    • HTTP Method : GET
    • Output Format : Text
    • Parameter Delimiter : ;
    • REST output parameter seperti berikut
  2. Buatlah page baru dengan detil berikut:
    • Buat page item : G_UA
    • Buat computation item G_UA Before header sql query :
    • select apex_util.url_encode(owa_util.get_cgi_env('HTTP_USER_AGENT'))
      from dual
      
    • Buat Process web service (UA Info)on load after header: store report on collection dengan nama UA_RESULTS
    • Buat Report sql base on web service :
    • select substr(c002,INSTR(c002,'=', 1, 1)+1) "agent_name"
           , substr(c003,INSTR(c003,'=', 1, 1)+1) "version"
           , substr(c005,INSTR(c005,'=', 1, 1)+1) "OS Name"
       from apex_collections 
      where collection_name = 'UA_RESULTS'
      
    • Test Drive

Minggu, 18 November 2012

Example on Using RESTful Web Service on APEX (ISP Tracking)

Pada posting kita kali ini kita akan mencoba memakai feature APEX untuk integrasi melalui RESTful web service dengan contoh kasus melakukan query untuk memperoleh informasi ISP berdasarkan IP address.

Disini kita akan melakukan query ke http://services.ipaddresslabs.com. lakukan langkah-langkah berikut:
  1. Buatlah web service reference pada shared components sebagai berikut:
    • Name : ISP Info
    • URL : http://services.ipaddresslabs.com/iplocation/locateip?key=demo&ip=&MY_IP.
    • Basic Authentication : No
    • HTTP Method : GET
    • Output Format : XML
    • Response XPath : /response/geolocation_data
    • Input Type:
  2.  Buatlah parameter seperti gambar berikut:
  3. Gunakan dalam sebuah form report.
  4. Buatlah page item MY_IP.
  5. Test drive.

Senin, 12 November 2012

How to get CGI environment

Melalui value dari CGI kita bisa mengetahui IP address client yang akses, user agent dan lainnya. Melalui package OWA_UTIL kita bisa peroleh dengan sub program GET_CGI_ENV. namun dengan GET_CGI_ENV kita harus menentukan masing-masing parameter name untuk memperolehnya.

Untuk mempersingkat code bisa gunakan teknik berikut. dengan catatan bahwa nama dan value yang akan diperoleh tergantung dari web server yang dipakai APEX.

BEGIN
htp.prn('<tr>');
htp.prn('<th>CGI Variable Name</th>');
htp.prn('<th>CGI Variable Value</th>');
htp.prn('</tr>');
FOR i IN 1..owa.num_cgi_vars LOOP
htp.prn('<tr> <td align="left">'||owa.cgi_var_name(i)||'</td> <td align="left">'||owa.cgi_var_val(i)||'</td> </tr>');
END LOOP;
END;

Kita coba implementasikan ke dalam APEX dengan memakai Region PL/SQL Dynamic Content seperti contoh ini

Sabtu, 10 November 2012

Membuat koneksi Jasper iReport ke Oracle Database melalui JDBC driver

Bagi masbro dan mbaksis yang bingung gimana cara buat koneksi database dari iReport Jasper ke oracle, lakukan langkah-langkah berikut:
  1. Copy file ojdbc14.jar yang telah dipersiapka ke <ireport_home>/libs.
  2. Buka iReport pada Tools >> Options : pilih tab Classpath
  3. Pilih add jar : lalu ambil file ojdbc14.jar yang telah dipersiapkan.
  4. Pilih icon report datasource : new
  5. Isilah seperti berikut:
  • Name : oracle-hr
  • JDBC Driver : Oracle (oracle.jdbc.driver.OracleDriver)
  • JDBC URL   : jdbc:oracle:thin:@localhost:1521:orcl
  • Username      : hr
  • Password      : hr
  1. Test koneksi jika berhasil silahkan coba buat report.

Kamis, 01 November 2012

Check internet connection using UTL_TCP

Pertanyaan yang muncul pertama kali kenapa kita harus melakukan cek ini di level database? well..anda tahu bahwa APEX adalah aplikasi database. Jadi kebutuhan ini sangat memungkinkan.
Contoh : saat kita memakai item plugin google recaptcha jelas hal tersebut membutuhkan koneksi internet ke google untuk mengaktifkan plugin tersebut bukan?.

Jadi kita bisa gunakan solusi UTL_TCP untuk digunakan dalam pengecekan kondisi apakah aplikasi sekarang sedang bisa akses internet atau tidak.
  1. Pastikan anda memberi akses ACL google.co.id (contoh) jika memakai 11g.
  2. Grant akses UTL_TCP ke schema ybs.
  3. Buatlah sebuah function seperti berikut :
  4. CREATE OR REPLACE FUNCTION PING_INTERNET(P_HOST_NAME VARCHAR2, P_PORT NUMBER DEFAULT 1000) RETURN VARCHAR2
      IS  
        tcpConnection  UTL_TCP.CONNECTION;  --TCP/IP connection to the server    
        C_PING_OK           CONSTANT VARCHAR2(10)  := 'OK';
        C_PING_ERROR        CONSTANT VARCHAR2(10)  := 'ERROR';
      BEGIN
        tcpConnection := UTL_TCP.open_connection(remote_host => p_HOST_NAME, 
                                                 remote_port => p_PORT,tx_timeout=> 5);
        UTL_TCP.close_connection(tcpConnection);    
        
        RETURN C_PING_OK;    
      EXCEPTION 
        WHEN UTL_TCP.NETWORK_ERROR THEN
          IF( UPPER(SQLERRM) LIKE '%HOST%' )THEN 
            RETURN C_PING_ERROR;        
          ELSIF(UPPER(SQLERRM) LIKE '%LISTENER%' )THEN
            RETURN C_PING_OK;        
          ELSE
            RAISE;
          END IF;            
      END PING_INTERNET;
    /
    
  5. Gunakan dalam condition di aplikasi APEX untuk me-check apakah jaringan terkoneksi ke internet:
  6. select ping_internet('google.co.id', 80) from dual; 

Sabtu, 20 Oktober 2012

Mimetype and size validation on APEX upload file

Beberapa hal yang harus anda perhatikan dalam implementasi upload image dalam APEX adalah:
  1. Aplikasi harus memakai otentifikasi
  2. Proses upload bisa memakai storage type :custom table atau WWV_FLOW_FILES (APEX_APPLICATION_FILES). Disini saya tidak akan menjelaskan bagaimana kedua teknik tersebut dipakai.
  3. Keduanya akan terbentuk di tabel APEX_APPLICATION_FILES, jadi anda harus hati-hati meskipun melakukan upload ke custom table maka otomatis juga terbentuk di WWV_FLOW_FILES. silahkan buktikan dengan melakukan query ke table WWV_FLOW_FILES saat anda berhasil upload di custom table. 
  4. Dengan fakta-fakta diatas maka:
    • Kita bisa melakukan validasi file upload terhadap jenis dan ukuran size dari file sebelum benar-benar kita upload ke dalam custom tabel dengan melakukan query ke APEX_APPLICATION_FILES.
    • Anda harus melakukan proses delete tabel APEX_APPLICATION_FILES saat melakukan validasi, setelah proses update/insert ke custom table. karena insert selalu terjadi ke table APEX_APPLICATION_FILES baik validasi berhasil atau gagal.

Dengan beberapa fakta diatas kita bisa implementasikan upload image dengan Storage Type: BLOB column specific in Item Source Attribute, kemudian melakukan validasi dengan bantuan WWV_FLOW_FILES pada contoh demo ini.

How to accomplish dynamic image on form and report?

Posting kali ini kita akan mencoba membuat sebuah dynamic image yang akan tampil di report dan form. Disebut dynamic karena kita bisa me-reference image dari column BLOB, external URL atau default image yang tersimpan dalam #WORKSPACE_IMAGES#.
  1. Alter table yang akan digunakan sebagai penampung dalam contoh ini saya pake EMP.
  2. ALTER TABLE emp ADD
    (EMP_PHOTO blob,
    ATTACH_MIMETYPE VARCHAR2(255),
    ATTACH_FILENAME VARCHAR2(255),
    ATTACH_LAST_UPDATE DATE,
    ATTACH_CHARSET VARCHAR2(128),
    EXTERNAL_URL VARCHAR2(255));
    
  3. Buat report-form dengan wizard.
  4. Pada bagian report edit query dengan seperti ini.
  5. select "EMPNO", 
    "ENAME",
    "JOB",
    "MGR",
    "HIREDATE",
    "SAL",
    "COMM",
    "DEPTNO",
    "EXTERNAL_URL",
    case when dbms_lob.getlength(emp_photo)<>0 then 
        '<img alt="emp Image" height="75" src="'||
        apex_util.get_blob_file_src('P24_EMP_PHOTO',empno)||
        '" style="-moz-border-radius: 4px; -webkit-border-radius: 4px; border: 4px solid #CCC;" title="emp Image" width="75" />'
           when  nvl(dbms_lob.getlength(emp_photo),0)=0  and external_url is not null   then
        '<img alt="emp Image" height="75" src="'||external_url||
        '" style="-moz-border-radius: 4px; -webkit-border-radius: 4px; border: 4px solid #CCC;" title="emp Image" width="75" />'       
           else     
        '<img alt="emp Image" height="75" src="#WORKSPACE_IMAGES#1.jpg" style="-moz-border-radius: 4px; -webkit-border-radius: 4px; border: 4px solid #CCC;" title="emp Image" width="75" />'       
    end as "PHOTO"
    from EMP
    
  6. Pada bagian form tambahkan item: display only dengan source :
  7. declare
     v_exist number(2);
    begin
    select count(1) into v_exist
    from emp
    where empno=:P24_EMPNO and DBMS_LOB.GETLENGTH(EMP_PHOTO)<>0;
    if  v_exist&lt;&gt;0 then
    return '<img src="'||apex_util.get_blob_file_src('P24_EMP_PHOTO',:P24_EMPNO)||'" />';
    elsif  v_exist=0 and :P24_EXTERNAL_URL is not null  then
    return '<img src="'||:P24_EXTERNAL_URL||'" />';
    else
    return '<img src="#WORKSPACE_IMAGES#1.jpg" />';
    end if;
    end;
    
  8. Update/create form dengan upload image ke dtatbase atau mereference URL link di EXTERNAL_URL

Demo bisa diakses di sini

Sabtu, 13 Oktober 2012

Bagaimana Memproteksi Kode PL/SQL Memakai Function dan Procedure wrapping DBMS_DDL?

Kebutuhan ini sangat vital dimiliki programmer APEX untuk melindungi hak intelektual atau kerahasian sebuah kode contoh menyembunyikan teknik otentifikasi dari user. Karena sampai versi terakhir disisi aplikasi belum menyediakan tool ini.

Dengan memakai feature dari oracle database 11g kita akan memakai CREATE_WRAPPED Procedures atau WRAP Functions yang dijelaskan di dokumentasi “Oracle® Database PL/SQL Packages and Types Reference 11g”. berbeda dengan teknik 10g pada 11g jauh lebih simple.

Namun penjelasannya sangat singkat dan membingungkan sehingga perlu penjelasan lebih lanjut. Contoh pemakaian DBMS_DDL.CREATE_WRAPPED ada dua cara:

  1. Cara singkat dengan single parameter tipe varchar2:
  2. DBMS_DDL.CREATE_WRAPPED (
       ddl VARCHAR2);
    
  3. Cara detil dengan 3 parameter tipe DBMS_SQL.VARCHAR2A dan PLS_INTEGER
  4. DBMS_DDL.CREATE_WRAPPED(
        ddl DBMS_SQL.VARCHAR2A,
        lb PLS_INTEGER,
        ub PLS_INTEGER);
Dengan bantuan mbah google akhirnya diperoleh contoh pemakaiannya yaitu:

  1. Cara pertama memakai bantuan quote q!' ddl script'! (sumber Tyler Muth’s Blog) :
  2. declare
      l_function    varchar2(32767);
    begin
      l_function := q'!
        create or replace function wrap_test
          return varchar2
        is
        begin
           return 'Yep, it worked';
        end wrap_test; !';
      sys.dbms_ddl.create_wrapped(l_function);
    end;
    /
    
  3. Cara kedua (sumber Oracle Base) :
  4. DECLARE
      l_source  DBMS_SQL.VARCHAR2A;
      l_wrap    DBMS_SQL.VARCHAR2A;
    BEGIN
      l_source(1) := 'CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS ';
      l_source(2) := 'BEGIN ';
      l_source(3) := 'RETURN TO_CHAR(SYSDATE, ''DD-MON-YYYY''); ';
      l_source(4) := 'END get_date_string;';
    
      l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
                                  lb  => 1,
                                  ub  => l_source.count);
    
    
    END;
    /
    
Contoh hasil wrapping cara pertama :

CREATE OR REPLACE function wrap_test wrapped 
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
6e 9a
IgQHR6lRS46V6yUCBpIlirzcrOowg8eZgcfLCNL+XhaW8lbjlqFi0e4JptbKschQyiQCfMbK
FyjGyu9LTRd8dcDAMv7S1sXWJl7QWWJQzIVWzBZylpfcLszEOdmYkr4WRlutOdsHUzkHVNV8
pqbvCP2M
/
Anda bisa juga memakai function DBMS_DDL.WRAP dengan menganalisa dari contoh pemakaian procedure DBMS_DDL.CREATE_WRAPPED.

Mengirim HTML email melalui PL/SQL and Gmail (2)

Pada contoh posting sebelumnya masih sederhana dimana kita belum bisa mengirim email dengan attachment, html. untuk contoh selanjutnya kita akan memperluas procedure kirim email melalui procedure berikut dengan sedikit modifikasi pada bagian :
  • deklarasi  spesifik ke gmail :
  • v_smtp_domain    varchar2 (256)     := 'gmail.com';
  • menambahkan
  • utl_smtp.ehlo(v_mail_conn, v_smtp_domain);
  • menon aktikan
  • -- utl_smtp.helo(v_mail_conn, p_smtp_host);
Maka sekarang kita bisa gunakan untuk kebutuhan gmail dengan stunnel :

CREATE OR REPLACE PROCEDURE custom_send_mail (
  p_to          IN VARCHAR2,
  p_cc          IN VARCHAR2 DEFAULT NULL,
  p_bcc         IN VARCHAR2 DEFAULT NULL,
  p_from        IN VARCHAR2,
  p_subject     IN VARCHAR2,
  p_text_msg    IN VARCHAR2 DEFAULT NULL,
  p_html_msg   IN CLOB DEFAULT NULL,
  p_attachments IN table_attachments DEFAULT NULL,
  p_smtp_host   IN VARCHAR2,
  p_smtp_port   IN NUMBER DEFAULT 25,
  p_username    IN VARCHAR2 DEFAULT NULL,
  p_password    IN VARCHAR2 DEFAULT NULL)
AS
  v_mail_conn   UTL_SMTP.connection;
  v_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
  v_step        PLS_INTEGER  := 24573;
  v_length PLS_INTEGER;
  v_begin PLS_INTEGER := 1;
  v_buffer_size INTEGER := 75;
  v_raw RAW(32767);
  v_smtp_domain    varchar2 (256)     := 'gmail.com';
BEGIN
  /* **** Author: Josep Coves
      **** Version: 1.0
      **** Date: 08/06/2012
      **** josepcoves@relational.es
      **** http://www.relational.es
      **** Based on Tim's procedure, Thanks  Tim!
      **** http://www.oracle-base.com/articles/misc/email-from-oracle-plsql.php#html
   */
  v_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  utl_smtp.ehlo(v_mail_conn, v_smtp_domain);
  utl_smtp.command( v_mail_conn, 'AUTH LOGIN'); 
 
  --Establish SMTP connection
  IF (p_username IS NOT NULL) THEN
    utl_smtp.command( v_mail_conn, UTL_RAW.cast_to_varchar2( UTL_ENCODE.base64_encode( UTL_RAW.cast_to_raw( p_username ))) );
    utl_smtp.command( v_mail_conn, UTL_RAW.cast_to_varchar2( UTL_ENCODE.base64_encode( UTL_RAW.cast_to_raw( p_password ))) );
  END IF;
 
 -- utl_smtp.helo(v_mail_conn, p_smtp_host);
  utl_smtp.mail(v_mail_conn, p_from);
  utl_smtp.rcpt(v_mail_conn, p_to);
 
  utl_smtp.open_data(v_mail_conn);
 
  utl_smtp.write_data(v_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
  IF (p_cc IS NOT NULL) THEN
    utl_smtp.write_data(v_mail_conn, 'CC: ' || p_cc || UTL_TCP.crlf);
  END IF;
  IF (p_bcc IS NOT NULL) THEN
    utl_smtp.write_data(v_mail_conn, 'BCC: ' || p_bcc || UTL_TCP.crlf);
  END IF;
  utl_smtp.write_data(v_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'Content-Type: multipart/mixed; boundary="' || v_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
  --Plain Text Body
  IF p_text_msg IS NOT NULL THEN
    utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
    utl_smtp.write_data(v_mail_conn, 'Content-Type: text/plain; charset="iso-8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);
 
    utl_smtp.write_data(v_mail_conn, p_text_msg);
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
 
  ELSIF p_html_msg IS NOT NULL THEN
    -- HTML Body
    utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
    utl_smtp.write_data(v_mail_conn, 'Content-Type: text/html; charset="iso-8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);
    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_html_msg) - 1 )/v_step) LOOP
      utl_smtp.write_data(v_mail_conn,  DBMS_LOB.SUBSTR(p_html_msg, v_step, i * v_step + 1));
    END LOOP;
 
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
  END IF;
 
  IF p_attachments IS NOT NULL THEN
 
   FOR i IN 1..p_attachments.COUNT
   LOOP
 
     utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Type: ' ||p_attachments(i).attachment_mime || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Transfer-Encoding: base64' || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Disposition: attachment; filename="' || p_attachments(i).attachment_name || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
 
     v_length := DBMS_LOB.getlength(p_attachments(i).attachment_blob);
     v_begin := 1;
     v_raw := NULL;
     v_buffer_size := 75;
     WHILE v_begin < v_length LOOP
        DBMS_LOB.read( p_attachments(i).attachment_blob, v_buffer_size, v_begin, v_raw );
        utl_smtp.write_raw_data( v_mail_conn, UTL_ENCODE.base64_encode(v_raw) );
        utl_smtp.write_data( v_mail_conn, UTL_TCP.crlf );
        v_begin := v_begin + v_buffer_size;
     END LOOP ;
 
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
 
   END LOOP;
 
  END IF;
 
  utl_smtp.write_data(v_mail_conn, '--' || v_boundary || '--' || UTL_TCP.crlf);
  utl_smtp.close_data(v_mail_conn);
 
  utl_smtp.quit(v_mail_conn);
 
END;
/

Selanjutnya kita bisa pakai untuk mengirim, text bisa, html dan attachement. berikut contoh pemakaian untuk mengirim gambar product dari tabel DEMO_PRODUCT_INFO.

DECLARE
  v_clob clob := 'Test email';
  v_blob blob;
 
  t_a table_attachments := NULL;
  v_a mail_attachment ;
BEGIN
 
   SELECT mail_attachment(t.FILENAME,t.MIMETYPE,t.PRODUCT_IMAGE)
              BULK COLLECT INTO t_a
     FROM DEMO_PRODUCT_INFO t;
 
     custom_send_mail (p_to     => '<your_recipient@mail.com>',
                       p_from   => '<yourgmailname@gmail.com>',
                       p_subject     => 'test',
                       p_html_msg => v_clob,
                       p_attachments => t_a,
                       p_smtp_host =>  'localhost',
                       p_smtp_port   => 1925,
                       p_username => 'yourgmailname@gmail.com',
                       p_password  =>  'yourgmailpassword');
END;
/

Maka pada email penerima akan muncul:

Jumat, 12 Oktober 2012

Mengirim HTML email melalui PL/SQL and Gmail (1)

Didalam apex memungkinkan kita untuk integrasi dengan system email smtp yang telah ada. Anda bisa setup melalui WS: internal pada bagian Manage Instance>>Instance Settings>>Email
Dengan integrasi itu kita bisa memakai package yg telah disediakan apex yaitu : APEX_MAIL dan bisa melakan report subscription dan download report melalui email.

Namun saat kita tidak memiliki server email yang bisa kita pake, maka kita bisa memakai alternatif dari gmail. untuk mengimplementasikannya tanpa banyak nyeng-nyong lagi anda bisa pelajari dari bang HÃ¥vard Kristiansen blog.

Catatan :
  • Anda harus mengerti konsep ACL (jika memakai 11g)
  • Anda telah memberi akses ke package UTL_SMTP dan UTL_TCP.
  • Email bisa dikirm melalui pesan html dengan memodifikasi code:
  • write_mime_header (l_conn, 'Content-Type', 'text/plain');
    
    Menjadi
    write_mime_header (l_conn, 'Content-Type', 'text/html');
  • Anda bisa menambahkan inline image (image harus public bisa dibaca) atau style
  • Saya sudah test kirim ke yahoo dan gmail, untuk yahoo image tampil, gmail tidak berhasil

Contoh Pemakaian :
DECLARE
  l_html VARCHAR2(32767);
BEGIN
  l_html := '<html>
    <head>
      <title>HTML with table message</title>
    </head>
    <body>
      <p>This is a <b>HTML with Table and Image</b> <i>version</i> of the test message.</p>
<table border="1"><tbody>
<tr> <th>Hari</th> <th>Topik</th>  </tr>
<tr> <td>Hari 1</td> 
<td><ul>
<li>Preview Oracle APEX</li>
<li>Instalasi APEX dengan arsitektur EPG</li>
<li>Membuat dan mengatur workspace</li>
<li>Akses file image memakai FireFTP</li>
</ul>
</td>
</tr>
<tr> <td>Hari 2</td> 
<td><ul>
<li>Konsep SQL Workshop</li>
<li>Manipulasi Objek Database memakai SQL Workshop (tutorial)</li>
<li>Konsep Application Builder</li>
<li>Konsep Session State &amp; URL Syntax</li>
<li>Membuat Aplikasi Database dari sebuah file spreadsheet (tutorial)</li>
</ul>
</td>
</tr>
<tr> <td>Hari 3</td> 
<td><ul>
<li>Konsep Form, Report</li>
<li>Konsep Page, region komponen (computation,process,validation dan branching)</li>
<li>Membuat Aplikasi Database From Scratch (tutorial)</li>
<li>Konsep chart, calendar dan map </li>
<li>Konsep Theme, template dan file </li>
<li>Membuat Aplikasi Database From Scratch II (tutorial)</li>
</ul>
</td>
</tr>
<tr> <td>Hari 4</td> 
<td><ul>
<li>Konsep Interactive Report</li>
<li>Konsep Shared Component</li>
<li>Konsep Navigasi,tree, list, tab, breadcrumb </li>
<li>Konsep Dynamic Action, Plugin</li>
<li>Demo tutorial </li>
</ul>
</td>
</tr>
<tr> <td>Hari 5</td> 
<td><ul>
<li>Konsep Administration</li>
<li>Konsep Application and Page Utilities</li>
<li>Konsep Security (authentication &amp; authorization)</li>
<li>Demo (tutorial)</li>
<li>Konsep Deploy Application</li>
<li>Demo (tutorial)</li>
</ul>
</td>
</tr>
</tbody></table>      
      <p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDRQTzDp14vFVpCREZ3WKxvbK8RxY4y8XzLCrwjwcudiHVmn7uRIcQ_M3uPMl9kQp7HT5P8zPc9m_QnLRT4vxSdLc-QpurQ1ecPTqrDT_K1AjmP58ChPME9GLmrG8GL7511eiIVeHSq9w/s200/bonexlogo.png" alt="Bonex Logo" />
    </body>
  </html>';

           g_mail. send_mail_html (
      'yourgmailaccount@gmail.com'
    , 'yourmail_recipient'
    , 'subject html',l_html
   );
END;
/
 
Tampilan di email yahoo penerima :
 

Jumat, 05 Oktober 2012

How to Obfuscate DADS Password on OHS 11g Windows

Pada posting sebelumnya untuk OHS 10g bisa dilihat disini.
Untuk OHS 11g ternyata berbeda, file dadtool.README yang memuat step-by-step obfuscate password tidak ada. tapi bisa di temui langsung di file dadtool.pl atau melalui script
perl dadTool.pl -h


Namun meskipun kita diikuti tetap tidak berhasil untuk kasus windows. Setelah coba sana-sini plus googling ternyata langkahnya berbeda. Yaitu:
  1. Lewat command prompt masuk ke direktori %ORACLE_HOME%\bin :
  2. cd D:\bea_default\Oracle_WT1\bin
    
  3. Set ORACLE_HOME :
  4. set ORACLE_HOME=D:\bea_default\Oracle_WT1
    
  5. Lakukan Obfuscating:
  6. perl dadTool.pl -f D:\bea_default\Oracle_WT1\instances\instance1\config\OHS\ohs1\mod_plsql\dads.conf
    
  7. Pastikan Hasilnya:
  8. All passwords successfully obfuscated. New obfuscations : 1
    

Catatan :
  • Oracle Home: D:\bea_default\Oracle_WT1
  • File dads.conf ada di: D:\bea_default\Oracle_WT1\instances\instance1\config\OHS\ohs1\mod_plsql

Kamis, 04 Oktober 2012

Migrating APEX from EPG to OHS

Mungkinkah hal itu bisa dilakukan dalam mesin yang sama?
Ternyata bisa dan cukup mudah. workspace dan aplikasi yang telah ada tidak ada pengaruhnya, hanya masalah memindahkan broker dan File images saja antara EPG menjadi OHS.
Lakukan hal-hal berikut:
  1. Install OHS. contoh home D:\bea_default\Oracle_WT1
  2. Pastikan akses ke http://localhost:7777 berhasil (default OHS 7777)
  3. Pindahkan file images ke folder images dimana /i/ OHS akan di definisikan. contoh D:\bea_default\APEX41. (pindahkan memakai fireFTP, Filezilla atau cyberduck).
  4. Unlock dan beri password user APEX_PUBLIC_USER
  5. Edit dads.conf
  6. Alias /i/ "D:\bea_default\APEX41\images/"
    <location /pls/apex>
    Order deny,allow
    PlsqlDocumentPath docs
    AllowOverride None
    PlsqlDocumentProcedure wwv_flow_file_mgr.process_download
    PlsqlDatabaseConnectString localhost:1521:ORCL 
    PlsqlNLSLanguage AMERICAN_AMERICA.AL32UTF8
    PlsqlAuthenticationMode Basic
    SetHandler pls_handler
    PlsqlDocumentTablename wwv_flow_file_objects$
    PlsqlDatabaseUsername APEX_PUBLIC_USER
    PlsqlDefaultPage apex
    PlsqlDatabasePassword password_APEX_PUBLIC_USER_ente
    PlsqlRequestValidationFunction wwv_flow_epg_include_modules.authorize
    Allow from all
    </location>
    
  7. Stop OPM.
  8. Delete file images yang ada di database (memakai fireFTP, Filezilla atau cyberduck).
  9. Tutup port 8080 yang dipake EPG
  10. EXEC DBMS_XDB.SETHTTPPORT (0);
    
  11. Lock user ANONYMOUS.
  12. Start OPM dan HTTP server.
  13. Akses kembali apex dengan http://localhost:7777/pls/apex 

Catatan : hati-hati pada langkah no 3 adalah memindahkan dari images EPG yg ada didatabase bukan images hasil extract apex. sehingga kerjaan sebelumnya tidak akan berubah.

Selasa, 18 September 2012

Changing Listener Port Numbers

Pada kasus ini kita akan mencoba merubah port apex yang terinstall dalam db XE dari default 1521 ke 1522. Hal ini dilakukan karena dalam pc ada dua db yang memakai port yang sama yaitu 1521. jadi salah satu harus kita ubah supaya tidak terjadi konflik.
  1. Stop the listener
  2. Buka file listener.ora yang ada di DIR:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\
  3. Ubah port 1521 menjadi 1522.
  4. Simpan file.
  5. Start listener.
  6. melalui command prompt masuk kedalam sqlplus
  7. Connect dengan system
  8. ALTER SYSTEM SET LOCAL_LISTENER = "(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522))";
  9. ALTER SYSTEM REGISTER;
  10. verifikasi memakai command lsnrctl status pastikan muncul "Service "XE" has 1 instance(s). Instance "XE", status READY, has 1 handler(s) for this service..."
  11. akses kembali apex http://localhost:8080/apex 

Sumber : Managing Network Connections on Oracle® Database Express Edition 2 Day DBA

Jumat, 07 September 2012

Oracle Application Express 4.2 on horizon !

Per tanggal 2 September 2012 apex.oracle.com telah di-upgrade ke Oracle Application Express 4.2. Ehm...menunggu kapan release versionnya untuk dicoba lebih detil. Akankah sesuai dengan janji SOD-nya di April 2012.

Perasaan kalo di release di tahun ini terlalu cepat yak... menurut saya harus lebih lama dulu ditahan supaya bug-bugnya banyak berkurang. Sejak release 4.0 Oracle agresif bener  membuat release terbaru...hebaaat padahal ini teknologi katanya gak bakal di charge include lisensi DB. Jadi ngeper juga nih nanti lama-lama bisa jadi muncul lisensi juga.

Silahkan langsung cek ke TKP perubahan tampilan dan feature-nya.

Senin, 27 Agustus 2012

Membuat theme dan template baru di APEX

Membuat theme baru merupakan hal yang lumayan berat di dalam pengembangan apex, apalagi jika kemampuan html/css/js pas-pasan seperti saya. Setelah berjuang selama 3 hari 3 malam ..lebay :D....akhirnya

Sebuah theme cara bonex berhasil dibuat di oracle.apex. dengan komponen berikut:
  • Theme dasar Bluejay(22).
  • wowslider dan easyaccordion (body).
  • jQuery fisheye pada (footer).
  • Cufon.ui.js
Silahkan diakses disini.


Untuk aplikasi transaksional saya menyarankan untuk memakai theme bawaan dari APEX supaya kecepatan tetap terjaga. Karena terlalu banyak komponen js dan css sangat berpengaruh pada kecepatan.

Kamis, 23 Agustus 2012

Cufon on APEX (implementasi cufon)

Font yang dimiliki APEX tidak cukup cantik?
Silahkan coba memakai cufon. lakukan langkah-langkah berikut.

1. pelajari langkah-langkah nya disini.
2. Download cufon disini.
3. Pada bagian header include js script berikut.
<script type="text/javascript" src="#IMAGE_PREFIX#themes/theme_115/js2/cufon-yui.js"></script> 
<script type="text/javascript" src="#IMAGE_PREFIX#themes/theme_115/js2/mycustom.font.js"></script>

4. Pada bagian header (Function and Global Variable Declaration).
Cufon.replace('a');
Cufon.replace('h1');
Cufon.replace('h2');
Cufon.replace('h3');


Test Drive

Penampakan Sebelum

Penampakan Sesudahnya
Catatan : Pendefinisian js melalui page template tidak berhasil...akhirnya harus didefinisikan di masing-masing page header.

Rabu, 15 Agustus 2012

Integrasi APEX dan Jasper Report

Judul integrasi sebenarnya masih salah kaprah, karena pada dasarnya tidak benar-benar ter integrasi dengan APEX seperti halnya oracle BI publisher dengan APEX. Jadi nanti integrasi ini maksudnya adalah bagaimana anda memanggil report jasper melalui aplikasi APEX :D.

Mengapa memakai jasper report? alasan sederhananya karena Gratis...tis...tis :D dan cukup powerfull untuk membangun report yang bagus.

Beberapa hal yang harus diperhatikan adalah hal berikut:
1. Jasper report berbasis teknologi java dan xml.
2. Anda harus sudah install jasper report servernya.
3. Anda telah memiliki/terinstall report designernya (Jasper iReport).
4. Jangan lupa untuk membedakan port server tomcat dan APEX jika dalam satu PC/server.

Banyak teknik yang bisa dilakukan untuk proses integrasi ini seperti pada hal ini. namun secara pribadi saya lebih menyukai/menganjurkan memakai teknik yang dikembangkan oleh Dietmar Aust.

Oke silahkan ke TKP untuk mencobanya. Disitu anda akan bisa memanggilnya dengan package XLIB_JASPERREPORTS. atau melalui URL dengan melakukan test di http://your_tomcat_host:your_tomcat_port/JasperReportsIntegration/ untuk memperoleh URL-nya.



Special Thanks for Mr Dietmar Aust.



Catatan: Anda bisa download paket jasper report dan ireport disini.
 

Rabu, 01 Agustus 2012

Mac Menu / Dock Menu / Fisheye on APEX

Anda bisa mengimplementasikan dari sumber berikut
Ikuti langkah-langkahnya. sebisa mungkin satu folder di pindahkan ke server.
Contoh pemakaian berikut

Sabtu, 28 Juli 2012

Anything Slider jQuery Plugin into APEX

Jika anda ingin mengimplementasikan Anything Slider jQuery Plugin seperti contoh berikut lakukan langkah-langkah berikut :
  1. Download plugin di sini.
  2. Extract hasil download.
  3. Pindahkan folder (css, images, js)ke dalam image server apex
    • Untuk OHS copy paste kedalam /i/myapp/anythingslider/
    • Untuk EPG memalai filezilla atau fireFTP pindah ke /i/myapp/anythingslider/

Implementasi dapat dilakukan dengan dua cara yaitu :
  • Static Image
    1. Pada page header
    2. <link rel="stylesheet" href="/i/myapp/AnythingSlider/css/anythingslider.css">
      <script src="/i/myapp/AnythingSlider/js/jquery.anythingslider.js" type="text/javascript"></script>
          <style>
              #slider { width: 200px; height: 200px; }
              #slider2 { width: 700px; height: 390px; }
          </style>
      
          <!-- AnythingSlider initialization -->
          <script>
              // DOM Ready
              $(function(){
                  $('#slider').anythingSlider();
              });
              $(function(){
                  $('#slider2').anythingSlider();
        });
       </script>
      
    3. Buatlah sebuah HTML region dengan source
    4. <ul id="slider">
      
      <li><img src="/i/apex/graphics/apex_consolidation.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-architecture.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-bip.png" alt=""></li>
      
      <li><img src="/i/apex/graphics/apex-multitenant.png" alt=""></li>
      
      </ul>
      
  • Dynamic image dari tabel (contoh kasus demo_product_info)
    1. Buatlah hidden item : PX_PRODUCT_ID (jangan lupa ganti x dengan page dimana anda buat)
    2. Buatlah sebuah application process on demand:getting_img
    3. DECLARE
        l_lob      BLOB;
        l_length   NUMBER;
        l_mimetype VARCHAR2(2000);
        l_filename VARCHAR2(2000);
      BEGIN
      --
        SELECT product_image,
          mimetype,
          filename
        INTO l_lob,
          l_mimetype,
          l_filename
        FROM demo_product_info
        WHERE product_id = :PX_PRODUCT_ID
        ;
        --
        l_length := DBMS_LOB.getlength(l_lob);
        --
        htp.flush;
        htp.init;
        --
        owa_util.mime_header(nvl(l_mimetype,'application/octet'), FALSE);
       
        htp.p('Content-length:' || l_length);
        htp.p('Content-Disposition:inline;filename="' || l_filename || '"');
        --
        -- close the headers
        owa_util.http_header_close;
        --
        -- download the BLOB
        wpg_docload.download_file(l_lob);
      --
      END;
      
    4. Buatlah sebuah region : PL/SQL anonymous block
    5. DECLARE
      BEGIN
          HTP.prn('<ul id="slider">'); 
       FOR c1 IN(
          SELECT product_id,
            product_name
          FROM demo_product_info
          WHERE NVL(dbms_lob.getlength(product_image),0) > 0
        )LOOP
       
          HTP.prn('<li>');           
          HTP.prn('<div class="clist">');
          HTP.prn('<img src="f?p=&APP_ID.:&APP_PAGE_ID.:&APP_SESSION.:APPLICATION_PROCESS=getting_img:NO::PX_PRODUCT_ID:' || c1.product_id || '" alt="" />');
          HTP.prn('<p>' || c1.product_name || '</p>');
          HTP.prn('</div>');
          HTP.prn('</li>');
       
        END LOOP;
          HTP.prn('</ul>');
      END;
      

Maka akan kita lihat hasil penampakan seperti berikut:
  • Static image
  • Dynamic image

Minggu, 22 Juli 2012

Modal Dialog using iFrame

Kebutuhan tingkat lanjut dalam penggunaan jQuery UI untuk form dialog bisa di penuhi dengan dua cara yaitu.
  • Memakai cara biasa dengan mendefinisikan <div></div> yang ada didalam page tersebut, kemudiann mendefinisikan code jQuery di page tersebut. Tehnik ini memiliki kelemahan jika kita butuh proses yang sama untuk banyak page yang nantinya akan memerlukan code spesifik terhadap page tersebut. bayangkan jika kebutuhan seperti itu ada 10 page?. Anda bisa pelajari dasarnya di sini.
  • Memakai iFrame dalam page 0 (zero) . Tehnik ini memerlukan definisi jS di page zero, dan memodifikasi branching di page form process memakai  : Branch to PL/SQL Procedure.

Detail prosesnya adalah sebagai berikut
  1. Pada page zero buatlah region (Before footer)sbb
  2. <script type="text/javascript">
    function iFrameModal(pHref, pW,pH,pT){
    var vpad=10;
    $( "#iFrameModal:ui-dialog" ).dialog( "destroy" );
    $('<iframe id="iFrameModal"  src="' + pHref + '" />').dialog({
            autoOpen: true,
            title:pT,
            width: pW,
            height: pH,
            modal: true,
            resizable: true
        }).width(pW-vpad).height(pH-vpad); 
    };
    </script>
    
  3. Buatlah page form with report tabel EMP contoh akan memakai page 21 (report) dan 22 (Form)
  4. Pada page 21 (report) lakukan perubahan berikut:
    • Tombol Create ubah menjadi :
    • javascript:iFrameModal('f?p=&APP_ID.:22:&SESSION.::NO:22::',390,435,'Create: EMP');
    • Link Report ubah menjadi :
    • javascript:iFrameModal('f?p=&APP_ID.:22:&APP_SESSION.::::P22_EMPNO:#EMPNO#',600,400,'Edit : EMP');
      
  5. Pada page 22 (Form) lakukan perubahan berikut:
    • Delete atau buat conditional Never untuk existing branching
    • Buatlah branching baru dengan tipe Branch to PL/SQL Procedure :
    • BEGIN
      --closes this popup window
      htp.p('<body>');
      htp.p('<script type="text/javascript">');
      htp.p('parent.doSubmit(''DUMMY'');');
      htp.p('parent.$(''this'').dialog(''close'');');
      htp.p('</script>');
      htp.p('</body>');
      END;
      

Catatan : Page template untuk page 22 (Form) gunakan popup atau modifikasi template printer friendly dengan menghilangkan bagian navbar dan logo.
Contoh demo bisa dilihat di sini.
Sumber : Oracle APEX Forum.

Senin, 16 Juli 2012

Implementasi jQuery UI ke dalam APEX

Pada dasarnya APEX sudah merupakan murni aplikasi web yang sama sekali berbeda dengan Oracle Form developer. Karena itu pengetahuan tentang JS, HTML, CSS akan berpengaruh banyak dalam pengembangannya.

Library jQuery sudah include didalam apex dengan direktory #IMAGE_PREFIX#libraries/ untuk versinya pada APEX terakhir (4.1.1) adalah 1.4.2 dan 1.6.2 sedangkan untuk UI adalah 1.8.

Meskipun APEX sendiri telah memakainya secara internal dengan memanggil fungsi-fungsi tertentu seperti apex.jQuery bisa diganti dengan $. Namun untuk pemakaian yang spesifik seperti UI widget kita harus mendefinisikan terlebih dahulu didalam template, header/footer sebuah page yang akan kita pakai. contoh
  • Theme
  • <link rel="stylesheet" href = "#IMAGE_PREFIX#libraries/jquery-ui/1.8/themes/
    ui-lightness/jquery-ui.css" type="text/css" />
    
  • UI
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.ui.accordion.js" type="text/javascript"></script>
    <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.ui.sortable.js"></script>
    
  • Effects
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/ui/jquery.effects.explode.js"></script>
    
  • External Cookie
  • <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8/external/jquery.cookie.js" type="text/javascript"> </script>
    
Kita bisa mengimplementasikan contoh demo jQuery UI kedalam APEX. Seperti demo contoh yang saya buat.
Namun implementasi di dalam APEX sebisa mungkin memakai template supaya bisa digunakan berulang-ulang sesuai kebutuhan. Selamat mencoba.

Rabu, 11 Juli 2012

Mengapa memakai Dynamic Action

Untuk yang berhubungan dengan client interactivity APEX bisa di handle memakai JS/jQuery. Mulai release 4.0 APEX sudah terintegrasi dengan jQuery 1.4.2 dan 1.6.2 jadi tidak perlu lagi upload library ke dalam APEX.

Membangunnya bisa dengan cara manual atau memakai Dynamic Action (DA). Lantas mengapa kita lebih disarankan untuk memakai cara kedua? berikut alasannya.
  • Dengan Dynamic Action kita bisa secara declarative mengetahui dimana dan bagaimana code tersebut bekerja. Sehingga bisa dibayangkan menjadi trigger dalam form developer.
  • Ini lebih mudah untuk programmer yang tidak berpengalaman di teknologi web (JS/jQuery) seperti saya.
  • Yang terpenting menurut saya adalah dengan menggunakan  DA maka feature tambahan akan bisa di implementasikan seperti Condition, Authorization (Security) dan Development (Build Option).

Tiga Cara Highlight Row untuk Classic Report

Untuk melakukan hal ini ada 3 cara.
  1. Melalui CSS.
  2. Melalui cara ini buatlah di bagian header/footer page atau header/footer Region report. Jangan lupa region id diberi nama EMP_REPORT
    #EMP_REPORT .highlight-row:hover > td {
    background-color: red;
    }
    
  3. Melalui JS/jQuery
  4. Cara kedua bisa dilalukan dengan atau tanpa dynamic action yaitu:
    • Event : Page load
    • Action : Execute JavaScript Code
    • Setting :
    • $(this.affectedElements).prepend(
        ''
      );
      
    • Effect : Region (pilih region report yang akan di highlight)
  5. Melalui Template Report
  6. Melalui cara ini kita harus melakukan edit template report yang kita pakai. contoh STANDARD.
    • Before Each Row :
    • <tr #HIGHLIGHT_ROW#>
      
    • After Each Row :
    • </tr>
      
    • Row Highlighting : Background color for current row = red

Kamis, 05 Juli 2012

How to Change Number of Rows on Tabular Form/Report

Salah satu masalah atau bisa saya anggap sebagai Bug saat membuat tabular form atau report adalah kesulitan saat kita mencoba merubah jumlah row yang tampil per page atau merubah pagination.

Meskipun pada property Report Attribute pada bagian layout and pagination ada beberapa property yang mengatur perubahan tersebut, namun saat di aplikasikan akan timbul masalah yaitu efek perubahan dari perubahan Number of Rows, Number of Rows (item) atau Pagination saat apply dan dijalankan report tetap tampil seperti semula tidak berubah. sampai release terakhir (4.1.1) masih terjadi seperti ini.

Hal itu disebabkan karena browser masih menyimpan cache dari tampilan sebelumnya. Meskipun pada property page kita sudah atur Server Cache >> Cache Page: No.

Solusinya adalah kita harus menambahkan sebuah proses reset pagination pada process poin : on On Load - Before Header.

Silahkan dicoba.

Jumat, 22 Juni 2012

Implementasi Session State Protection

Salah satu feature APEX untuk menangkal serangan URL tampering adalah mengaktifkan Session State Protection. User yang mengerti konsep syntax URL APEX sangat mudah untuk melakukan perubahan session state (contoh nilai page item) memakai URL.

Session State Protection bisa diaktifkan melalui Home>>Application Builder>>Application XXX>>Shared Components>>Session State Protection>>Set Application Protection.


Implikasinya kita harus menyediakan sebuah URL dengan sebuah checksum pada link-link yang tidak disediakan melalui standard branching APEX seperti memakai js popup , jquery modal atau Tree link. URL tersebut dimodifikasi memakai APEX API PREPARE_URL Function. berikut contoh penggunaannya.
  1. Tree
  2. select case when connect_by_isleaf = 1 then 0
                when level = 1             then 1
                else                           -1
           end as  status, 
           level,
    a.description as title,            
         '#WORKSPACE_IMAGES#myicon.gif'   as icon, 
           a.ALIAS as value, 
           a.TOOLTIP_MENU as tooltip, 
           case when a.status in ('F','R') then
            APEX_UTIL.PREPARE_URL('f?p=&APP_ID.:'||a.ALIAS||':&SESSION.::NO:CIR:P1_SELECTED_NODE:'||a.ALIAS) 
           else
            APEX_UTIL.PREPARE_URL('f?p=&APP_ID.:1:&SESSION.::NO:CIR:P1_SELECTED_NODE:'||a.ALIAS)
           end as link 
    from TREE_MENU01 a
    start with a.STATUS ='X'
    connect by prior a.ID = a.MENU_ID
    order siblings by a.SEQ
    
  3. Report dengan js popup
  4. select ' Order #' || o.order_id || '' edit, 
    p.product_name, oi.quantity, oi.unit_price, (oi.quantity * oi.unit_price) ext_price, o.user_name, o.order_timestamp
    from demo_orders o, demo_order_items oi, demo_product_info p
    where customer_id = :P7_CUSTOMER_ID
    and o.order_id = oi.order_id
    and oi.product_id = p.product_id
    order by o.order_id, o.order_timestamp, o.user_name
    
Catatan : Kita sebenarnya bisa me non-aktifkan sebagian page dan item yang memakai pop-up atau modal menjadi unrestricted sehingga tidak perlu memakai APEX_UTIL.PREPARE_URL, karena pada dasarnya URL untuk pop-up dan modal tidak bisa di edit bukan? kecuali untuk link tree atau report/button yang memakai javascrip code untuk redirect non pop-up atau modal tetap memakai APEX_UTIL.PREPARE_URL.

Sumber: Oracle® Application Express API Reference Release 4.1

Selasa, 15 Mei 2012

Upgrade 4.1 modal jquery with iframe not working

Setelah Upgrade ke versi terbaru APEX 4.1 aplikasi exsisting yang memakai banyak jquery modal berbasis iframe gagal dengan symptom popup modal muncul namun blank.

Lama dicari penyebabnya karena di production (OHS) berhasil namun di development (EPG) gagal. akhirnya nyerah pake popup biasa. Saat browsing hal lain gak sengaja baca blog Dan McGhan akhirnya ketemu penyebabnya.

Di apex 4.1 ada security attribute untuk browser, server production karena upgrade secara existing Embed in Frames: Allow sedangkan di development karena fresh install secara default ternyata Deny.

Bah...ternyata cuma gitu doang hehehe.

Minggu, 29 April 2012

Mengintip Oracle Application Express 4.2

Kabar baik bagi pemakai teknologi APEX selain dinyatakan sebagai komponen dari database juga di jelaskan untuk versi ke depan APEX 4.2 akan kemana arahnya. SOD Apex menyatakan hal-hal berikut:
  • Mobile Applications – Enhanced themes and HTML templates to enable developers to declaratively create mobile applications and/or mobile pages.
  • Charts - Incorporate HTML 5 charting capabilities.
  • Web Services – Provide declarative specification of RESTful Web services mapped to SQL and PL/SQL.
  • Application Deployment – Provide enhanced capabilities for packaging and distributing APEX applications to improve protection of intellectual property rights and ease customization.(ini mungkin bisa mengatasi proteksi source code apex yang biasanya hanya bisa diproteksi memakai wrap code dari database)
  • Numerous functional and performance improvements.
Jadi bersiaplah ke era mobile dan cloud computing dengan Oracle APEX. yiiihaaa

Application Express 4.2 Early Adopter 1 Feature Description

Oracle APEX Licensing

Banyak sekali keraguan client yang saya temui atas lisensi dari teknologi ini, apakah benar tidak akan dikenakan biaya lagi? atau bahkan ada yang menganggap teknologi ini adalah benar-benar free karena adanya oracle XE.

Untuk posting kali ini saya coba cari informasi sebenarnya mengenai lisensi dari Oracle APEX. Dari OTN License Agreement for Oracle Application Express masih belum jelas apa maknanya. Di Oracle Price List juga saya cari tidak ada mengenai licensing dari APEX dan komponen dari database. Namun saat kita install oracle Db 11g maka secara otomatis component APEX akan tersedia, dengan asumsi itu di beberapa forum mengatakan APEX adalah bagian dari Database dan tidak dikenai charge tambahan jika memakainya. Melihat kemampuan dan perkembangannya yang mengagumkan mungkinkah nanti akan dikenakan charge tambahan untuk teknologi ini?

Berita terbaru dari Statement of Direction for Oracle Application Express (SOD) di bulan April 2012 di pastikan bahwa.
  1. Oracle APEX sejak Februari 2004 adalah bagian dari feature dari Oracle database 10g.
  2. Oracle APEX adalah sebuah standard database component dari Oracle Database 11g.
  3. Oracle’s Support Policy
  4. Oracle Application Express is a standard feature and component of the Oracle Database. Support guidelines for Oracle Application Express are similar to those specified for the Oracle Database.
  5. Pada bagian "Future Investment".
  6. As a key component of the Oracle Database, Oracle intends to continue enhancing Oracle Application Express. Oracle Application Express will be included with the next version of the Oracle Database as a standard database component. The Oracle Database Cloud Service is being built on the multi-tenant infrastructure of Oracle Application Express, and Oracle Application Express will be the standard development tool included with the Database Cloud Service.
Jadi dari informasi tersebut telah jelas bahwa: Lisensi oracle APEX adalah include dalam lisensi Oracle Database. Artinya ini gratis jika anda memiliki lisensi Oracle Database.

Jumat, 23 Maret 2012

How to implement Tabs with image

Untuk menginplementasikan image sebagai ganti dari label apex 4.1.1 telah menyediakan bagian image dalam tab yaitu : Current Tab Image dan Non Currrent Tab Image. adapun yang harus diperhatikan adalah :
  1. Spesifikasikan sebagai nama file image saja contoh: Home.png
  2. Keduanya akan di referensikan dengan substitution #TAB_IMAGE#
  3. Edit page template pada Standard Tab Attributes:
  4. #TAB_IMAGE#
  5. Pindahkan image ke bawah folder :/i/Home.png
  6. Inspect dengan Firebug akan diperoleh:
Lantas bagaimana jika kita tidak memiliki akses ke /i/ ?
Maka kita gunakan sedikit kreatifitas kita dengan melakukan hal berikut:
  1. Spesifikasikan sebagai nama file image disamakan dengan format berikut #TAB_LABEL#_current.png contoh: Home_current.png
  2. Edit page template pada Standard Tab Attributes:
  3. #TAB_LABEL#
  4. Upload image melalui Shared Component>>Images :Home_current.png
  5. Lihat hasilnya:

Jumat, 16 Maret 2012

Integrasi dengan Oracle BI Publisher 3 (Calling BI Publisher report Using URL)

Setelah kita melakukan integrasi APEX dengn BI Publisher di posting Integrasi dengan Oracle BI Publisher 1 dan Integrasi dengan Oracle BI Publisher 2. maka langkah selanjutnya adalah memanggil report yang dibuat Bi publisher melalui URL. langkah ini paling mudah namun memerlukan user dan password yang terbuka. Tapi hal itu bisa diatasi dengan membuat user tersebut tidak diberikan hak akses developer. adapun langkahnya adalah :
  • Buatlah page dalam aplikasi apex dengan item berikut : contoh kasus page 16
    • P16_DNAME:departement: PopUp LOV
    • P16_FORMAT:format:select list
    • Button : submit
  • Copy URL dari report yg telah kita buat di BI publisher contoh kasus (Report Based on OracleDB with Parameter)dengan mode 4:link to this report :document only
  • Buatlah function javascript pada bagian function page apex
  • function PopUpPrint() {
        var url; 
      url = 'http://localhost:9704/xmlpserver/~lutfi/Belajar/Based on OracleDB with Parameter LOV/Based on OracleDB with Parameter LOV.xdo?id=prodin&passwd=hedir&_xpf?_xpf=&_xpt=0&_xdo=%2F~lutfi%2FBelajar%2FBased%20on%20OracleDB%20with%20Parameter%20LOV%2FBased%20on%20OracleDB%20with%20Parameter%20LOV.xdo&p_dname='+$v('P16_DNAME')+'&_xt=Template1&_xf='+$v('P16_FORMAT')+'&_xmode=4' ;
    popupURL(url);
      }
    
  • Ubahlah action on button click:
    • Action: Redirect to URL
    • URL Traget:
      javascript:PopUpPrint();
  • Test drive

maksud dan tujuan dari URL tersebut itu gimana nanti saja menyusul, capek ngetiknya pingin molor dulu hehehe

How to Patch BI Publisher 10g

Setelah pake Oracle BI Publisher 10g (10.1.3.4.1) standalone with OC4J untuk production, terasa tidak stabil sering muncul error dan kadang report blank seperti hang, yang solusinya hanya bisa dilakukan dengan melakukan restart BI publisher.
Setelah memperoleh file patch dari metalink. no 13399232 saya coba share langkah-langkah yang dilakukan untuk proses tersebut.
  1. Unpack patch ke folder temp dimana akan diperoleh hasil berikut:c:\temp\p13399232_10g_Generic\ dengan dua folder non-oc4j dan oc4j, nanti kita akan memakai yang oc4j karena kasusnya adalah standalone
  2. Lakukan copy backup file xmlp-server-config.xml yang ada di \oc4j_bi\j2ee\home\applications\xmlpserver\xmlpserver\WEB-INF
  3. Lakukan copy backup file report yang telah kita buat beserta demo yang ada di folder: /xmlp/XMLP
  4. Jika kita telah membuat scheduler yang terinstall pada schema database tertentu (kasus tutorial BIPSCHED) lakukan backup schema tsb, kalo tidak skip ke langkah berikutnya
  5. Login ke enterprise manager console:http://[your_host]:9704/em : contoh http://localhost:9704/em
  6. Login memakai user oc4jadmin dan password yg anda simpan saat instalasi.
  7. Lakukan undeploy aplikasi xmlpserver: saat berhasil login ke tab application>>pilih xmlpserver >> undeploy
  8. Lakukan proses undeploy sampai muncul konfimasi berikut:
  9. Lakukan proses deploy aplikasi xmlpserver: ambil file xmlpserver.ear yang ada di file patch c:\temp\p13399232_10g_Generic\oc4j\xmlpserver.ear
  10. Ketikkan nama aplikasi : xmlpserver
  11. Tunggu proses
  12. Pastikan muncul pesan windows berikut
  13. Copykan kembali file backup xmlp-server-config.xml ke folder asal \oc4j_bi\j2ee\home\applications\xmlpserver\xmlpserver\WEB-INF
  14. Restart BI Publisher
  15. Test drive dengan login ke http://[your_host]:9704/xmlpserver dengan username : Administrator

Catatan :
  • untuk perintah shutdown BI publisher pada file readme tidak perlu dilakukan karena kasus ini adalah oc4j.
  • Kalo ternyata dalam perkembangan masih belum stabil pikirkan untuk upgrade saja ke versi terbaru BI Publisher 11g :D

sumber : readme file patch 13399232

Senin, 06 Februari 2012

Integrasi dengan Oracle BI Publisher 2

Setelah melakukan integrasi dengan Oracle BI Publisher, apa yang akn kita peroleh?
  • Download Interactive Report bisa di perluas kedalam : file XLS, RTF dan PDF
  • Print Attributes dapat diaktifkan pada report classic atau IR dengan memakai print URL dan dapat pula merubah attribute report saat akan ditampilkan melalui BI Pub
  • Kita bisa membuat report sederhana langsung memakai Shared Component APEX : Report Queries & Report Layouts yang hasil akhirnya berupa URL
  • Kita bisa membuat kompleks report didalam OBI Pub server yang kemudian nanti akan kita panggil melalui apex dengan web service atau dengan cara sederhana memanggil URL yang di sediakan oleh BI Pub.
  • Untuk membuat bagaimana cara memanggil report yang telah dibuat oleh BI Publisher tunggu posting selanjutnya oke.

Senin, 23 Januari 2012

Integrasi dengan Oracle BI Publisher

Salah satu report report server yang bisa di integrasikan dengan Oracle APEX adalah Oracle BI Publisher. berikut langkah2nya:
  1. Akses ke dalam halaman BI Publisher : http://[host]:9704/xmlpserver/: contoh http://localhost:9704/xmlpserver/
  2. Pastikan muncul page berikut:
  3. Login memakai user Administrator
  4. Buat koneksi ke database APEX
    • Masuk ke Admin>>Data Sources>>JDBC connection>>Add Data Source
    • Buat data source
      • Data Source Name : XE
      • Driver Type : Oracle 11g
      • Database Driver Class : oracle.jdbc.OracleDriver
      • Connection String : jdbc:oracle:thin:@localhost:1522:XE
      • Username : Your Username
      • Password : Your Password
      • Test Connection
      • Pastikan: Connection established successfully
  5. Integrasikan dengan APEX
    • Login Ke dalam Workspace : Internal
    • Username : admin
    • Masuk ke : Manage Instance >>Instance Settings>>Report Printing
      • Print Server : Oracle BI Publisher
      • Print Server Protocol : pilih HTTP or HTTPS
      • Print Server Host Address : localhost atau IP address anda (BI Pub)
      • Print Server Port : 9704
      • Print Server Script : /xmlpserver/convert
      • Apply Changes

Bug 13584762 - Row Highlighting no More Works in Classic Report in APEX 4.1

Bug tersebut terjadi di APEX versi 4.1 dengan efek Template classic report tidak bisa menggunakan highlight row yang biasa di definisikan di level template report.


Solusinya adalah
  1. Rubahlah file javascript : apex_4_1.min.js yang ada di /i/javascript/
    • Untuk OHS lihat pada DADS.conf dimana file tersebut berada
    • Untuk EPG gunakan tool FTP seperti FireFTP :
  2. Rubahlah pada bagian berikut :
  3. function setRowHighlight(a){apex.jQuery("#report_"+a+" .highlight-row").live("hover",function(b)
    
    Menjadi
    function setRowHighlight(a){apex.jQuery("#report_"+a+" .highlight-row").live("mouseover  mouseout",function(b)
    
Kabar terakhir dari oracle melalui patrick wolf patch sudah keluar untuk masalah bug 4.1 yaitu patch# 13331096
Source : Oracle APEX Forum

Jumat, 20 Januari 2012

Memakai FireFTP

Untuk web listener yang memakai EPG maka kita melakukan interaksi dengan file metadata (image, css,js file dalam direktori /i/) harus dilakukan dengan protokol ftp, karena semua file tersebut disimpan dalam database metadata.

Salah satu tool gratis yang bisa di download dalam add-on Mozilla FF adalah Fire FTP.

yang harus diperhatikan adalah :
  1. Pastikan user XDB aktive.
  2. Saat buat koneksi di Fire FTP memakai user system bukan sys.
  3. Aktifkan port FTP (2100):
    • connect sebagai sys
    • aktifkan port
    select dbms_xdb.getftpport from dual;
    EXEC DBMS_XDB.SETFTPPORT(2100);
    
  4. Jika selesai matikan kembali
  5. EXEC DBMS_XDB.SETFTPPORT(0);
    

Catatan : Untuk windows 7 atau Vista biasanya FireFTP bermasalah, anda bisa pakai Filezilla atau CyberDuck.

Kamis, 12 Januari 2012

ORA-20001: You have exceeded the maximum number of email messages per workspace. Please contact your administrator.

Error tersebut terjadi karena:
Ternyata APEX membatasi pengiriman email melalui APIs APEX_MAIL.SEND. dengan default 1000 email per 24 jam.
Setting tersebut anda atur di  WS : internal

Home >>Manage Instance >>Instance Settings
Tab  : Email
Item : Maximum Emails per Workspace
Ubahlah nilainya menjadi : 10000 atau 10000