Social Icons

Pages

Featured Posts

Monday 26 August 2013

INSTALASI iREPORT DESIGNER,JASPER REPORT, XAMPP PHP ADD ON TOMCAT YANG DISOKONG DENGAN CONNECTION DENGAN ORACLE DB


Pengenalan
Persoalan biasa di fikiran programmer web dan khususnya programmer open sources adalah untuk menghasilkan laporan yang pantas, format pdf, boleh design seperti aplikasi oracle report builder, aplikasi crystal report untuk keluarga windows, ada unsur graf, menjana invoice, receipt, matrix report dan sebagainya. Memang sukar jika tiada designer khusus yang berbentuk wizard untuk melakar atau mendesign laporan yang dikehendaki dengan pantas .
Bagaimana anda ingin membangunkan laporan yang diakses oleh bahasa aturcara
Apa yang perlu anda ada ?
Anda perlu mendapatkan perisian seperti yang berikut :-

a.      iReport versi terkini yang boleh dimuatturun secara percuma dari laman web http://jasperforge.org/projects/ireport

b.      Xampp yang di add on dengan tomcat (melarikan aturcara java bersama php) yang boleh dimuatturun melalui laman web
(Versi XAMPP 1.7.7 ke atas sudah ada feature untuk add on tomcat)

c.      Oracle jdbc driver untuk ireport (ojdbc6) yang support untuk oracle db 11g dan ia boleh di dapati dari laman web :
LANGKAH 1 : INSTALASI DAN KONFIGURASI Ireport
1.     Setelah perisian ini didownload, anda perlu runkan setup dan ikut arahan sehingga selesai

2.     Selepas proses install selepas, anda perlu membuka aplikasi ini dan paparan adalah seperti yang di bawah :





3.   Untuk mendapatkan connection dengan pangkalan data oracle, aplikasi ini memerlukan driver oracle jdbc untuk ditambah sebagai library. Justeru itu, driver oracle jdbc yang telah dimuatturun dalam langkah awal tadi perlu diletakkan di dalam folder \libs iaitu seperti “D:\iReport-4.1.3\ireport\libs”.

4.     Selepas itu, anda perlu menambah file oracle jdbc (jar) ini melalui menu tools>Options> dan seterus tekan butang “Add Jar” untuk mencari fail oracle jdbc yang telah dimuaturun tadi.Ikut langkah sehingga selesai.







5.      Untuk memastikan anda sudah ada connection dengan oracle, anda boleh membina satu laporan yang ringkas iaitu melalui menu File > New >Select Template Report >Report Name (path) > Query.Anda perlu membina connection baru dengan klik pada butang “New” > Database JDBC connection >Next> dan pilihan senarai nama driver oracle (warna hitam). Jika senarai warna merah bermaksud belum ada fail driver lagi:


6.       Seterusnya,masukkan maklumat untuk akses ke oracle seperti berikut :-








7.       Sila tekan butang  “test” connection untuk menguji sama ada connection ke oracle berjaya atau tidak dan ikuti langkah hingga selesai.

8.       Seterusnya anda sudah boleh membina laporan yang mana data diakses daripada pangkalan data oracle.

9.       Fail yang disimpan dibawah aplikasi iReport adalah (.jrxml) dan ia boleh dibaca melalui web server apache untuk dipaparkan di web . Sila ikut langkah seterusnya.


LANGKAH 2: INSTALASI XAMPP ADD ON TOMCAT.
1.       Selepas proses download selepas,anda perlu membuat langkah setup seperti biasa

2.       Jika anda sudah mempunyai aplikasi Xampp versi lain yang dipasang sebelum ini anda perlu meletakkan xampp baru di directori yang berlainan dan pastikan servis xampp yang terdahulu dimatikan agar tidak konflik.

3.       Selepas memasang XAMP versi ini, ada dua servis utama perlu di ‘run’kan semasa menjalan sistem aplikasi anda iaitu ‘apache_start’ dan ‘catalina_start’. Kedua-dua servis ini perlu dihidupkan.






