Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Cari Blog Ini

06 Agustus 2009

scriptlet on iReport-nb-3.5.3

Kemarin tiba-tiba ada yang chat ke gtalk. Ternyata tujuannya mau tanya masalah iReport. Katanya mbak ini (ternyata mbak-mbak, kadung tak panggil pak), dia mo buat report yang menampilkan terbilang. Kebetulan saya emang pernah membuat iReport model seperti itu. Report seperti itu bisa dibuat dengan bantuan scriplet. Tinggal buat aja scriptlet yang berisi fungsi sayInWords(Number). Setelah "berdiskusi" ternyata si mbak pake ireport-nb-3.1.3. Wah apa tu? Pertama saya pikir itu merukapan add-on dari NetBean, menarik juga buat belajar integrasi netbean dan iReport. Setelah saya download dan mendapat ireport-nb-3.5.3, eh ternyata cuma iReport yang dibuat dengan dasar NetBean. Dibandingkan dengan iReport yang saya pakai, fungsi iReport-nb ini lebih sedikit. Tidak ada jendela scriptlet editor. Bahkan di versi 3.1.3 tidak ada fungsi compile report. Dari internet saya baca fungsi scriplet editor tidak diperlukan lagi karena diambil alih oleh NetBean yang merukapan Java IDE!


Jadi pertama ya buat dulu scriplet class via NetBean. Caranya? Gampang, buat aja new class dengan extends net.sf.jasperreports.engine.JRAbstractScriptlet
Nah ini yang beda dari iReport sebelumnya. Pada iReport yang saya pake biasanya extends nya ke it.businesslogic.ireport.IReportScriptlet. Pantas saja scriplet hasil compilan sebelumnya ga bisa di gunakan. Untuk referencenya gunakan file [Install-Folder]\iReport-nb-3.5.3\ireport\modules\com-jaspersoft-ireport.jar

Setelah scriplet di compile dan di jadikan jar, maka gunakan di report anda. Tambah classpath di iReport (Add Jar). Kemudian buka property report. Isikan nama class secara lengkap dengan package nya jika ada di property "Scriplet Class"


Compile untuk mengetahui error yang terjadi. Biasanya error yang muncul adalah class not found, yang muncul akibat masalah classpath. Setelah tidak ada error maka scriplet siap digunakan. Penggunaan scriplet bisa di lihat di posting saya ini.

Nah PR selanjutnya, saya ingin tau cara integrasi NetBean dan iReport ini.

17 komentar:

Anonim mengatakan...

Mas, saya lagi liat2 lagi artikel mas yg lain dan saya tertarik sama artikel mas yg ini. Saya masi nubie nh sama java. Jd, maaf mas klo pertanyaannya agak2 dudul. ^^"
Yg buat class dl itu dan buat jar-nya, itu new java class library bukan mas?
Lalu, saya ga ngerti di bagian ini mas:
"Setelah scriplet di compile dan di jadikan jar, maka gunakan di report anda. Tambah classpath di iReport (Add Jar)."
Nambah classpath di iReport itu seperti apa ya mas?
Thx buat jawabannya. :)


-angel-

Gue!Shindu mengatakan...

Maksudnya add classpath itu di menu classpath...saya lupa dimana itu (dah lama ga buka juga). Pokoknya biar jar yang baru kita buat itu bisa di panggil oleh iReport.

Sedang buad jar itu bener buat aja new class library

Anonim mengatakan...

saya ud ketemu mas u/ nambahin classpathnya. Tp kok masi java.lang.ClassNotFoundException ya? Scriplet Class di report properties diisi dengan nama class yg saya buat kan? Dan saya tdk menggunakan package, jd seharusnya nama class aja kan? atau ada tambahan lainnya?
Kalau sebelum nambah classpath, jar yg akan ditambahkan saya copy ke folder lain (dan saya add classpath dari jar yg sudah saya copy), apakah itu mempengaruhi?

-angel-

Gue!Shindu mengatakan...

Wah klo error nya class not found ya pastinya masalah di class path nya. Coba liat di scriptlet class nya, dia imports apa aja. Itu dimasukkan dalam classpath jg

Scriptlet class memang nama class aja. Klo ga pake package ya langsung aja.

Anonim mengatakan...