LANGKAH 3: KONFIGURASI XAMPP TOMCAT DENGAN JASPER REPORT.
Berikut merupakan konfigurasi web server dengan jasper report. Sila ikuti langkah yang di bawah :-
1.       Stop tomcat & Apache web server
2.       Salin D:\iReport-4.1.3\ireport\modules\ext ke dalam JAVA_HOME/jre/lib/ext/.
3.       Salin D:\iReport-4.1.3\ireport\modules\ext ke dalam xampp\tomcat\webapps\JavaBridge\WEB-INF\lib
4.       Salin folder java yang terdapat dalam xampp\tomcat\webapps\JavaBridge ke D:\xampptomcat\xampp\htdocs\apps_folder
5.       Salin folder  \xampp\tomcat\webapps\JavaBridge ke D:\xampptomcat\xampp\htdocs\apps_folder
6.       Restart tomcat and apache.

LANGKAH 4: MENCUBA UNTUK MENJANA REPORT JASPER DARI XAMPP
Berikut merupakan langkah-langkahnya :-
1.       Anda perlu menghasilkan satu laporan menggunakan iReport dan simpan dalam mana direktori (default dalam folder libs)
2.       Setelah kompilkan report tersebut anda salin fail *.jrxml tadi ke dalam folder apps root di bawah (www/htdocs). Contoh saya letakkan nama folder jasper.
3.       Seterusnya bangunkan aturcara untuk memanggil fail dan savekan file ini (php) . Contohnya adalah seperti berikut :

4.1 MENJANA LAPORAN TANPA PARAMETER (save : oracledbwithoutparam.php)


<?php

/**
 * see if the java extension was loaded.
 */
function checkJavaExtension()
{
    if(!extension_loaded('java'))
    {
        $sapi_type = php_sapi_name();
        $port = (isset($_SERVER['SERVER_PORT']) && (($_SERVER['SERVER_PORT'])>1024)) ? $_SERVER['SERVER_PORT'] : '8088';
        print   $port;
        if ($sapi_type == "cgi" || $sapi_type == "cgi-fcgi" || $sapi_type == "cli")
        {
            if(!(PHP_SHLIB_SUFFIX=="so" && @dl('java.so'))&&!(PHP_SHLIB_SUFFIX=="dll" && @dl('php_java.dll'))&&!(@include_once("java/Java.inc"))&&!(require_once("http://127.0.0.1:$port/java/Java.inc")))
            {
                return "java extension not installed.";
            }
        }
        else
        {
            if(!(@include_once("java/Java.inc")))
            {
                require_once("http://localhost:8088/JavaBridge/java/Java.inc");
            }
        }
    }
    if(!function_exists("java_get_server_name"))
    {
        return "The loaded java extension is not the PHP/Java Bridge";
    }

    return true;
}

/**
 * convert a php value to a java one...
 * @param string $value
 * @param string $className
 * @returns boolean success
 */ 
function convertValue($value, $className) 
    // if we are a string, just use the normal conversion 
    // methods from the java extension... 
    try  
    { 
        if ($className == 'java.lang.String') 
        { 
            $temp = new Java('java.lang.String', $value); 
            return $temp; 
        } 
        else if ($className == 'java.lang.Boolean' || 
            $className == 'java.lang.Integer' || 
            $className == 'java.lang.Long' || 
            $className == 'java.lang.Short' || 
            $className == 'java.lang.Double' || 
            $className == 'java.math.BigDecimal') 
        { 
            $temp = new Java($className, $value); 
            return $temp; 
        } 
        else if ($className == 'java.sql.Timestamp' || 
            $className == 'java.sql.Time') 
        { 
            $temp = new Java($className); 
            $javaObject = $temp->valueOf($value); 
            return $javaObject; 
        } 
    } 
    catch (Exception $err) 
    { 
        echo (  'unable to convert value, ' . $value . 
                ' could not be converted to ' . $className); 
        return false; 
    }
 
    echo (  'unable to convert value, class name '.$className. 
            ' not recognised'); 
    return false; 
}


checkJavaExtension();
$compileManager = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report = $compileManager->compileReport(realpath("report22.jrxml"));
$fillManager = new JavaClass("net.sf.jasperreports.engine.JasperFillManager");
$params = new Java("java.util.HashMap");

$c = new JavaClass("oracle.jdbc.driver.OracleDriver");
$d = $c->newInstance();
$dm = new JavaClass("java.sql.DriverManager");
$conn = $dm->getConnection("jdbc:oracle:thin:@localhost:1521:dbpekan","cmsadmin","root");
$jasperPrint = $fillManager->fillReport($report, $params, $conn);
$outputPath = realpath(".")."/"."output.pdf";
$exportManager = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$exportManager->exportReportToPdfFile($jasperPrint, $outputPath);