Saya uda tau mas salah di mana. Saya coba copy file scriplet yang .class ke directory yang ada file report yg saya buat (.jrxml) dan error itu uda ga muncul lg. Tp muncul error baru mas ketika saya jalankan report :(. Ini errornya:


Error filling print... Error evaluating expression :      Source text : $P{REPORT_SCRIPTLET}.terbilang("1234")
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :      Source text : $P{REPORT_SCRIPTLET}.terbilang("1234")      at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:257)      at net.sf.jasperreports.engine.fill.JRCalculator.evaluateEstimated(JRCalculator.java:565)      at net.sf.jasperreports.engine.fill.JRCalculator.estimateVariables(JRCalculator.java:169)      at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:788)      at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1425)      at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:112)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:911)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:814)      at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:251)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:898)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:561)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:986)  Caused by: java.lang.NoSuchMethodError: TerbilangScriplet.terbilang(Ljava/lang/String;)Ljava/lang/String;      at report32name_1269412354158_474589.evaluateEstimated(report32name_1269412354158_474589:576)      at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:246)      ... 13 more 

Itu kira2 error kenapa ya mas?

-angel-

Gue!Shindu mengatakan...

Error utamanya:

Caused by: java.lang.NoSuchMethodError: TerbilangScriplet.terbilang(Ljava/lang/String;)Ljava/lang/String; at report32name_1269412354158_474589.evaluateEstimated(report32name_1269412354158_474589:576)

coba cek di class scriptletnya

Anonim mengatakan...

Hmm..saya coba jalanin method yang saya buat di class scriplet ini dan bisa jalan sih mas. Kira2 salah di mana ya mas? Ini coding class scriplet saya:


public class TerbilangScriplet extends net.sf.jasperreports.engine.JRDefaultScriptlet{
public String terbilang(String bilangan){
String kalimat = "";
String subkalimat = "";
String kata1 = "";
String kata2 = "";
String kata3 = "";
int[] angka = new int[16];
String[] kata = {"nol", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan"};
String[] tingkat = {"", "ribu", "juta", "milyar", "triliun"};

for (int i = 1; i <16; i++){
angka[i] = 0;
}

// bil1 = bilangan.toString().split(",");

int panjang_bilangan = bilangan.length();

/* pengujian panjang bilangan */
if (panjang_bilangan > 15) {
kalimat = "Angka diluar batas";
}

/* mengambil angka-angka yang ada dalam bilangan,
dimasukkan ke dalam array */
for (int i = 1; i <= panjang_bilangan; i++) {
angka[panjang_bilangan - i + 1] = Integer.parseInt(bilangan.substring(i-1, i));
System.out.println("angka[" + i + "]: " + angka[panjang_bilangan - i + 1] + "");
}

int i = 1;
int j = 0;
// kalimat = "";

/* mengambil angka-angka yang ada dalam bilangan,
/* mulai proses iterasi terhadap array angka */
while (i <= panjang_bilangan) {
subkalimat = "";
kata1 = "";
kata2 = "";
kata3 = "";

/* untuk ratusan */
if (angka[i+2] != 0) {
if (angka[i+2] == 1) {
kata1 = " seratus";
} else {
kata1 = kata[angka[i+2]] + " ratus";
}
}
/* untuk puluhan atau belasan */
if (angka[i+1] != 0) {
if (angka[i+1] == 1) {
if (angka[i] == 0) {
kata2 = " sepuluh";
} else if (angka[i] == 1) {
kata2 = " sebelas";
} else {
kata2 = kata[angka[i]] + " belas";
}
} else {
kata2 = kata[angka[i+1]] + " puluh";
}
}

/* untuk satuan */
if (angka[i] != 0) {
if (angka[i+1] != 1) {
kata3 = kata[angka[i]];
}
}

/* pengujian angka apakah tidak nol semua,
lalu ditambahkan tingkat */
if ((angka[i] != 0) || (angka[i+1] != 0) || (angka[i+2] != 0)) {
subkalimat = kata1 + " " + kata2 + " " + kata3 + " " + tingkat[j] + " ";
}

/* gabungkan variabe sub kalimat (untuk satu blok 3 angka)
ke variabel kalimat */
kalimat = subkalimat + kalimat;
i = i + 3;
j = j + 1;

/* mengganti satu ribu jadi seribu jika diperlukan */
if ((angka[5] == 0) && (angka[6] == 0)) {
kalimat = kalimat.replace("satu ribu", "seribu");
}
}
return kalimat;
}
}

Gue!Shindu mengatakan...

dari codingnya sih bener, tp koq aneh nya bilang java.lang.NoSuchMethodError

bingung juga jadinya, mungkin scriptlet yg di input di report salah?

Anonim mengatakan...

iya mas. td waktu pertama kali saya kasi parameternya double. terus akhirnya saya ganti jadi string. tp di i-report belom refresh gitu. jd saya close i-reportnya dan saya buka lg, uda bisa jalan. :)
Thx mas ud mau bantuin. ^^
Btw, klo mau saya panggil reportnya dari program, kok jd error ya mas? class scripletny not found. gmn caranya u/ menjalankan dr program?
Coding saya kn seperti ini:

String path = System.getProperty("user.dir");
JasperReport report = JasperCompileManager.compileReport(path + "/dist/report/"
+ reportName + ".jrxml");
JasperPrint JPrint = JasperFillManager.fillReport(report, prs, conn);

Sepertinya ada yang harus ditambahkan ya kalau ada scriplet?

Gue!Shindu mengatakan...

Nah ini dia...
saya malah belum pernah mengintegrasikan di aplikasi.

Kemungkinan ya harus tambah referensi object scriptletnya. Saya pake ireport di JasperServer. Caranya upload reportnya, trus di upload jar nya. Klo buat aplikasi desktop mungkin seperti itu juga, harus tambah referensi scriptletnya.

Anonim mengatakan...

bisa mas!! kek yg mas bilang, tinggal tambahin library yg jar scriplet itu. Makasih banget ya mas! Jd belajar hal baru lg. Keep blogging mas! ^o^

-angel-

Gue!Shindu mengatakan...

Ya kita sama2 belajar. thx atas tambahan ilmu nya

Anonim mengatakan...

mas saya pake coding ini untuk pemanggilan report dari netbeans:

//Pemanggilan REPORT

private void cmdCetakActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Data data = new Data();
String SQL;

SQL = "SELECT * from mahasiswa";

try
{
DBConnection getCn = new DBConnection();
Connection cn = getCn.getConnection();
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(SQL);
Report rpt = new Report();
rpt.loadReport("mahasiswa.jrxml", rs, null);
rpt = null;
}
catch(SQLException e)
{
System.out.println(e.toString());
}

}



//Buatlah Kelas dengan nama Report.java
/**
* @author Pri
*/
import java.sql.*;
import java.io.*;
import java.util.*;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer.*;
import net.sf.jasperreports.view.JRViewer;
import javax.swing.*;
import java.awt.*;

public class Report extends javax.swing.JDialog{

public void loadReport(String fileName, ResultSet rs, HashMap hm)
{
try
{
File file = new File(".");
String absolutePath = file.getAbsolutePath();
String temp = absolutePath.replace(".","");
temp = temp.replace("\\", "/");
String reportFile = temp + "reports/" + fileName;

JasperPrint jasperPrint;
JRResultSetDataSource jrRS = new JRResultSetDataSource (rs);
JasperReport jasperReport = JasperCompileManager.compileReport(reportFile);
if(hm != null)
{
jasperPrint = JasperFillManager.fillReport (jasperReport, hm, jrRS);
}
else
{
jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrRS);
}
JRViewer aViewer = new JRViewer(jasperPrint);
JDialog viewer = new JDialog();
viewer.setTitle(".: Jasper Report :.");
viewer.setAlwaysOnTop(true);
viewer.getContentPane().add(aViewer);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
viewer.setBounds(0,0,screenSize.width, screenSize.height);
viewer.setVisible(true);
}
catch(JRException e)
{
JOptionPane.showMessageDialog(null, e.toString(),"Warning",JOptionPane.OK_OPTION);
}
}

public Report()
{

}
}



tapi gag kluar n kluarnya seperti ini :

20 Jul 10 9:34:45 org.apache.commons.digester.Digester error
SEVERE: Parse Error at line 2 column 408: Document root element "jasperReport", must match DOCTYPE root "null".
org.xml.sax.SAXParseException: Document root element "jasperReport", must match DOCTYPE root "null".

ini kira2 apanya yang salah???

Gue!Shindu mengatakan...

Rasanya itu error di struktur JRXML nya.Jadi mencoba parse JRXML gagal. Coba test di buka di iReport bisa ga?

Vermillion mengatakan...

mas kalo munculnya pesan "error creating sax parser"
itu kenapa ya?

nih email saya mas
punten, lagi mendesak banget
maulana.azis@gmail.com

mohon bantuannya, makasih

Gue!Shindu mengatakan...

@rumah TI
Dicoba link dibawah ini
http://www.jasperassistant.com/forum/topic/13586/error_creating_sax_parser?p3

Shikamaru Nara mengatakan...

nice information
Elemen solder uap