header("Content-type: application/pdf");
readfile($outputPath);

unlink($outputPath);

?>

















 4.2 MENJANA LAPORAN DENGAN PARAMETER (save : oracledbwithparam.php)

<?php

/**
 * see if the java extension was loaded.
 */
function checkJavaExtension()
{
    if(!extension_loaded('java'))
    {
        $sapi_type = php_sapi_name();
        $port = (isset($_SERVER['SERVER_PORT']) && (($_SERVER['SERVER_PORT'])>1024)) ? $_SERVER['SERVER_PORT'] : '8088';
        print   $port;
        if ($sapi_type == "cgi" || $sapi_type == "cgi-fcgi" || $sapi_type == "cli")
        {
            if(!(PHP_SHLIB_SUFFIX=="so" && @dl('java.so'))&&!(PHP_SHLIB_SUFFIX=="dll" && @dl('php_java.dll'))&&!(@include_once("java/Java.inc"))&&!(require_once("http://127.0.0.1:$port/java/Java.inc")))
            {
                return "java extension not installed.";
            }
        }
        else
        {
            if(!(@include_once("java/Java.inc")))
            {
                require_once("http://localhost:8088/JavaBridge/java/Java.inc");
            }
        }
    }
    if(!function_exists("java_get_server_name"))
    {
        return "The loaded java extension is not the PHP/Java Bridge";
    }

    return true;
}

/**
 * convert a php value to a java one...
 * @param string $value
 * @param string $className
 * @returns boolean success
 */ 
function convertValue($value, $className) 
    // if we are a string, just use the normal conversion 
    // methods from the java extension... 
    try  
    { 
        if ($className == 'java.lang.String') 
        { 
            $temp = new Java('java.lang.String', $value); 
            return $temp; 
        } 
        else if ($className == 'java.lang.Boolean' || 
            $className == 'java.lang.Integer' || 
            $className == 'java.lang.Long' || 
            $className == 'java.lang.Short' || 
            $className == 'java.lang.Double' || 
            $className == 'java.math.BigDecimal') 
        { 
            $temp = new Java($className, $value); 
            return $temp; 
        } 
        else if ($className == 'java.sql.Timestamp' || 
            $className == 'java.sql.Time')  
        { 
            $temp = new Java($className); 
            $javaObject = $temp->valueOf($value); 
            return $javaObject; 
        } 
    } 
    catch (Exception $err) 
    { 
        echo (  'unable to convert value, ' . $value .  
                ' could not be converted to ' . $className); 
        return false; 
    }
 
    echo (  'unable to convert value, class name '.$className. 
            ' not recognised'); 
    return false; 
}


checkJavaExtension();
$compileManager = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report = $compileManager->compileReport(realpath("report22.jrxml"));
$fillManager = new JavaClass("net.sf.jasperreports.engine.JasperFillManager");
$params = new Java("java.util.HashMap");

/* @send parameter from php to jasper */
$params->put("P_INVOICE_ID",  convertValue($_REQUEST["P_INVOICE_ID"], "java.lang.Long"));
$params->put("SUBREPORT_DIR",  "D:/work/php/n21eBusinessSuite/product/src/___reports/src");

$c = new JavaClass("oracle.jdbc.driver.OracleDriver");
$d = $c->newInstance();
$dm = new JavaClass("java.sql.DriverManager");
$conn = $dm->getConnection("jdbc:oracle:thin:@localhost:1521:dbpekan","cmsadmin","root");
$jasperPrint = $fillManager->fillReport($report, $params, $conn);
$outputPath = realpath(".")."/"."output.pdf";
$exportManager = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$exportManager->exportReportToPdfFile($jasperPrint, $outputPath);

header("Content-type: application/pdf");
readfile($outputPath);

unlink($outputPath);

?>




Seterusnya, anda boleh mencuba untuk menjana laporan dengan memasukkan alamat url seperti biasa iaitu :

http://localhost/jasper/ oracledbwithparam.php
http://localhost/jasper/ oracledbwithoutparam.php

Output janaan laporan adalah sepertidi bawah :-










Nota : Proses ini juga lebih kurang untuk menggunakan jasper report server dalam pembangunan laman web menggunakan java server pages.